/*进程调度模拟程序process.c*/
#include "stdio.h"
#define running 1 /*进程运行状态*/
#define aready 2 /*进程就绪状态*/
#define blocking 3 /*进程等待状态*/
#define sometime 5 /*时间片大小*/
#define n 10 /*系统允许的进程个数*/
struct
{int name; /*进程标识符*/
int status; /*进程状态*/
int ax,bx,cx,dx; /*通用寄存器内容*/
int pc; /*程序计数器内容*/
int psw; /*程序状态寄存器内容*/
int next; /*下一个进程控制块的位置*/
}pcbarea[n]; /*进程控制块区域数组*/
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
int run; /*定义指向正在运行进程的进程控制块的指针*/
int block; /*定义指向处于等待状态进程的进程控制块的指针*/
struct
{int head;
int tail;
}ready;
int pfree; /*定义指向空闲进程控制块队列的指针*/
sheduling() /*进程调度函数*/
{int i;
if(ready.head==-1)
{printf("无就绪进程\n");
return;
}
i=ready.head;
ready.head=pcbarea[ready.head].next;
if(ready.head==-1)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;
run=i;
} /*进程调度函数结束*/
create(int x) /*创建进程函数*/
{int i;
if(pfree==-1)
{printf("无空闲进程控制块,进程创建失败\n");
return;
}
i=pfree;
/*填写进程控制块内容*/
pfree=pcbarea[pfree].next;
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;
}
} /*创建进程函数结束*/
main()
{ /*系统初始化*/
int num,i,j;
run=ready.head=ready.tail=block=-1;
pfree=0;
for(j=0;j<n-1;j++)
pcbarea[j].next=j+1;
pcbarea[n-1].next=-1;
printf("输入进程编号:\n");
scanf("%d",&num);
while(num>=0)
{create(num);
scanf("%d",&num);
}
sheduling(); /*调进程调度函数*/
if(run!=-1)
{printf("进程标识符 进程状态 寄存器内容:ax bx cx dx pc
psw:\n");
printf("%8d%10d%16d%3d%3d%3d%3d%3d\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);
}
}
2.实验测试结果:
输入进程编号:
3 2 1 6 4 8 9 -1
进程标识符 进程状态 寄存器内容:ax bx cx dx pc psw:
3 1 3 3 3 3 3 3
#include "stdio.h"
#define running 1 /*进程运行状态*/
#define aready 2 /*进程就绪状态*/
#define blocking 3 /*进程等待状态*/
#define sometime 5 /*时间片大小*/
#define n 10 /*系统允许的进程个数*/
struct
{int name; /*进程标识符*/
int status; /*进程状态*/
int ax,bx,cx,dx; /*通用寄存器内容*/
int pc; /*程序计数器内容*/
int psw; /*程序状态寄存器内容*/
int next; /*下一个进程控制块的位置*/
}pcbarea[n]; /*进程控制块区域数组*/
int PSW,AX,BX,CX,DX,PC,TIME; /*模拟寄存器*/
int run; /*定义指向正在运行进程的进程控制块的指针*/
int block; /*定义指向处于等待状态进程的进程控制块的指针*/
struct
{int head;
int tail;
}ready;
int pfree; /*定义指向空闲进程控制块队列的指针*/
sheduling() /*进程调度函数*/
{int i;
if(ready.head==-1)
{printf("无就绪进程\n");
return;
}
i=ready.head;
ready.head=pcbarea[ready.head].next;
if(ready.head==-1)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;
run=i;
} /*进程调度函数结束*/
create(int x) /*创建进程函数*/
{int i;
if(pfree==-1)
{printf("无空闲进程控制块,进程创建失败\n");
return;
}
i=pfree;
/*填写进程控制块内容*/
pfree=pcbarea[pfree].next;
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;
}
} /*创建进程函数结束*/
main()
{ /*系统初始化*/
int num,i,j;
run=ready.head=ready.tail=block=-1;
pfree=0;
for(j=0;j<n-1;j++)
pcbarea[j].next=j+1;
pcbarea[n-1].next=-1;
printf("输入进程编号:\n");
scanf("%d",&num);
while(num>=0)
{create(num);
scanf("%d",&num);
}
sheduling(); /*调进程调度函数*/
if(run!=-1)
{printf("进程标识符 进程状态 寄存器内容:ax bx cx dx pc
psw:\n");
printf("%8d%10d%16d%3d%3d%3d%3d%3d\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);
}
}
2.实验测试结果:
输入进程编号:
3 2 1 6 4 8 9 -1
进程标识符 进程状态 寄存器内容:ax bx cx dx pc psw:
3 1 3 3 3 3 3 3