1.1. 實驗目的算法
用高級語言完成一個進程調度程序,以加深對進程的概念及進程調度算法的理解。數據結構
1.2. 實驗要求併發
1.2.1例題:設計一個有 N個進程併發執行的進程調度模擬程序。編碼
進程調度算法:採用最高優先級優先的調度算法(即把處理機分配給優先級最高的進程)和先來先服務(若優先級相同)算法。spa
(1). 每一個進程有一個進程控制塊(PCB)表示。進程控制塊包含以下信息:進程名、優先級、到達時間、須要運行時間、已用CPU時間、進程狀態等等。設計
(2). 進程的優先級及須要的運行時間能夠事先人爲地指定,進程的運行時間以時間片爲單位進行計算。調試
(3). 每一個進程的狀態能夠是就緒 r(ready)、運行R(Running)、或完成F(Finished)三種狀態之一。code
(4). 就緒進程得到 CPU後都只能運行一個時間片。用已佔用CPU時間加1來表示。blog
(5). 若是運行一個時間片後,進程的已佔用 CPU時間已達到所須要的運行時間,則撤消該進程,若是運行一個時間片後進程的已佔用CPU時間還未達所須要的運行時間,也就是進程還須要繼續運行,此時應將進程的優先數減1(即下降一級),而後把它插入就緒隊列等待調度。隊列
(6). 每進行一次調度程序都打印一次運行進程、就緒隊列中各個進程的 PCB,以便進行檢查。
(7). 重複以上過程,直到所要進程都完成爲止。
1.2.2實驗題A:編寫並調試一個模擬的進程調度程序,採用「最高優先數優先」調度算法對N(N不小於5)個進程進行調度。
「最高優先級優先」調度算法的基本思想是把CPU分配給就緒隊列中優先數最高的進程。
(2). 動態優先數是指進程的優先數在建立進程時能夠給定一個初始值,而且能夠按必定規則修改優先數。例如:在進程得到一次CPU後就將其優先數減小1,而且進程等待的時間超過某一時限(2個時間片時間)時增長其優先數等。
根據指定的實驗課題:A(1),A(2),B(1)和B(2)
完成設計、編碼和調試工做,完成實驗報告。
注:帶**號的條目表示選作內容。
能夠選用Turbo C做爲開發環境。也能夠選用Windows下的VB,CB等可視化環境,利用各類控件較爲方便。自主選擇實驗環境。
#include<stdio.h> #include<stdlib.h> #include <conio.h> #include <string.h> //定義做業控制塊PCB struct Process { char name[10]; //進程名 char statu[20]; //狀態 int priority; //進程優先級 int arrivetime; //進程到達時間 int runningtime; //進程所需的運行時間 int usecputime; //已用CPU時間 int waittime; //等待的時間片次數 }; struct Process PCB[24]={0}; int Intput(Process *PCB,int n);//初始化 void Output(Process *PCB,int n); void Algorithm(Process *PCB,int n,int onetime);//算法 int isfinshed(Process *PCB,int n);//判斷是否所有做業都調度完成 int Find(Process *PCB,int n,int runtime);//找最高優先級且沒運行完的進程 int main(){ int m=0; int onetime; m=Intput(PCB,n); printf("請輸入一個時間片的時間:"); scanf("%d",&onetime); Algorithm(PCB,n,onetime); printf("\n"); return 0; } void Algorithm(Process *PCB,int n,int onetime) { int k=0; int i=0; int runtime=0; Output(PCB, n); do{ k=Find(PCB, n,runtime); PCB[k].priority--; PCB[k].usecputime++; if(PCB[k].priority<0) { PCB[k].priority=0; } if(PCB[k].usecputime*onetime>=PCB[k].runningtime) {strcpy(PCB[k].statu,"finished");} for(i=0;i<n;i++) { if(i==k) { PCB[i].waittime=0; } if(i!=k&&PCB[i].arrivetime<=runtime&&PCB[i].statu[0]!='f') { PCB[i].waittime++; if(PCB[i].waittime==2) { PCB[i].priority++; PCB[i].waittime=0; } } } Output(PCB, n); runtime++; }while(isfinshed(PCB, n)!=1); } int isfinshed(Process *PCB,int n)//判斷是否所有做業都調度完成 { int count=0; int i=0; for(;i<n;i++) { if(PCB[i].statu[0]=='f') count++; } if(count==n) { return 1; } return 0; } int Find(Process *PCB,int n,int runtime)//找最高優先級且沒運行完的進程 { int i=0; int MAX=0; int k=0; for(;i<n;i++) { if(PCB[i].arrivetime<=runtime&&PCB[i].statu[0]=='r'&&PCB[i].priority>MAX) { MAX=PCB[i].priority; k=i; } } return k; } int Intput(Process *PCB,int n)//初始化 { int i; printf("\n輸入進程數:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("\n輸入進程名:"); scanf("%s",&PCB[i].name); printf("\n輸入進程優先級:"); scanf("%d",&PCB[i].priority); printf("\n輸入進程到達時間:"); scanf("%d",&PCB[i].arrivetime); printf("\n輸入進程須要運行時間:"); scanf("%d",&PCB[i].runningtime); strcpy(PCB[i].statu,"ready"); PCB[i].usecputime=0; PCB[i].waittime=0; } return n; } void Output(Process *PCB,int n) { int i; printf("\n **************************************************"); printf("\n進程名"); printf(" 進程優先級"); printf(" 進程到達時間"); printf(" 進程所需的運行時間"); printf(" 已用CPU時間"); printf(" 狀態"); for(i=0;i<n;i++) { printf("\n%s",PCB[i].name); printf(" %d",PCB[i].priority); printf(" %d",PCB[i].arrivetime); printf(" %d",PCB[i].runningtime); printf(" %d",PCB[i].usecputime); printf(" %s",PCB[i].statu); } }
這個實驗和上一次的實驗有類似之處,不過我上一次的實驗算法沒有用到數據結構,因此此次實驗要從新編寫算法。一開始對數據結構不太熟悉,問了同窗,參考了別人的代碼,終於寫出來了,很是高興。經過此次實驗,使我對數據結構更加的熟悉,對進程的運行過程也有了深入的體會。