實驗二、作業調度類比實驗

來源:互聯網
上載者:User

標籤:

 

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 }

 

實驗二、作業調度類比實驗

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.