📄 operation.cpp
字号:
#include"stdio.h"
#define running 1 //用running 表示进程处于进行状态
#define aready 2 //用aready 表示进程处于就绪状态
#define block 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 prior; //优先数
int next; //下一个进程控制块的位置
}pcbarea[n]; //模拟进程控制块区域的数组
int PSW,AX,BX,CX,DX,PC,TIME;
//模拟寄存器
int run; //定义指向正在运行进程的进程控制块指针
struct
{
int head;
int tail;
}ready; //定义就绪队列的头指针head尾指针tail
int pfree; //定义指向空闲控制块的队列的指针
void sheduling() //进程调度函数
{
int i;
if(ready.head==-1) //空闲进程控制块队列为空,退出
{
printf("无就绪进程\n");
run=-1;
return;
}
i=ready.head; //就绪队列头指针赋给i
ready.head=pcbarea[ready.head].next; //就绪队列头指针后移
if(ready.head==-1) ready.tail=-1; //就绪队列为空,修正尾指针ready.tail
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;
run=i; //修改指向运行进程的指针
}//进程调度函数结束
void create(int x,int y)
{//创建进程
int i,j;
if(pfree==-1)
{
printf("无空闲进程控制块,进程创建失败\n");
return;
}
if(pfree!=0)
{
for(i=0;i<pfree;i++)
{
if(pcbarea[i].prior<y)
{
for(j=pfree;j>=i;j--)
{
pcbarea[j].name=pcbarea[j-1].name;
pcbarea[j].status=pcbarea[j-1].status;
pcbarea[j].ax=pcbarea[j-1].ax;
pcbarea[j].bx=pcbarea[j-1].bx;
pcbarea[j].cx=pcbarea[j-1].cx;
pcbarea[j].dx=pcbarea[j-1].dx;
pcbarea[j].pc=pcbarea[j-1].pc;
pcbarea[j].psw=pcbarea[j-1].psw;
pcbarea[j].prior=pcbarea[j-1].prior;
}
break;
}
}
}
else i=pfree; //取空闲进程控制块的第一个
j=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(ready.head!=-1) //就绪队列不空时,挂入就绪队列方式
{
pcbarea[ready.tail].next=j;
ready.tail=j;
pcbarea[ready.tail].next=-1;
}
else //就绪队列不空时,挂入就绪队列方式
{
ready.head=j;
ready.tail=j;
pcbarea[ready.tail].next=-1;
}
}//进程创建函数结束
void main()
{//系统出始化
int num,j,p;
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");
printf("p=");
scanf("%d",&p);
printf("N=");
scanf("%d",&num);
while(num>=0)
{
create(num,p);
printf("p=");
scanf("%d",&p);
printf("N=");
scanf("%d",&num);
}
do
{
sheduling(); //进程调度
if(run!=-1)
{
printf("进程标识符 进程状态 寄存器内容:ax bx cx dx pc psw:\n");
printf("%d%16d%4d%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);
}
}while(run!=-1);
}//main()结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -