時間片輪轉

2021-10-01 03:18:34 字數 3381 閱讀 2608

時間片輪轉排程演算法,這種演算法是將程序控制塊按照進入就緒佇列的先後次序排成佇列。關於就緒佇列的操作就是從隊頭摘下乙個程序控制塊和從隊尾掛入乙個程序控制塊。

單處理器系統中程序控制塊分成乙個正在執行程序的程序控制塊、就緒程序的程序控制塊組織成的就緒佇列和等待程序的程序控制塊組成的等待佇列。由於實驗模擬的是程序排程,沒有對等待佇列的操作,所以實驗中只有乙個指向正在執行程序的程序控制塊指標和乙個就緒程序的程序控制塊佇列指標。

1.程序控制塊pcb
包括如下資訊:程序識別符號,程序狀態,程序每次申請的時間片大小,通用暫存器,程式計數器,程式狀態字暫存器,下乙個程序控制塊的位置。

其中通用暫存器與程式狀態字暫存器都設為0,程式計數器從0開始計數。

2.就緒佇列

包括如下資訊:整型程序控制塊頭位置標誌,整型程序控制塊尾位置標誌

全域性變數:就緒佇列ready,程序控制塊陣列pcbarea[n],空閒程序標識pfree,正在執行的程序標誌。

程序建立是乙個原語,因此在實驗中應該用乙個函式實現,程序建立的過程應該包括:

(1)申請程序控制塊:程序控制塊的數量是有限的,如果沒有空閒程序控制塊,則程序不能建立,如果申請成功才可以執行第二步;

(2)申請資源:除了程序控制塊外,還需要有必要的資源才能建立程序,如果申請資源不成功,則不能建立程序,並且歸還已申請的程序控制塊;如果申請成功,則執行第三步,實驗無法申請資源,所以模擬程式忽略了申請資源這一步;

(3)填寫程序控制塊:將該程序資訊寫入程序控制塊內,實驗中只有程序識別符號、程序狀態可以填寫,每個程序現場資訊中的暫存器內容由於沒有具體資料而使用程序(模擬程序建立時,需輸入程序識別符號字,程序識別符號本應系統建立,並且是惟一的,輸入時注意不要衝突),剛剛建立的程序應該為就緒態,然後轉去執行第四步;

(4)掛入就緒佇列:如果原來就緒佇列不為空,則將該程序控制塊掛入就緒佇列尾部,並修改就緒佇列尾部指標;如果原來就緒隊列為空,則將就緒佇列的頭指標、尾指標均指向該程序控制塊,程序建立完成。

**

// an highlighted block

#include

#include

#include

#include

#include

#define n 10

using namespace std;

//程序控制塊

typedef struct pcb

;//就緒佇列

struct ready

;ready ready;

pcb pcbarea[n]

;int pfree;

int y;

//正在執行的程序標誌

//初始化就緒佇列

void

chushi()

//建立程序

void

create

(int name, int time)

int i = pfree;

pfree = pcbarea[pfree]

.next;

pcbarea[i]

.name = name;

pcbarea[i]

.zhuangtai =

'w';

pcbarea[i].ax

=0; pcbarea[i].bx

=0; pcbarea[i].cx

=0; pcbarea[i].dx

=0; pcbarea[i].pc

=0; pcbarea[i]

.psw=0

; pcbarea[i]

.time = time;

//就緒佇列不空時,置入空閒佇列

if(ready.head !=-1

)//就緒佇列空時,置入就緒佇列

else

}//程序排程

void

diaodu

(int usetime)

y = ready.head;

ready.head = pcbarea[ready.head]

.next;

//就緒佇列頭指標後移

//就緒隊列為空

if(ready.head ==-1

) pcbarea[y]

.zhuangtai =

'r';

pcbarea[y].ax

++;pcbarea[y].bx

++;pcbarea[y].cx

++;pcbarea[y].dx

++;pcbarea[y].pc

++;pcbarea[y]

.psw++;

cout <<

"當前執行程式:"

<< endl;

cout <<

" 程序號:"

<< pcbarea[y]

.name << endl;

cout <<

" 程序狀態:"

<< pcbarea[y]

.zhuangtai << endl;

cout <<

" 暫存器ax:"

<< pcbarea[y].ax

<< endl;

cout <<

" 暫存器bx:"

<< pcbarea[y].bx

<< endl;

cout <<

" 暫存器cx:"

<< pcbarea[y].cx

<< endl;

cout <<

" 暫存器dx:"

<< pcbarea[y].dx

<< endl;

cout <<

" pc:"

<< pcbarea[y].pc

<< endl;

cout <<

" psw:"

<< pcbarea[y]

.psw

<< endl;

cout <<

<< pcbarea[y]

.time << endl;

system

("pause");

//若程序執行完畢,則**程序控制塊

if(pcbarea[y]

.time <= usetime)

else

}//若程序還沒執行完畢,放入就緒佇列,等下次的時間片

else

diaodu

(usetime)

;//繼續遞迴排程

}int main()

system

("cls");

diaodu

(usetime)

;return0;

}

[1] 湯小丹,梁紅兵,哲鳳屏,湯子瀛. 計算機作業系統. 第四版. 西安:西安電子科技大學出版社,2014. 98-111

時間片輪轉法

時間片輪轉法 round robin,rr 主要用於分時系統中的程序排程。為了實現輪轉排程,系統把所有就緒程序按先入先出的原則排成乙個佇列。新來的程序加到就緒佇列末尾。每當執行程序排程時,程序排程程式總是選出就緒佇列的隊首程序,讓它在 cpu上執行乙個時間片的時間。時間片是乙個小的時間單位,通常為 ...

時間片輪轉演算法

include include include include include include includeusing namespace std 初始化程序池 初始化就緒佇列 rr演算法 struct pcb pcb string name,int atime,int rtime,char st...

程序排程 時間片輪轉

include include include typedef struct table node node creat void p2 next null return head 輸出函式 void print node head 對程序表按優先數從大到小排序 node insert node h...