執行個體demo
- 假定系統中有3個程序,每一個程序用一個程序控制塊PCB來代表,程序控制塊的格式為: 其中,
作業系統之程式排程模拟程式設計(基于時間片輪轉)執行個體demo算法 - 程序名——作為程序的辨別,假設三個程序的程序名分别為P1,P2,P3 。
- 指針——按優先數的大小把三個程序連成隊列,用指針指出下一個程序的程序控制塊的首位址,最後一個程序中的指針為“0”。
- 要求運作時間——假設程序需要運作的機關時間數。
- 優先數——賦予程序的優先數,排程時總是選取優先數大的程序先執行。
- 狀态——可假設有兩種狀态,“就緒”狀态和“結束”狀态。三個程序的初始狀态都為“就緒”,用“R”表示,當一個程序運作結束後,它的狀态為“結束”,用“E”表示。
- 在每次運作你所設計的處理器排程程式之前,為每個程序任意确定它的“要求運作時間”。
- 為了排程友善,把三個程序按給定的優先數從大到小連成隊列。用一單元指出隊首程序,用指針指出隊列的連接配接情況。
-
處理器排程總是選擇标志單元訓示的程序運作。由于本實驗是模拟處理器排程的功能,是以,對被選中的程序并不實際的啟動運作,而是執行:
要 求 運 行 時 間 − c h i p 要求運作時間-chip 要求運作時間−chip
來模拟程序的一次運作。
- 程序運作一次後,若要求運作時間 > > > 0,則再将它加入隊列 ;若要求運作時間 = 0,則把它的狀态修改成“結束”(E),且退出隊列。
- 若“就緒”狀态的程序隊列不為空,則重複上面(4)和(5)的步驟,直到所有程序都成為“結束”狀态。
算法
結果:
代碼:
#include<bits/stdc++.h>
using namespace std;
//:程序辨別ID、程序優先數PRIORITY(并規定優先數與優先權成正比)、
//時間片數CHIP、程序已經占用CPU的時間CPUTIME,
//程序還需要運作的時間ALLTIME(當程序運作完畢時,其值為0)、程序的狀态STATE(為簡化起見
typedef struct node{
int id; // 程序辨別(用程序id)
int runtime;//程序已經占用CPU的時間
char state; //程序的狀态(運作E(excecuting)、就緒R(ready)和完成F(finish)
}process;
vector <process> que; //程序隊列
int sum;//程序的個數
int chip;//時間片數
char *names[]={"id", "runtime","state"};
int finish;//程序完成的個數
void init()
{
finish = 0;
for(int i=0;i<sum;i++)
{
process x;
x.id = i; //程序的序号即為該程序的辨別符
x.runtime = rand()%2+1; //程序的運作時間由系統任意給出
x.state = 'R'; //程序預設為就緒狀态
que.push_back(x);//将該程序置入就緒隊列中
}
}
void output()
{
cout<<"******************各個程序的PCB*******************"<<endl<<endl;
for(int i=0;i<sum;i++)
{
cout<<setiosflags(ios::left)
<<setw(9)<<names[0]
<<resetiosflags(ios::right)
<<setw(7)<<que[i].id;
}
cout<<endl;
for(int i=0;i<sum;i++)
{
cout<<setiosflags(ios::left)
<<setw(9)<<names[1]
<<resetiosflags(ios::right)
<<setw(7)<<que[i].runtime;
} //prior","runtime","state
cout<<endl;
for(int i=0;i<sum;i++)
{
cout<<setiosflags(ios::left)
<<setw(9)<<names[2]
<<resetiosflags(ios::right)
<<setw(7)<<que[i].state;
} //prior","runtime","state
cout<<endl<<endl;
}
// 根據時間片輪轉,按順序執行就緒隊列裡面的程序
void work(){
//執行程序
vector<process>::iterator it = que.begin();
for(vector<process>::iterator iter = que.begin();iter!=que.end();iter++)
{
if((*iter).runtime == 0) continue;
cout<<"程序" <<(*iter).id<<"正在執行........."<<endl;
(*it).state = 'E'; //改變該程序的狀态為“執行”
(*iter).runtime -= chip ;// 該程序的的運作時間減 chip
if((*iter).runtime<=0) (*iter).runtime = 0;
output();
if((*iter).runtime<=0) {
(*iter).runtime = 0;
finish ++;
cout<<"程序" <<(*it).id<<"已經完成"<<endl;
(*it).state = 'F';
output();
break;
}
}
}
int main()
{
cout<<"請輸入要進行的程序的個數"<<endl;
cin>>sum;
cout<<"請輸入要輪轉的時間片數"<<endl;
cin>>chip;
init();
output();
while(1)
{
work();
if(finish == sum ) {
cout<<"所有程序都已經結束"<<endl;
break;
}
}
return 0;
}