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,符合預期。
運行結果