操作系統實驗-使用動態優先權的進程調度算法的模擬-設計型

1.實驗目的

通過動態優先權算法的模擬加深進程概念和進程調度過程的理解,並學習撰寫規範的科學研究報告。

2.實驗內容和要求

1.對N個進程採用動態優先權算法的進程調度;
2.每個用來標識進程的進程控制塊PCB用結構描述,包括以下字段:進程標識數ID,進程優先數PRIORITY,進程以佔用的CPU時間CPUTIME,進程還需佔用的CPU時間ALLTIME,進程狀態STATE等。
3.優先數改變的原則:進程在就緒隊列中呆一個時間片,優先數增加1,進程每運行一個時間片優先數減3。
4.設置調度前的初始狀態。
5.將每個時間片內的進程情況顯示出來。

3.流程圖

在這裏插入圖片描述

4.源程序

5.實驗步驟與調試

1.定義Process結構體

struct Process{
	int id;
	int priority;
	int cputime;//程序已經佔用的cpu時間
	int alltime;//程序還需要佔用的cpu時間
	int startblock;//程序運行超過startblock時間片後進入阻塞狀態
	int blocktime;//程序再等待blocktime時間片後從block狀態進入ready狀態
	State state;//定義枚舉數組,enum State{ready,block,done};
};

2.定義print()函數
print()函數要輸出的有:當前時間片內的ready進程隊列、block進程隊列、每個進程的PCB字段。

void print(){
	cout<<"ready queue:";
	for(int i=0;i<3;i++){
		if(ready==process[i].state)
		{
			cout<<"->"<<process[i].id;	
		}
	}
	
	cout<<endl;
	cout<<"blocked queue:"<<endl;
	for(int i=0;i<3;i++)
	{
		if(block==process[i].state)
		{
			cout<<"->"<<process[i].id;
		}
	}
	cout<<endl;
	cout<<"id |\t priority |\t cputime |\t alltime |\t startblock |\t blocktime |\t state"<<endl;
	for(int i=0;i<3;i++)
	{
		cout<<process[i].id<<"|"<<"\t\t"<<process[i].priority<<"|"<<"\t\t"<<process[i].cputime<<"|"<<"\t\t"<<process[i].alltime<<"|"<<"\t\t"<<process[i].startblock<<"|"<<"\t\t"<<process[i].blocktime<<"|"<<"\t\t"<<process[i].state<<endl;
	}
}

3.定義main()函數
main()函數中,首先給出三個進程的PCB字段信息,即定義process0、1、2。
初始時間片slicetime設置爲0,當有進程的process.alltime不爲0,即還有進程需要佔用CPU,則執行while循環。用array[]數組來保存各個進程的優先級,用max_element(array,array+3)來返回最大優先級對應的process地址。每次循環找優先級最高的進程,執行後該進程優先級-3,其餘ready狀態進程優先級+1。其他PCB信息也隨之改變。print()函數輸出此時間片的各進程信息,進入下一個時間片。程序執行到所有進程的alltime爲0結束。

4.初始狀態三個進程的PCB信息
在這裏插入圖片描述

程序運行過程中遇到的問題
剛開始運行程序的時候,發現每一個時間片都輸出了3次,然後每一次只改變了1個進程的PCB信息,但是理想輸出應該是每個時間片輸出1次,每次輸出3個進程的PCB改變信息,後面調試發現,print()函數在循環中的位置放錯了,改正後程序運行的時間片數slicetimes 爲6,而3個進程的alltime總和也爲6,符合預期。

運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章