項目要求:
設計一個允許n個進程並發運行的進程管理模擬系統。該系統包括有簡單的進程控制,其進程調度采用時間片輪轉算法。每個進程用一個PCB表示,其內容根據具體情況設置。各進程之間有一定的同步關系(可選)。系統在運行過程中應能顯示或打印各進程的狀態及有關參數的變化情況,以便觀察諸進程的運行過程及系統的管理過程。
時間片輪轉法(Round-Robin,RR)主要用於分時系統中的進程調度。為了實現輪轉調度,系統把所有就緒進程按先入先出的原則排成一個隊列。新來的進程加到就緒隊列末尾。每當執行進程調度時,進程調度程序總是選出就緒隊列的隊首進程,讓它在CPU上運行一個時間片的時間。時間片是一個小的時間單位,通常為10~100ms數量級。當進程用完分給它的時間片后,系統的計時器發出時鍾中斷,調度程序便停止該進程的運行,把它放入就緒隊列的末尾;然后,把CPU分給就緒隊列的隊首進程,同樣也讓它運行一個時間片,如此往復。
我們使用queue和priority_queue分別模擬就緒隊列run和阻塞隊列wait,每次CPU處理的即為就緒隊列run的隊頭。
pcb進程塊包含name-進程名;runtime-進程剩余時間;runedtime-占用CPU的總時間;killtime-單次占用CPU的時間;waitpoint-每次減時間片,當不大於0時將進程加入阻塞隊列;waittime-等待時長;
項目代碼:
1 #include<bits/stdc++.h>
2 using namespace std; 3
4 struct PCB{ 5 int name; 6 int runtime; 7 int runedtime; 8 int state; 9 int killtime; 10 int waitpoint; 11 int waittime; 12 }; 13
14 struct cmp{ 15 bool operator()(PCB a,PCB b){ 16 return a.waittime>b.waittime; 17 } 18 }; 19
20 int n=3,timeslice=5; 21
22 queue<PCB> run; 23
24 priority_queue<PCB,vector<PCB>,cmp> wait; 25
26 void Init(){ 27 srand((unsigned)time(NULL)); 28 for(int i=0;i<n;i++){ 29
30 PCB temp; 31 temp.name=i; 32 temp.runtime=rand()%20+1; 33 temp.runedtime=0; 34 temp.killtime=0; 35 temp.waitpoint=rand()%20+1; 36 temp.waittime=rand()%20+1; 37 //cout<<temp.runtime<<" "<<temp.waitpoint<<" "<<temp.waittime<<endl;
38 run.push(temp); 39 cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
40 <<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
41 temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl; 42 } 43 cout<<"以上為各進程初始參數"<<endl; 44 cout<<endl; 45 } 46
47 void Run(){ 48 while(run.size()>0||wait.size()>0){ 49 if(run.size()){ 50 PCB temp=run.front(); 51 run.pop(); 52 temp.waitpoint-=timeslice; 53 if(temp.waitpoint>0){//不阻塞
54 temp.runtime-=timeslice; 55 if(temp.runtime<=0){ 56 temp.killtime=temp.runtime+timeslice; 57 temp.runedtime=temp.runedtime+temp.killtime; 58 temp.runtime=0; 59
60 cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
61 <<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
62 temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl<<"進程"<<temp.name<<"已結束"<<endl; 63 } 64 else{ 65 temp.runedtime+=timeslice; 66 temp.killtime=timeslice; 67 run.push(temp); 68
69 cout<<"name "<<temp.name<<","<<"runtime="<<temp.runtime<<","<<"runedtime="
70 <<temp.runedtime<<","<<"killtime="<<temp.killtime<<","<<"waitpoint="<<
71 temp.waitpoint<<","<<"waittime="<<temp.waittime<<endl; 72 } 73 } 74 else{ 75 cout<<"進程"<<temp.name<<"產生阻塞"<<endl; 76 temp.waitpoint=100; 77 wait.push(temp); 78 } 79 } 80 while(wait.size()){ 81 PCB temp; 82 temp=wait.top(); 83 wait.pop(); 84 temp.waittime-=timeslice; 85 if(temp.waittime>0){ 86 wait.push(temp); 87 break; 88 } 89 else{ 90 cout<<"進程"<<temp.name<<"即將被喚醒"<<endl; 91 run.push(temp); 92 } 93 } 94 cout<<endl; 95 } 96 cout<<endl<<endl<<endl<<"***********END***********"<<endl; 97 cout<<"****Designed by Kiven****"<<endl; 98 } 99
100 int main(){ 101 ios::sync_with_stdio(false); 102 Init(); 103 Run(); 104 return 0; 105 }
