作業系統 實驗二 作業調度類比程式

來源:互聯網
上載者:User

標籤:

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

專業:商軟一班   姓名:賴新耀 學號: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(); }

 

作業系統 實驗二 作業調度類比程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.