石家庄科三新规:单处理器系统的进程调度模拟(源码)
来源:百度文库 编辑:偶看新闻 时间:2024/07/03 08:39:38
#include "stdio.h"
#define running 1 /*用running 表示进程处于运行态*/
#define aready 2 /*用aready表示进程处于就绪态*/
#define blocking 3 /*用blocking表示进程处于等待态*/
#define sometime 5 /*用sometime 表示时间片大小*/
#define n 10 /* 假定系统允许进程个数为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; /*定义指向正在运行进程的进程控制块的指针*/
struct
{
int head;
int tail;
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
int block; /*定义指向等待队列的指针*/
int pfree; /*定义指向空闲进程控制块队列的指针*/sheduling( )
/*进程调度函数*/
{
int i;
if (ready.head==-1) /*空闲进程控制块队列为空,退出*/
{
printf("无就绪进程\n");
return 0;
}
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;
return 0;
}/*进程调度函数结束*/create( int x)
/*创建进程*/
{
int i;
if(pfree==-1) /*空闲进程控制块队列为空*/
{
printf("无空闲进程控制块,进程创建失败\n");
return 0;
}
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,j;
run=ready.head=ready.tail=block=-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);
}
sheduling( );
if(run!=-1)
{
printf("进程名 进程状态 寄存器内容:ax bx cx dx pc psw:\n");
printf("%4d%10d %14d%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);
}
return 0;
}/*main( )结束*/
#define running 1 /*用running 表示进程处于运行态*/
#define aready 2 /*用aready表示进程处于就绪态*/
#define blocking 3 /*用blocking表示进程处于等待态*/
#define sometime 5 /*用sometime 表示时间片大小*/
#define n 10 /* 假定系统允许进程个数为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; /*定义指向正在运行进程的进程控制块的指针*/
struct
{
int head;
int tail;
}ready; /*定义指向就绪队列的头指针head和尾指针tail*/
int block; /*定义指向等待队列的指针*/
int pfree; /*定义指向空闲进程控制块队列的指针*/sheduling( )
/*进程调度函数*/
{
int i;
if (ready.head==-1) /*空闲进程控制块队列为空,退出*/
{
printf("无就绪进程\n");
return 0;
}
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;
return 0;
}/*进程调度函数结束*/create( int x)
/*创建进程*/
{
int i;
if(pfree==-1) /*空闲进程控制块队列为空*/
{
printf("无空闲进程控制块,进程创建失败\n");
return 0;
}
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,j;
run=ready.head=ready.tail=block=-1;
pfree=0;
for(j=0;j
pcbarea[n-1].next=-1;
printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程):\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("%4d%10d %14d%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);
}
return 0;
}/*main( )结束*/
模拟进程调度中断
作业调度算法:编写并调度一个多道程序系统的作业调度模拟程序
!!求教:模拟操作系统进程调度的VB源程序!!!
操作系统进程控制与调度模拟设计
作业调度和进程调度的区别
使用rr算法调度进程,单cpu系统 有n个进程 ,每个进程 i /o发生的概率为w,求cpu空闲的概率 ?(用w n 表示
有关铁路车站调度管理系统模拟
在操作系统中,什么是进程的作业调度,交换调度和进程调度?
关于操作系统的进程调度问题
请问哪位高手有Windows内核调度方面的源码?
单处理器结构的CNC系统由哪些部分组成?
模拟电梯调度算法
进程调度问题
理解作业调度的概念及它与进程调度的关系
求火车调度系统的原程序
程序(C++)有错,帮帮忙.有关进程调度的...
一个进程进入临界区的调度原则是什么
linux环境下的进程调度算法有哪些?
Windows XP 进程调度策略
单处理器结构的CNC系统由哪些部分组成?各部分能完成什么功能?
什么是ETL调度系统?
GPS系统如何实现货物的跟踪与调度?
咨询电力调度系统的26种通用图元
请描述一下windows的CUP或者进程的调度算法