?? 優(yōu)先數(shù)調(diào)度.cpp
字號:
#include <stdio.h>
#define running 1 //用running表示進程處于運行態(tài)
#define aready 2 //用aready表示進程處于就緒態(tài)
#define blocking 3 //用blocking表示進程處于等待態(tài)
#define sometime 5 //用sometime表示時間片大小
#define n 10 //假定系統(tǒng)允許進程個數(shù)為
struct
{ int name; //進程標致符
int status; //進程狀態(tài)
int ax,bx,cx,dx; //進程現(xiàn)場信息,通用寄存器內(nèi)容
int pc; //進程現(xiàn)場信息,程序計數(shù)器內(nèi)容
int psw; //進程現(xiàn)場信息,程序狀態(tài)字寄存器內(nèi)容
int next; //下一個進程控制塊的位置
}pcbarea[n]; //模擬進程控制塊區(qū)域的數(shù)組
int PSW,AX,BX,CX,DX,PC,TIME; //模擬寄存器
int run; //定義指向正在運行進程的進程控制塊的指針
struct
{ int head;
int tail;
}ready; //定義就緒隊列的頭指針head和尾指針tail
int pfree; //定義指向空閑進程控制塊隊列的指針
void sheduling( ) //進程調(diào)度函數(shù)
{ int i;
if (ready.head==-1) //空閑進程控制塊隊列為空,退出
{ printf("無就緒進程\n");
return;
}
i=ready.head; //就緒隊列頭指針賦給i
ready.head=pcbarea[ready.head].next; //就緒隊列頭指針后移
if(ready.head==-1) ready.tail=-1; //就緒對列為空,修正尾指針ready.tail
pcbarea[i].status=running; //修改進程控制塊狀態(tài)
TIME=sometime; //設置相對時鐘寄存器
//恢復該進程現(xiàn)場信息:
AX=pcbarea[run].ax;
BX=pcbarea[run].bx;
CX=pcbarea[run].cx;
DX=pcbarea[run].dx;
PC=pcbarea[run].pc;
PSW=pcbarea[run].psw;
run=i; //修改指向運行的指針
}//進程調(diào)度函數(shù)結(jié)束
void create(int x)//創(chuàng)建進程
{ int i;
if(pfree==-1) //空閑進程控制塊隊列為空
{printf(" 無空閑進程控制塊,進程創(chuàng)建失敗\n");
return;
}
i=pfree; //取空閑進程控制塊隊列的第一個
pfree=pcbarea[pfree].next; //pfree后移
//填寫該進程控制塊內(nèi)容
pcbarea[i].name=x;
pcbarea[i].status=aready;
pcbarea[i].ax=x;
pcbarea[i].bx=x;
pcbarea[i].cx=x;
pcbarea[i].dx=x;
pcbarea[i].pc=x;
pcbarea[i].psw=x;
if(ready.head!=-1) //就緒隊列不空時,掛入就緒隊列方式
{pcbarea[ready.tail].next=i;
ready.tail=i;
pcbarea[ready.tail].next=-1;
}
else //就緒隊列空時,掛入就緒隊列方式
{ready.head=i;
ready.tail=i;
pcbarea[ready.tail].next=-1;
}
}//進程創(chuàng)建函數(shù)結(jié)束
void main()
{//系統(tǒng)初始化
int num,j;
run=ready.head=ready.tail=-1;
pfree=0;
for(j=0;j<n-1;j++)
pcbarea[j].next=j+1;
pcbarea[n-1].next=-1;
printf("輸入進程編號(避免編號的沖突,以負數(shù)輸入結(jié)束,最多可以創(chuàng)建10個進程):\n");
scanf("%d",&num);
while(num>=0)
{create(num);
scanf("%d",&num);
}
sheduling(); //進程調(diào)度
if(run!=-1)
{printf("進程標示符 進程狀態(tài) 寄存器容量:ax bx cx dx pc psw:\n");
printf("%2d%16d%18d%4d%4d%4d%4d%4d\n",pcbarea[run].name,pcbarea[run].status,
pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);
}
}//main()結(jié)束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -