資源簡介
(1)假定系統有5個進程,每個進程用一個PCB來代表。PCB的結構為:
?進程名——如P1~P5。
?指針——按優先數的大小把5個進程連成隊列,用指針指出下一個進程PCB的首地址。
?要求運行時間——假設進程需要運行的單位時間數。
?優先數——賦予進程的優先數,調度時總是選取優先數大的進程先執行。
?狀態——假設兩種狀態:就緒和結束,用R表示就緒,用E表示結束。初始狀態都為就緒狀態。
(2) 開始運行之前,為每個進程確定它的“優先數”和“要求運行時間”。通過鍵盤輸入這些參數。
(3) 處理器總是選擇隊首進程運行。采用動態改變優先數的辦法,進程每運行1次,優先數減1,要求運行時間減1。
(4) 進程運行一次后,若要求運行時間不等于0,則將它加入就緒隊列,否則,將狀態改為“結束”,退出就緒隊列。
(5) 若就緒隊列為空,結束,否則轉到(3)重復。
代碼片段和文件信息
#include
#include
#include
int?global_time?=?0;//全局時間?
struct?PCB{
????char?name[10];
????struct?PCB?*next;
????int?run_time;
????int?priority;
????char?status;
};
//定義結構體,包含五個屬性,名字,下一個PCB指針,運行時間,優先級,目前狀態?
void?initPCB(struct?PCB?*p?int?i){
????p->name[0]?=?‘P‘;
????p->name[1]?=?i?+?‘0‘;
????p->name[2]?=?0;
????p->next?=?NULL;
????printf(“Process?%s\n“?p->name);
????printf(“input?run_time:?“);
????scanf(“%d“?&p->run_time);
????printf(“input?priority:?“);
????scanf(“%d“?&p->priority);
????p->status?=?‘R‘;
}
//輸入任務名稱,?時間和優先級,運行狀態為E?
void?run(struct?PCB?*p){
????printf(“Process:?%s?running?@?tim?%d?priority?%d?run_time?%d\n“
???????????p->name?global_time?p->priority?p->run_time);
????global_time++;
????p->run_time--;
????p->priority--;
}//輸出這個任務的狀態,全局時間加1,任務還需要的時間減1,優先級減1?
int?main(){
????int?i;
????struct?PCB?*head?=?(struct?PCB?*)malloc(sizeof(struct?PCB));
????head->next?=?NULL;//定義頭節點,分配空間?目前鏈表中為空?
????struct?PCB?*p?=?NULL?*q?=?NULL;//定義?指針p和q,p為待運行隊列PCB指針,q為待插入隊列PCB指針?
????for(i?=?0;?i?5;?i++){
????????p?=?(struct?PCB?*)malloc(sizeof(struct?PCB));//分配空間,讓p指向這個
- 上一篇:AES s盒生成代碼
- 下一篇:G代碼經典解釋程序
評論
共有 條評論