单处理机的进程调度

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#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; //下一个进程控制块的位置

}pcbarea[n]; //模拟进程控制块区域的数组

int PSW, AX,BX,CX,DX , PC ,TIME ; //模拟寄存器

int run; //定义指向正在运行进程的进程控制块的指针struct

{

int head;

int tail;

}ready; //定义就绪队列的头指针head和尾指针tail int pfree; //定义指向空闲进程控制块队列的指针

scheduling( ) //进程调度函数

{

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; //修改进程控制块状态

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; // 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;

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 =-1;

pfree=0;

for(j=0;j

pcbarea[j].next=j+1;

pcbarea[n-1].next=-1;

printf(“输入进程编号(避免编号冲突,以负数输入结束,最多可以创建10个进程):\n”); scanf(“%d”,&num);

while(num>=0)

{

create(num) ;

scanf(“%d”,&num) ;

}

scheduling(); //进程调度

if(run!=-1)

{

printf(“进程标识符进程状态寄存器内容:ax bx cx dx pc psw:\n”);

printf(“%8d%10d%3d%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);

}

}//main()结束

相关文档
最新文档