資源簡介
進程是操作系統中最基本、最重要的概念,進程調度又是操作系統的核心模塊。本實驗要求學生獨立地編寫一個簡單的進程管理程序,其主要部分是進程調度。調度算法可由學生自行選擇,這里選用多級反饋隊列調度算法。
代碼片段和文件信息
#include????
#include????
#include?
typedef?struct?node???/*進程節點信息*/??
{???
char?name[20];???/*進程的名字*/??
int?prio;????/*進程的優先級*/??
int?round;????/*分配CPU的時間片*/??
int?cputime;???/*CPU執行時間*/??
int?needtime;???/*進程執行所需要的時間*/??
int?arrivetime; /*進程抵達的時刻*/
char?state;????/*進程的狀態,W--就緒態,R--執行態,F--完成態*/??
int?count;????/*記錄執行的次數*/??
struct?node?*next;??/*鏈表指針*/??
}PCB;???
typedef?struct?Queue??/*多級就緒隊列節點信息*/??
{???
PCB?*linkPCB;???/*就緒隊列中的進程隊列指針*/??
int?prio;????/*本就緒隊列的優先級*/??
int?round;????/*本就緒隊列所分配的時間片*/??
struct?Queue?*next;??/*指向下一個就緒隊列的鏈表指針*/??
}ReadyQueue;
???
PCB?*run=NULL*finish=NULL;?/*定義執行隊列和完成隊列*/??
ReadyQueue?*Head?=?NULL;?/*定義第一個就緒隊列*/??
int?num;?????/*進程個數*/??
int?ReadyNum;????/*就緒隊列個數*/??
void?Output();??????????/*進程信息輸出函數*/??
void?InsertFinish(PCB?*in);???????/*將進程插入到完成隊列尾部*/??
void?InsertPrio(ReadyQueue?*in);?????/*創建就緒隊列,規定優先數越大,優先級越低*/??
void?PrioCreate();?????????/*創建就緒隊列輸入函數,優先數等于就緒隊列所分配到的時間片,時間片越多,優先級越低*/??
void?GetFirst(ReadyQueue?*queue);?????/*取得某一個就緒隊列中的隊頭進程*/??
void?InsertLast(PCB?*inReadyQueue?*queue);???/*將進程插入到就緒隊列尾部*/??
void?ProcessCreate();????????/*進程創建函數*/??
void?RoundRun(ReadyQueue?*timechip);????/*時間片輪轉調度算法*/??
void?MultiDispatch();????????/*多級調度算法,每次執行一個時間片*/??
int?main(void)???
{
PrioCreate();?/*創建就緒隊列*/??
ProcessCreate();/*創建就緒進程*/?
Output();
printf(“\n\n開始調度\n“);
MultiDispatch();/*算法開始*/?
printf(“\n\n最終結果\n“);
Output();??/*輸出最終的調度序列*/??
return?0;???
}
void?Output()??/*進程信息輸出函數*/??
{
ReadyQueue?*print?=?Head;???
PCB?*p;???
printf(“進程名\t優先級\t抵達\tcpu分配\tcpu執行\t需要時間\t進程狀態\n“);???
while(print)???
{???
if(print?->linkPCB?!=?NULL)???
{???
p=print?->linkPCB;???
while(p)???
{???
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);??????
p?=?p->next;???
}???
}???
print?=?print->next;???
}???
p?=?finish;???/*進程指向完成隊列*/
while(p!=NULL)???
{???
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);????
p?=?p->next;???
}???
p?=?run;???/*進程指向執行隊列*/
while(p!=NULL)???
{???
printf(“%s\t%d\t%d\t%d\t%d\t%d\t\t%c\n“p->namep->priop->arrivetimep->roundp->cputimep->needtimep->state);????
p?=?p->next;???
}???
}
??
void?PrioCreate()?/*創建就緒隊列*/??
{
ReadyQueue?*q;???
int?i;??
printf(“輸入就緒隊列的個數:\n“);???
scanf(“%d“&ReadyNum);?????
printf(“輸入每個就緒隊列分配的CPU時間片:\n“);???
for(i?=?0;i? {
if((q?=?(ReadyQueue?*)malloc(sizeof(ReadyQueue)))==NULL)???
{
perror(“malloc“);???
exit(1);???
}
scanf(“%d“&(q->round));??/*輸入此就緒隊列中給每個進程所分配的CPU時間片*/??
q?->prio?=?q->round;??/*設置其優先級,時間片越高,其優先級越低*/??
q?->linkPCB?=?NULL;????/*初始化其連接的進程隊列為空*/??
q?->next?=?NULL;
InsertPrio(q);?????/*按照優先級從高到低,建立多個就緒隊列*/??
}???
}?
void?InsertPrio(ReadyQueue?*in)??/*創建就緒
評論
共有 條評論