標籤:
13物聯網 201306104112 徐劍鋒
一、 實驗目的
(1)加深對作業調度演算法的理解;
(2)進行程式設計的訓練。
二、 實驗內容和要求
用進階語言編寫一個或多個作業調度的類比程式。
單道批處理系統的作業發送器。作業一投入運行,它就佔有電腦的一切資源直到作業完成為止,因此調度作業時不必考慮它所需要的資源是否得到滿足,它所啟動並執行時間等因素。
作業調度演算法:
1) 採用先來先服務(FCFS)調度演算法,即按作業到達的先後次序進行調度。總是首先調度在系統中等待時間最長的作業。
2) 短作業優先 (SJF) 調度演算法,優先調度要求已耗用時間最短的作業。
3) 響應比高者優先(HRRN)調度演算法,為每個作業設定一個優先權(響應比),調度之前先計算各作業的優先權,優先數高者優先調度。RP (響應比)= 作業周轉時間 / 作業已耗用時間=1+作業等待時間/作業已耗用時間
每個作業由一個作業控制塊JCB表示,JCB可以包含以下資訊:作業名、提交(到達)時間、所需的已耗用時間、所需的資源、作業狀態、鏈指標等等。
作業的狀態可以是等待W(Wait)、運行R(Run)和完成F(Finish)三種之一。每個作業的最初狀態都是等待W。
2.1 類比資料的產生
1. 允許使用者指定作業的個數(2-24),預設值為5。
2. 允許使用者選擇輸入每個作業的到達時間和所需已耗用時間。
3. (**)從檔案中讀入以上資料
4. (**)也允許使用者選擇通過偽隨機數指定每個作業的到達時間(0-30)和所需已耗用時間(1-8)。
2.2 類比程式的功能
1. 按照類比資料的到達時間和所需已耗用時間,執行FCFS, SJF和HRRN調度演算法,程式計算各作業的開始執行時間,各作業的完成時間,周轉時間和帶權周轉時間(周轉係數)。
2. 動態示範每調度一次,更新現在系統時刻,處於運行狀態和等待各作業的相應資訊(作業名、到達時間、所需的已耗用時間等)對於HRRN演算法,能在每次調度時顯示各作業的響應比R情況。
3. (**)允許使用者在類比過程中提交新作業。
4. (**)編寫並調度一個多道程式系統的作業調度類比程式。 只要求作業調度演算法:採用基於先來先服務的調度演算法。 對於多道程式系統,要假定系統中具有的各種資源及數量、調度作業時必須考慮到每個作業的資源要求。
2.3 類比資料結果分析
1. 對同一個類比資料各演算法的平均周轉時間,周轉係數比較。
2. (**)用曲線圖或直條圖表示出以上資料,分析演算法的優點和缺點。
2.4 其他要求
1. 完成報告書,內容完整,規格規範。
2. 實驗須檢查,回答實驗相關問題。
註:帶**號的條目表示選做內容。
三、 實驗方法、步驟及結果測試
1 #include<stdio.h> 2 #include<string.h> 3 #define J 100 4 typedef struct Tony{ 5 char name[50]; 6 int enter; 7 int start; 8 int run; 9 int finish; 10 int total; 11 float respond; 12 }t; 13 void fcf(t job[],int n) 14 { 15 int y,a,i,trick=0; 16 t jobtemp; 17 for(y=0;y<n;y++) 18 { 19 for(a=y+1;a<n;a++) 20 { 21 if(job[a].enter<job[y].enter) 22 { 23 strcpy(jobtemp.name,job[a].name); 24 strcpy(job[a].name,job[y].name); 25 strcpy(job[y].name,jobtemp.name); 26 jobtemp.enter=job[a].enter; 27 job[a].enter=job[y].enter; 28 job[y].enter=jobtemp.enter; 29 jobtemp.run=job[a].run; 30 job[a].run=job[y].run; 31 job[y].run=jobtemp.run; 32 } 33 } 34 } 35 for(y=0;y<n;y++) 36 { 37 if(job[y].enter<=trick) 38 job[y].start=trick; 39 else 40 job[y].start=job[y].enter; 41 trick=job[y].run+job[y].start; 42 job[y].finish=job[y].run+job[y].start; 43 job[y].total=job[y].finish-job[y].enter; 44 job[y].respond=(float)(job[y].total)/(float)(job[y].run); 45 } 46 printf("\n\nJesus! you‘ve finished FCFS,congratulations!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 47 for(i=0;i<n;i++) 48 { 49 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 50 } 51 } 52 void hrr(t job[],int n) 53 { 54 int i,s; 55 int now=0; 56 t jobtemp; 57 for(s=0;s<n;s++) 58 { 59 for(i=s+1;i<n;i++) 60 { 61 if((job[s].enter>job[i].enter)||((job[s].enter==job[i].enter)&&(job[s].run<job[i].run))) 62 { 63 strcpy(jobtemp.name,job[s].name); 64 strcpy(job[s].name,job[i].name); 65 strcpy(job[i].name,jobtemp.name); 66 jobtemp.enter=job[s].enter; 67 job[s].enter=job[i].enter; 68 job[i].enter=jobtemp.enter; 69 jobtemp.run=job[s].run; 70 job[s].run=job[i].run; 71 job[i].run=jobtemp.run; 72 } 73 } 74 } 75 for(s=0;s<n;s++) 76 { 77 if(job[s].enter<=now) 78 job[s].start=now; 79 else 80 job[s].start=job[s].enter; 81 now=job[s].start+job[s].run; 82 job[s].finish=now; 83 job[s].total=job[s].finish-job[s].enter; 84 job[s].respond=(float)(job[s].total)/(float)(job[s].run); 85 } 86 printf("\n\nGoddamn it! hrr complete,excellent job!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n"); 87 for(i=0;i<n;i++) 88 { 89 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish); 90 } 91 } 92 void secon(t job[],int n) 93 { 94 int d,s,i,now=0; 95 t jobtemp; 96 for(d=0;d<n;d++) 97 { 98 for(s=d+1;s<n;s++) 99 {100 if((job[d].run>=job[s].run)&&(job[d].enter>=job[s].enter))101 {102 strcpy(jobtemp.name,job[d].name);103 strcpy(job[d].name,job[s].name);104 strcpy(job[s].name,jobtemp.name);105 jobtemp.enter=job[d].enter;106 job[d].enter=job[s].enter;107 job[s].enter=jobtemp.enter;108 jobtemp.run=job[d].run;109 job[d].run=job[s].run;110 job[s].run=jobtemp.run;111 }112 }113 }114 for(d=0;d<n;d++)115 {116 if(job[d].enter<=now)117 job[d].start=now;118 else119 job[d].start=job[d].enter;120 now=job[d].start+job[d].run;121 job[d].finish=now;122 job[d].total=job[d].finish-job[d].enter;123 job[d].respond=(float)(job[d].total)/(float)(job[d].run);124 }125 printf("\n\nJesus! you‘ve finished SJF,well done!!\nname\tenter\tstart\trun\ttotal\trespond\tfinish\n");126 for(i=0;i<n;i++)127 {128 printf("%s\t%d\t%d\t%d\t%d\t%.3f\t%d\n",job[i].name,job[i].enter,job[i].start,job[i].run,job[i].total,job[i].respond,job[i].finish);129 }130 }131 main()132 {133 t job [J];134 int n,i,w;135 printf("The copyright is mine-Tony Chan,do not be a copycat,thx!\n\n now just enjoy the fascinating C#project~~\n\n");136 printf("enter the quantity of the array: ");137 scanf("%d",&n);138 printf("please input na en run respectively :-) \n");139 for(i=0;i<n;i++)140 {141 printf("this is NO.%d\n",i+1);142 scanf("%s",&job[i].name);143 scanf("%d",&job[i].enter);144 scanf("%d",&job[i].run);145 }146 printf("Now you got %d job(s)\n",n);147 printf("name\tenter\trun\n");148 for(i=0;i<n;i++)149 {150 printf("%s\t%d\t%d\n",job[i].name,job[i].enter,job[i].run);151 }152 do{153 printf("\n\nWhich methods you are eager to choose ? :-) \n 1.fcf 2.hrr 3.secon (pressing other number means quit)\n");154 scanf("%d",&w);155 switch(w)156 {157 case 1:158 fcf(job,n);159 break;160 case 2:161 hrr(job,n);162 break;163 case 3:164 secon(job,n);165 break;166 default:167 w=0;168 break;169 }170 }while(w);171 }
實驗二、作業調度類比實驗