一. 目的和要求
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 }
