📄 优先数调度改进.cpp
字号:
#include "stdio.h"
#define running 1 //用running表示进程处于运行态
#define aready 2 //用aready表示进程处于就绪态
#define blocking 3 //用blocking表示进程处于等待态
#define sometime 5 //用sometime表示时间片大小
#define n 10 //假定系统允许进程个数为n
struct
{
int name; //进程标识符
int status; //进程状态
int ax,bx,cx,dx; //进程现场信息,通用寄存器内容
int pc; //进程现场信息,程序计数器内容
int psw; //进程现场信息,程序状态字寄存器内容
int next; //下一个进程控制块的位置
int prior; //优先数
}pcbarea[n]; //模拟进程控制块的位置
int PSW,AX,BX,CX,DX,PC,PRIOR,TIME; //模拟寄存器
int run; //定义指向正在运行进程的进程控制块的指针
int MIN=10000; //设置优先数最小的优先
int NUMBER; //进程号
struct
{
int head;
int tail;
}ready; //定义就绪队列的头指针head和尾指针tail
int pfree; //定义指向空闲进程控制块队列的指针
sheduling() //进程调度函数
{
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
ready.tail=-1; //修改进程控制块状态
pcbarea[i].status=running; //设置相对时钟寄存器
TIME=sometime;
//恢复该进程现场信息:
AX=pcbarea[run].ax;
BX=pcbarea[run].bx;
CX=pcbarea[run].cx;
DX=pcbarea[run].dx;
PC=pcbarea[run].pc;
PSW=pcbarea[run].psw;
PRIOR=pcbarea[run].prior;
run=i; //修改指向运行进程的指针
}//进程调度函数结束
create(int x,int y)
//创建进程
{
int i;
if(pfree==-1) //空闲进程控制块队列为空
{
printf("无空闲进程控制块,进程创建失败\n");
return;
}
i=pfree; //取空闲进程控制块队列的第一个
pfree=pcbarea[pfree].next; //pfree后移
//填写该进程控制块内容
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;
pcbarea[i].prior=y;
if(MIN>=y) //进行优先数比较
{
MIN=y;
NUMBER=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;
}//进程创建函数结束
}//
main()
{
//系统初始化
int num,i,j,N;
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("输入进程编号 输入优先数(避免编号的冲突,以负数输入结束,最多可以创建10个进程):\n");
scanf("%d%d",&num,&N);
while(num>=0)
{
create(num,N);
scanf("%d%d",&num,&N);
}
sheduling(); //进程调度
if(run!=-1)
{
printf("进程标识符 进程优先号 进程状态 寄存器内容:ax bx cx dx pc psw:\n");
printf("%d%12d%16d%18d%4d%4d%4d%4d%4d\n",pcbarea[run].name,NUMBER,pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,
pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);
}
}//main()结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -