本程序排程演算法採用最高優先數優先的排程演算法(即把處理機分配給優先數最高的程序)。
通過模擬排程程序的
pcb塊來排程程序。程序的
pcb塊包含以下四方面的內容:
a) 程序標示符
b) 處理及狀態資訊
c) 程序排程資訊
d) 程序控制資訊
程序在執行中存在三種基本狀態,分別是執行狀態、就緒狀態和阻塞狀態。
主要的功能函式有:
排序函式:對就緒佇列裡面的程序根據優先順序進行排序。
阻塞函式:阻塞就緒佇列中(從前往後)優先順序相同的連續程序。
喚醒函式:將阻塞佇列中優先數最大且剩餘執行時間最小的程序調入就緒鍊錶首位。
執行函式:就是執行!
程式執行截圖:
輸入程序資訊
執行的第一次
執行的第14次(就緒佇列與阻塞佇列均存在程序)
程式執行結束
**已經加好了很細緻的注釋,在gcc環境下可直接執行:
#include #include #define getpch(type) (type*)malloc(sizeof(type))
//#define null 0
//定義pcb結構體
struct pcb
//定義3個pcb型別指標,其中:
*ready=null, //……"ready" 代表就緒佇列鍊錶首位位址
*p, //……"p" 代表當前正在執行的pcb位址
*bhead=null; //……"bhead" 代表阻塞鍊錶的首位位址
//把結構體pcb定義成乙個資料型別:pcb
typedef struct pcb pcb;
//排序函式:對就緒佇列裡面的程序根據優先順序進行排序
void sort()
else //否則嘛 ^_^
else //否則 0.0
}//如果沒有發生過插隊情況
if(insert==0) }}
//阻塞函式:阻塞就緒佇列中(從前往後)優先順序相同的連續程序
void block()else
} //判斷當就緒鍊錶中可阻塞程序大於0時
if(count>0)
}//喚醒函式:將阻塞佇列中優先數最大且剩餘執行時間最小的程序調入就緒鍊錶首位
void weakup()
else if((index->super)==(bhead->super))
}if(exchange==1)
prior=index; //"prior"向後移動一位(這裡之所以不使用"prior=prior->link"是因為執行交換位置操作時,prior的後繼位址將不為index)
index=index->link; //"index"向後移動一位
} }//將阻塞鍊錶首位的程序調到就緒列表首位
t=bhead->link;
bhead->link=ready;
ready=bhead;
bhead=t;
}//錄入程序資訊
void input()
}//獲取鍊錶長度(不用看,沒啥o用)
int space()
return(l);
}//顯示列名(不用看,沒啥o用)
void show()
//顯示指定程序的資訊
void disp(pcb*pr)
//顯示當前正在執行的程序和就緒佇列內程序的資訊
void check()
else }
pb=bhead;
if(pb==null)
else }
}//銷毀函式:銷毀當前正在執行的程序
void destroy()
//執行函式
void running()
else //否則啊 @.@
block(); //執行阻塞操作 }}
//主函式
void main()
printf("\n\n程序已經完成.\n");
ch=getchar();
}
作業系統用C語言模擬程序基於優先順序的排程程式
系統中有若干個程序,每個程序由程序控制塊 pcb 來標識。程序控制塊的內容有 程序名 鏈結指標 到達時間 執行時間 完成時間 程序優先數和程序狀態等。程序優先數為整數型,優先數小優先順序高。include include typedef struct pcb pcb pcb ready null,p...
短程序優先 SPF 排程演算法 C語言實現
include include define num 20 0 2 3 54 4 6 58 2 1 1 不包含同時到達情況 必須排除位置資訊!void print int a,int j int arr fin,arr turn,min w,min m 0,print f double arr ri...
程序的優先排程演算法的c語言實現
在程序中實現優先順序演算法可以使用最小堆排列來實現。一般在優先順序排程演算法中要實現的操作 1.從後備作業佇列中選擇乙個優先順序最高的作業將他們調入記憶體,分配必要的資源。此處的優先順序越高關鍵字越小 2.建立程序並且放入到後備作業佇列中 3,改變乙個程序的優先順序重新排列後備作業佇列的順序 此處的...