操作系統作業調度-操作系統


一、目的和要求


1. 實驗目的

(1)加深對作業調度算法的理解;

(2)進行程序設計的訓練。

2.實驗要求

    用高級語言編寫一個或多個作業調度的模擬程序。

    單道批處理系統的作業調度程序。作業一投入運行,它就占有計算機的一切資源直到作業完成為止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所運行的時間等因素。

     作業調度算法:

1) 采用先來先服務(FCFS)調度算法,即按作業到達的先后次序進行調度。總是首先調度在系統中等待時間最長的作業。

2) 短作業優先 (SJF) 調度算法,優先調度要求運行時間最短的作業。

3) 響應比高者優先(HRRN)調度算法,為每個作業設置一個優先權(響應比),調度之前先計算各作業的優先權,優先數高者優先調度。RP (響應比)= 作業周轉時間 / 作業運     行時間=1+作業等待時間/作業運行時間

    每個作業由一個作業控制塊JCB表示,JCB可以包含以下信息:作業名、提交(到達)時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。

    作業的狀態可以是等待W(Wait)、運行R(Run)和完成F(Finish)三種之一。每個作業的最初狀態都是等待W。

 

一、模擬數據的生成

1.允許用戶指定作業的個數(2-24),默認值為5。

2.允許用戶選擇輸入每個作業的到達時間和所需運行時間。

3.(**)從文件中讀入以上數據。

4. (**)也允許用戶選擇通過偽隨機數指定每個作業的到達時間(0-30)和所需運行時間(1-8)。

 

二、模擬程序的功能

1.按照模擬數據的到達時間和所需運行時間,執行FCFS, SJF和HRRN調度算法,程序計算各作業的開始執行時間,各作業的完成時間,周轉時間和帶權周轉時間(周轉系數)。

2.動態演示每調度一次,更新現在系統時刻,處於運行狀態和等待各作業的相應信息(作業名、到達時間、所需的運行時間等)對於HRRN算法,能在每次調度時顯示各作業的響應比R情況。

3.(**)允許用戶在模擬過程中提交新作業。

4. (**)編寫並調度一個多道程序系統的作業調度模擬程序。 只要求作業調度算法:采用基於先來先服務的調度算法。 對於多道程序系統,要假定系統中具有的各種資源及數量、調度作業時必須考慮到每個作業的資源要求。

 

三、模擬數據結果分析

1.對同一個模擬數據各算法的平均周轉時間,周轉系數比較。

2.(**)用曲線圖或柱形圖表示出以上數據,分析算法的優點和缺點。

 

四、實驗准備

序號 准備內容 完成情況
1 什么是作業? 作業是用戶提交給操作系統計算的一個獨立任務。
2 一個作業具備什么信息? 每個作業由一個作業控制塊JCB表示,JCB可以包含以下信息:作業名、提交(到達)時間、所需的運行時間、所需的資源、作業狀態、鏈指針等等。
3 為了方便模擬調度過程,作業使用什么方式的數據結構存放和表示?JCB 單個作業使用結構體,多個作業使用隊列。
4 操作系統中,常用的作業調度算法有哪些? 先來先服務(FCFS)算法,最短作業優先 (SJF)算法,最短剩余時間優先算法,最高響應比優先(HRRN)算法。
5 如何編程實現作業調度算法?  
6 模擬程序的輸入如何設計更方便、結果輸出如何呈現更好?  

 

五、其他要求

1.完成報告書,內容完整,規格規范。

2.實驗須檢查,回答實驗相關問題。

注:帶**號的條目表示選做內容。

 

二、實驗內容


    根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。

 

三、實驗環境


    可以采用TC,也可以選用Windows下的利用各種控件較為方便的VB,VC等可視化環境。也可以自主選擇其他實驗環境。

 

四、實驗原理及核心算法參考程序段

 

  1 #include <iostream>
  2 #include <string>
  3 using namespace std;
  4 
  5 struct time //時間的數據結構
  6 {
  7     int hour;
  8     int minute;
  9 };
 10 
 11 struct Job //作業
 12 {
 13     string jobname;   //作業名
 14     time intime;      //進入時間
 15     int runtime;      //作業估計運行時間
 16     time starttime;   //作業開始時間
 17     time endtime;     //作業結束時間
 18     int cycletime;    //作業周轉時間
 19     float cltime;     //作業帶權周轉時間
 20     bool haverun;      //是否已運行
 21 };
 22 
 23 float T=0;//作業平均周轉時間
 24 float W=0;//作業帶權平均周轉時間
 25 
 26 void showInput(Job job[],int &n)  //輸入提示
 27 {
 28     cout<<"請按作業進入時間先后順序輸入"<<endl;
 29     for(int i=0;i<n;i++)
 30     {
 31          printf("作業%d",i+1);
 32         printf("的作業名:");
 33         scanf("%s",&job[i].jobname);
 34         printf("作業進入時間:");
 35         scanf("%d:%d",&job[i].intime.hour,&job[i].intime.minute);
 36         printf("作業估計運行時間:");
 37         scanf("%d",&job[i].runtime);
 38         job[i].starttime.hour=0;
 39         job[i].starttime.minute=0;
 40         job[i].endtime.hour=0;
 41         job[i].endtime.minute=0;
 42         job[i].cycletime=0;
 43         job[i].cltime=0;
 44         job[i].haverun=false; //標記為未運行
 45         printf("\n");
 46     }
 47 }
 48 
 49 void Init(Job job[],int &n)//初始化
 50 {
 51     for(int i=0;i<n;i++)
 52     {
 53         job[i].starttime.hour=0;
 54         job[i].starttime.minute=0;
 55         job[i].endtime.hour=0;
 56         job[i].endtime.minute=0;
 57         job[i].cycletime=0;
 58         job[i].cltime=0;
 59         job[i].haverun=false; //標記為未運行
 60     }
 61     T=0;
 62     W=0;
 63 }
 64 
 65 void showTime(time time)    //顯示時間
 66 {
 67     cout<<time.hour<<":"<<time.minute;
 68 }
 69 int timeDiff(time t1,time t2)  //計算時間差,時間t1比t2大
 70 {
 71     return t1.hour*60+t1.minute-(t2.hour*60+t2.minute);
 72 }
 73 time timeAdd(time time,int addtime) //時間相加
 74 {
 75     time.hour+=addtime/60;
 76     time.minute+=addtime%60;
 77     if(time.minute>=60)
 78     {
 79         time.hour++;
 80         time.minute-=60;
 81     }
 82     return time;
 83 }
 84 bool comtime(time t1,time t2)//比較兩個時間的大小,第一個大就返回TRUE
 85 {
 86     if(t1.hour>t2.hour)
 87         return true;
 88     else if(t1.hour==t2.hour&&t1.minute>=t2.minute)
 89         return true;
 90     else
 91         return false;
 92 }
 93 
//菜單
void menu()
{
    printf("\n\n                 |*************** 作業調度 *************|\n");
    printf("                 |======================================|\n");
    printf("                 |            1.讀取作業                |\n");
    printf("                 |            2.偽隨機數產生器          |\n");
    printf("                 |            3.作業調度                |\n");
      printf("                 |            0.退出                    |\n");
    printf("                 |======================================|\n");
}

 

 94 void showResult(Job job[],int &n)  //顯示結果
 95 {
 96     cout<<"jobname\tintime\truntime\tsttime\tendtime\t周轉時間(分鍾)\t帶權周轉時間"<<endl;
 97 //    cout<<"*******************************************************************"<<endl;
 98     for(int i=0;i<n;i++)
 99     {
100         cout<<job[i].jobname<<"\t";
101         showTime(job[i].intime);
102         cout<<"\t"<<job[i].runtime<<"\t";
103         showTime(job[i].starttime);
104         cout<<"\t";
105         showTime(job[i].endtime);
106         cout<<"\t  "<<job[i].cycletime<<"\t\t  "<<job[i].cltime<<endl;
107     }
108     cout<<"作業平均周轉時間:T="<<T/(n*1.0)<<endl;
109     cout<<"作業帶權平均周轉時間:W="<<W/(n*1.0)<<endl;
110 }
111 
112 int minRuntime(Job job[],int &n,time &t) //找出作業中最短作業下標
113 {
114     int min=-1;
115     for(int i=0;i<n;i++)
116     {
117         if(job[i].haverun==false && comtime(t,job[i].intime)==true)
118         {
119             min=i;
120             break;
121         }    
122     }
123     for(int j=min+1;j<n;j++)
124         if(job[j].haverun==false && job[j].runtime<job[min].runtime && comtime(t,job[j].intime)==true)
125             min=j;
126     return min;
127 }
128 
129 
130 
131 int Firstintime(Job job[],int &n) //找出作業中最先到的
132 {
133     int min=-1;
134     for(int i=0;i<n;i++)
135     {
136         if(job[i].haverun==false)
137         {
138             min=i;
139             break;
140         }
141     }
142     for(int j=min+1;j<n;j++)
143         if(job[j].haverun==false && comtime(job[min].intime,job[j].intime))
144             min=j;
145     return min;
146 }
147 void FCFS(Job job[],int &n)//先來先服務作業調度
148 {
149     struct time t;
150     job[0].starttime.hour=job[0].intime.hour;
151     job[0].starttime.minute=job[0].intime.minute;
152     job[0].endtime=timeAdd(job[0].starttime,job[0].runtime);
153     job[0].haverun=true;
154     job[0].cycletime=timeDiff(job[0].endtime,job[0].intime);
155     job[0].cltime=job[0].cycletime*1.0/job[0].runtime;
156     T+=job[0].cycletime;
157     W+=job[0].cltime;
158     t=job[0].endtime;
159     while(Firstintime(job,n)!=-1)
160     {
161         int i=Firstintime(job,n);
162         if(comtime(job[i].intime,t))
163             job[i].starttime=job[i].intime;
164         else
165             job[i].starttime=t;
166         job[i].endtime=timeAdd(job[i].starttime,job[i].runtime);
167         job[i].haverun=true;
168         job[i].cycletime=timeDiff(job[i].endtime,job[i].intime);
169         job[i].cltime=job[i].cycletime*1.0/job[i].runtime;
170         T+=job[i].cycletime;
171         W+=job[i].cltime;
172         t=job[i].endtime;
173     }
174 }
175 void main()
176 {
177     printf("請輸入作業數:");
178     int n;   //作業數
179     cin>>n;
180     Job *job=new Job[n];
181     if(n<=0)
182     {
183         printf("輸入不合法!");
184         exit(-1);
185     }
186     else
187     {
188         showInput(job,n);
189         cout<<endl;
190         FCFS(job,n);
191         printf("先到先服務:\n");
192         showResult(job,n);
193         Init(job,n);
194     
195     }
196     system("pause");
197 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM