天天看點

作業系統之程序排程模拟程式設計(基于時間片輪轉)執行個體demo算法

執行個體demo

  1. 假定系統中有3個程序,每一個程序用一個程序控制塊PCB來代表,程序控制塊的格式為:
    作業系統之程式排程模拟程式設計(基于時間片輪轉)執行個體demo算法
    其中,
    • 程序名——作為程序的辨別,假設三個程序的程序名分别為P1,P2,P3 。
    • 指針——按優先數的大小把三個程序連成隊列,用指針指出下一個程序的程序控制塊的首位址,最後一個程序中的指針為“0”。
    • 要求運作時間——假設程序需要運作的機關時間數。
    • 優先數——賦予程序的優先數,排程時總是選取優先數大的程序先執行。
    • 狀态——可假設有兩種狀态,“就緒”狀态和“結束”狀态。三個程序的初始狀态都為“就緒”,用“R”表示,當一個程序運作結束後,它的狀态為“結束”,用“E”表示。
  2. 在每次運作你所設計的處理器排程程式之前,為每個程序任意确定它的“要求運作時間”。
  3. 為了排程友善,把三個程序按給定的優先數從大到小連成隊列。用一單元指出隊首程序,用指針指出隊列的連接配接情況。
  4. 處理器排程總是選擇标志單元訓示的程序運作。由于本實驗是模拟處理器排程的功能,是以,對被選中的程序并不實際的啟動運作,而是執行:

    要 求 運 行 時 間 − c h i p 要求運作時間-chip 要求運作時間−chip

    來模拟程序的一次運作。

  5. 程序運作一次後,若要求運作時間 > > > 0,則再将它加入隊列 ;若要求運作時間 = 0,則把它的狀态修改成“結束”(E),且退出隊列。
  6. 若“就緒”狀态的程序隊列不為空,則重複上面(4)和(5)的步驟,直到所有程序都成為“結束”狀态。

算法

結果:
作業系統之程式排程模拟程式設計(基于時間片輪轉)執行個體demo算法
代碼:
#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;
 } 
           

繼續閱讀