天天看點

實驗三 程序排程模拟程式--作業系統

一.    目的和要求

1.1.           實驗目的

用進階語言完成一個程序排程程式,以加深對程序的概念及程序排程算法的了解。

1.2.           實驗要求

1.2.1例題:設計一個有 N個程序并發執行的程序排程模拟程式。

程序排程算法:采用最高優先級優先的排程算法(即把處理機配置設定給優先級最高的程序)和先來先服務(若優先級相同)算法。

(1).  每個程序有一個程序控制塊(PCB)表示。程序控制塊包含如下資訊:程序名、優先級、到達時間、需要運作時間、已用CPU時間、程序狀态等等。

(2).  程序的優先級及需要的運作時間可以事先人為地指定,程序的運作時間以時間片為機關進行計算。

(3).  每個程序的狀态可以是就緒 r(ready)、運作R(Running)、或完成F(Finished)三種狀态之一。

(4).  就緒程序獲得 CPU後都隻能運作一個時間片。用已占用CPU時間加1來表示。

(5).  如果運作一個時間片後,程序的已占用 CPU時間已達到所需要的運作時間,則撤消該程序,如果運作一個時間片後程序的已占用CPU時間還未達所需要的運作時間,也就是程序還需要繼續運作,此時應将程序的優先數減1(即降低一級),然後把它插入就緒隊列等待排程。

(6).  每進行一次排程程式都列印一次運作程序、就緒隊列中各個程序的 PCB,以便進行檢查。   

(7).  重複以上過程,直到所要程序都完成為止。

思考:作業排程與程序排程的不同?

1.2.2實驗題A:編寫并調試一個模拟的程序排程程式,采用“最高優先數優先”排程算法對N(N不小于5)個程序進行排程。

“最高優先級優先”排程算法的基本思想是把CPU配置設定給就緒隊列中優先數最高的程序。

(1). 靜态優先數是在建立程序時确定的,并在整個程序運作期間不再改變。

(2). 動态優先數是指程序的優先數在建立程序時可以給定一個初始值,并且可以按一定規則修改優先數。例如:在程序獲得一次CPU後就将其優先數減少1,并且程序等待的時間超過某一時限(2個時間片時間)時增加其優先數等。      
1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 #include<string.h>
  5 struct Pcb{
  6     int id;            //識别碼
  7     char* pname;    //程序名
  8     int priority;   //優先級
  9     int arrtime;    //到達時間
 10     int reqtime;    //運作時間
 11     int usetime;    //使用CPU時間
 12     char* statio;    //程序的狀态
 13 
 14 }   Pcb[24];
 15 int systime=0;
 16 
 17 
 18 //優先級排序
 19 void sort(int n ,int first)
 20 {
 21     int i,j; 
 22     struct Pcb temp;
 23     for(i=first;i<n;i++) 
 24     for(j=i+1;j<=n;j++) 
 25     if(Pcb[i].priority<Pcb[j].priority) //根據優先級排序
 26     { 
 27        temp=Pcb[i]; 
 28        Pcb[i]=Pcb[j]; 
 29        Pcb[j]=temp; 
 30     } 
 31 
 32 }
 33 
 34 void putresult(int n){
 35     int i;
 36 
 37 printf("\nid 程序名  程序優先級  程序到達時間 程序使用CPU時間  程序運作時間 程序狀态\n");
 38     for(i=1; i<=n; i++)
 39     {
 40        printf("%d%5s%10d%12d%12d%15d%17s\n",Pcb[i].id,Pcb[i].pname,
 41                                       Pcb[i].priority,Pcb[i].arrtime,
 42                                       Pcb[i].usetime,Pcb[i].reqtime,Pcb[i].statio);
 43     }
 44 
 45 
 46 }
 47 
 48 
 49 //僞随機數的産生資料
 50 int Pseudo_random_number()
 51 {
 52     int i,n;
 53     srand((unsigned)time(0));  //參數seed是rand()的種子,用來初始化rand()的起始值。
 54     //輸入程序數
 55     n=rand()%5+2;        
 56     for(i=1; i<=n; i++)
 57     {    //唯一識别碼
 58         Pcb[i].id=i;
 59         //程序名
 60         Pcb[i].pname="pcb";
 61         //程序優先級
 62         Pcb[i].priority=rand()%9+1;
 63         //程序到達時間
 64         Pcb[i].arrtime=rand()%29+1;
 65         //程序運作完成所需時間
 66         Pcb[i].reqtime=rand()%7+1;
 67         //程序使用CPU時間
 68         Pcb[i].usetime=0;
 69         //程序狀态
 70         Pcb[i].statio="ready";
 71 
 72     }
 73     putresult(n);
 74    
 75     return n;
 76 
 77 }
 78 
 79 
 80 //判斷是否有運作結束的程式
 81 
 82 int drop(int n ){
 83     int i=0;
 84     for(i=0;i<n;i++)
 85     {
 86         if(strcmp(Pcb[i].statio,"Finish")==0)
 87         {
 88         return i;
 89         }
 90     }
 91     
 92     return  100;
 93 
 94 }
 95 
 96 
 97 //進行CPU調用
 98 void CPURun(int n)
 99 {    int i;
100     
101         for(i=1;i<=n;i++)
102         {
103         while(Pcb[i].reqtime!=0){
104             Pcb[i].priority-=1;  //運作一次後,優先級-1
105             Pcb[i].reqtime-=1;    //運作一次後,所需時間-1
106             Pcb[i].usetime+=1;       //運作一次後,運作時間+1
107             Pcb[i].statio="Runing";     //運作一次後,運作狀态為Running        
108             
109             if(Pcb[i].reqtime==0){    
110                 Pcb[i].statio="Finish";
111                 putresult(n);
112             
113             }
114             sort(n,i);
115             putresult(n);
116             
117         }        
118             
119         }
120     
121         
122     
123     
124 
125     
126 
127 }
128 
129 
130 
131 main()
132 {
133 printf("\t\t\t\t随機産生程序\n");
134 int n=Pseudo_random_number();
135   printf("\t\t\t程序的個數為%d\n",n);
136     sort(n,1);
137 printf("\t\t\t進行優先級的排序\n");
138 
139 putresult(n);
140 CPURun(n);
141 
142 return 0;
143 }      

  

實驗三 程式排程模拟程式--作業系統
實驗三 程式排程模拟程式--作業系統
實驗三 程式排程模拟程式--作業系統