【操作系统】实验二 作业调度模拟程序
實驗二作業調度模擬程序
一、目的和要求
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 | 模擬程序的輸入如何設計更方便、結果輸出如何呈現更好? | ? |
?
二、實驗內容
根據指定的實驗課題,完成設計、編碼和調試工作,完成實驗報告。
三、實驗環境
可以采用TC,也可以選用Windows下的利用各種控件較為方便的VB,VC等可視化環境。也可以自主選擇其他實驗環境。
四、實驗原理及核心算法參考程序段
???? 單道FCFS算法:
????????
?
實驗效果圖:
?
源代碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> struct jcb{char name[10];//作業名float arrtime;//提交時間 float waitTime;//等待時間float startTime;//開始時間float reqtime;//運行時間 float finishTime;//完成時間float TAtime,TAWtime; //周轉時間,帶權周轉時間float rp;//響應比 };jcb order[100];void suanfa(int i,int y){float aveTAtime,aveTAWtime; //aveTAtime為平均周轉時間,aveTAWtime為平均帶權周轉時間float numTA=0,numTAW=0; //numTA記錄周轉時間總和,numTAW記錄帶權周轉時間總和for(i=0;i<y;i++){ order[0].startTime=order[0].arrtime; //初始化開始時間 order[i].finishTime=order[i].startTime+order[i].reqtime; //作業結束時間order[i+1].startTime=order[i].finishTime; //下一個作業的開始時間order[i].waitTime=order[i].startTime-order[i].arrtime; //作業等待時間order[i].TAtime=order[i].finishTime-order[i].arrtime; //計算周轉時間order[i].TAWtime=order[i].TAtime/order[i].reqtime; //計算帶權周轉時間numTA+=order[i].TAtime;numTAW+=order[i].TAWtime;} aveTAtime=numTA/y; //平均周轉時間aveTAWtime=numTAW/y; //平均帶權周轉時間printf("作業名 提交時間 開始時間 運行時間 結束時間 等待時間 周轉時間 帶權周轉時間\n");for(i=0;i<y;i++)printf("%s\t%.2f\t%.2f\t%4.2f\t%6.2f\t%7.2f\t%7.2f\t%8.2f\n\n",order[i].name,order[i].arrtime,order[i].startTime,order[i].reqtime,order[i].finishTime,order[i].waitTime,order[i].TAtime,order[i].TAWtime);// printf("%s\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n\n",order[i].name,order[i].arrtime,order[i].startTime,order[i].reqtime,order[i].finishTime,order[i].waitTime,order[i].TAtime,order[i].TAWtime);printf("平均周轉時間為:");printf("%.2f\n\n",aveTAtime);printf("平均帶權周轉時間為:");printf("%.2f\n\n",aveTAWtime);}void sort(float p,char *h,int i,int j) //設置一個用來排序的函數 { strcpy(h,order[i].name);strcpy(order[i].name,order[j].name);strcpy(order[j].name,h);p=order[i].arrtime;order[i].arrtime=order[j].arrtime;order[j].arrtime=p;p=order[i].reqtime;order[i].reqtime=order[j].reqtime;order[j].reqtime=p;p=order[i].startTime;order[i].startTime=order[j].startTime;order[j].startTime=p;p=order[i].finishTime;order[i].finishTime=order[j].finishTime;order[j].finishTime=p;}void FCFS(int y) //先來先服務算法 { float p;int i,j;char h[100];for(i=0;i<y;i++){for(j=i+1;j<y;j++){if(order[i].arrtime>order[j].arrtime){sort(p,h,i,j);}}}suanfa(i,y);}void SJF(int y) //短作業優先算法 {float p;int i,j;char h[100];for(i=0;i<y;i++) //先提交的作業先運行,后面來的作業再比較運行時間長短 {for(j=i+1;j<y;j++){if(order[i].arrtime>order[j].arrtime) //按提交時間來排序作業 {sort(p,h,i,j);}}}for(i=1;i<y;i++){for(j=i+1;j<y;j++){if(order[i].reqtime>order[j].reqtime) //比較后面來的作業的運行時間 {sort(p,h,i,j);}}}suanfa(i,y);}void HRRN(int y) //響應比高者優先算法 {int i,j;float aveTAtime,aveTAWtime,p;char h[100];for(i=0;i<y;i++) //先提交的作業先運行,后面來的作業再比較響應比的大小 {for(j=i+1;j<y;j++){if(order[i].arrtime>order[j].arrtime) //先把作業按提交時間來排序 {sort(p,h,i,j);}}}for(i=0;i<y;i++){ order[0].startTime=order[0].arrtime;order[i].finishTime=order[i].startTime+order[i].reqtime; //結束時間 order[i+1].startTime=order[i].finishTime;order[i].waitTime=order[i].startTime-order[i].arrtime; //等待時間order[i].TAtime=order[i].finishTime-order[i].arrtime; //周轉時間order[i].rp=order[i].TAtime/order[i].reqtime; //響應比 } for(i=1;i<y;i++){for(j=i+1;j<y;j++){if(order[i].rp<order[j].rp) //比較后面來的作業的響應比 {sort(p,h,i,j);p=order[i].rp;order[i].rp=order[j].rp;order[j].rp=p;}}} suanfa(i,y);for(i=1;i<y;i++){printf("%s的響應比為:%.2f\n",order[i].name,order[i].rp);}}void read(){int i=0;int x,y;printf("\t-----------------請選擇作業調度算法------------------\n\n");printf("\t\t1:采用先來先服務 (FCFS) 調度算法\n\t\t2:采用短作業優先 (SJF) 調度算法\n\t\t3:采用響應比高者優先 (HRRN) 調度算法\n\t\t4:退出程序\n");printf("\n請選擇算法:");scanf("%d",&i);if(i==4){exit(0);}if(i<=0||i>3) //判斷算法是否選擇正確 {printf("輸入有誤,請重新輸入\n");printf("請重新選擇算法:");scanf("%d",&i);}printf("請輸入作業個數:");scanf("%d",&y);for(i=0;i<y;i++){printf("\n第%d個作業:",i+1);printf("\n輸入作業名:");scanf("%s",&order[i].name);printf("提交作業時間:");scanf("%f",&order[i].arrtime);printf("CPU運行所需時間:");scanf("%f",&order[i].reqtime);}if(i==1){FCFS(y);}else if(i==2){SJF(y);}else if(i==3){HRRN(y);}}int main(){int i;for(i=0;i<100;i++){read();}return 0;}?
轉載于:https://www.cnblogs.com/skywalkersg/p/5394713.html
總結
以上是生活随笔為你收集整理的【操作系统】实验二 作业调度模拟程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实例 18错误输出信息与调试信息
- 下一篇: java信息管理系统总结_java实现科