標籤:
實驗二、作業調度類比程式
專業:商軟一班 姓名:賴新耀 學號:201406114129
一、目的和要求
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 |
一個作業具備什麼資訊? |
|
|
3 |
為了方便類比調度過程,作業使用什麼方式的資料結構存放和表示?JCB |
|
|
4 |
作業系統中,常用的作業調度演算法有哪些? |
|
|
5 |
如何編程實現作業調度演算法? |
|
|
6 |
類比程式的輸入如何設計更方便、結果輸出如何呈現更好? |
|
五、 其他要求
1. 完成報告書,內容完整,規格規範。
2. 實驗須檢查,回答實驗相關問題。
註:帶**號的條目表示選做內容。
二、實驗內容
根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。
三、實驗環境
可以採用TC,也可以選用Windows下的利用各種控制項較為方便的VB,VC等可視化環境。也可以自主選擇其他實驗環境。
四、實驗原理及核心演算法參考程式段
單道FCFS演算法:
實驗:
代碼:
#include <stdio.h>#include <stdlib.h>#define N 10void input();void output();void sort();void running();void fcfs();void sjf();int main(int argc, char *argv[]) { int n; input(); do{ printf("\t\t1:FCFS\n\t\t2:SJF\n\t\t0:退出\n"); printf("請選擇調度演算法:"); scanf("%d",&n); switch(n) { case 1:fcfs(); break; case 2:sjf(); break; case 0: break; }} while(n!=0); return 0; }struct JCB{ char name[10]; //作業名 float arrivetime; //作業開始時間 float runtime; //作業已耗用時間 float run; //開始時間 float finish; //完成時間 float T; //周轉時間 float W; //帶權周轉時間 }jcb[N],temp; int i,k,num,m,n;void input(){ int i;do{ printf("\n請輸入作業數:"); scanf("%d",&num); }while(0>=num||num>50);for(i=0;i<num;i++){ printf("第%d個作業名:",i+1); scanf("%s",&jcb[i].name); printf("請輸入開始時間:"); scanf("%f",&jcb[i].arrivetime); printf("請輸入要求服務時間:"); scanf("%f",&jcb[i].runtime); printf("\n"); }}void output(){ float numT=0,numW=0,avgT=0,avgW=0; printf("-----------------------------------------------------------------------\n"); printf(" 作業名 提交時間 已耗用時間 開始時間 完成時間 周轉時間 帶權周轉時間\n");for(i=0;i<num;i++){ printf(" %s %.2f %.2f %.2f %.2f %.2f %.2f",jcb[i].name,jcb[i].arrivetime,jcb[i].runtime,jcb[i].run,jcb[i].finish,jcb[i].T,jcb[i].W); printf("\n"); numT=numT+jcb[i].T; numW=numW+jcb[i].W; } printf("-----------------------------------------------------------------------\n"); avgT=numT/num; avgW=numW/num; printf("平均作業周轉時間:%.2f\n",avgT); printf("\n"); printf("平均帶權作業周轉時間:%.2f\n",avgW); printf("\n");}void sort() { int i,j; for(j=0;j<num;j++){ for(i=0;i<num-j-1;i++){ if(jcb[i].arrivetime>jcb[i+1].arrivetime) { temp=jcb[i]; jcb[i]=jcb[i+1]; jcb[i+1]=temp; } } } }void running(){ for(k=0;k<num;k++){ if(k==0){ jcb[k].run=jcb[k].arrivetime; jcb[k].finish=jcb[k].arrivetime+jcb[k].runtime; } else{if(jcb[k].arrivetime>=jcb[k-1].finish) { jcb[k].run=jcb[k].arrivetime; jcb[k].finish=jcb[k].arrivetime+jcb[k].runtime; } else { jcb[k].run=jcb[k-1].finish; jcb[k].finish=jcb[k-1].finish+jcb[k].runtime; } }} for(k=0;k<num;k++){ jcb[k].T=jcb[k].finish-jcb[k].arrivetime; jcb[k].W=jcb[k].T/jcb[k].runtime; }}void fcfs()//先來先服務{ sort(); running(); output();}void sjf()//短作業優先{ int next; float min; sort(); for(m=0;m<num;m++){ i=0; if(m==0){ jcb[m].finish=jcb[m].arrivetime+jcb[m].runtime; } else{ jcb[m].finish=jcb[m-1].finish+jcb[m].runtime;}for(n=m+1;n<num;n++){ if(jcb[n].arrivetime<=jcb[m].finish) i++; } min=jcb[m+1].runtime; next=m+1; for(k=m+1;k<i;k++){ if(jcb[k+1].runtime<min){ min=jcb[k+1].runtime; next=k+1; temp=jcb[m+1]; jcb[m+1]=jcb[next]; jcb[next]=temp; }else{ min=jcb[k+1].runtime; next=k; temp=jcb[k+1]; jcb[k+1]=jcb[next]; jcb[next]=temp; } }} running(); output(); }
作業系統 實驗二 作業調度類比程式