操作系统模拟实验单处理机系统的进程调度实验报告.docx

上传人:b****2 文档编号:24573803 上传时间:2023-05-29 格式:DOCX 页数:9 大小:15.79KB
下载 相关 举报
操作系统模拟实验单处理机系统的进程调度实验报告.docx_第1页
第1页 / 共9页
操作系统模拟实验单处理机系统的进程调度实验报告.docx_第2页
第2页 / 共9页
操作系统模拟实验单处理机系统的进程调度实验报告.docx_第3页
第3页 / 共9页
操作系统模拟实验单处理机系统的进程调度实验报告.docx_第4页
第4页 / 共9页
操作系统模拟实验单处理机系统的进程调度实验报告.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

操作系统模拟实验单处理机系统的进程调度实验报告.docx

《操作系统模拟实验单处理机系统的进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统模拟实验单处理机系统的进程调度实验报告.docx(9页珍藏版)》请在冰豆网上搜索。

操作系统模拟实验单处理机系统的进程调度实验报告.docx

操作系统模拟实验单处理机系统的进程调度实验报告

数学与计算机学院单处理机系统的进程调度实验报告

年级07学号2007429023姓名王阳成绩

专业信计实验地点主楼402指导教师王硕

实验项目单处理机系统的进程调度实验日期

实验报告要求:

一、实验目的

1、加深对进程概念的理解,明确进程和程序的区别。

2、深入了解系统如何组织进程、创建进程。

3、进一步认识如何实现处理机调度。

二、实验原理

三、实验要求

1、采用时间片轮转调度算法实现进程调度。

2、确定进程控制块的内容,进程控制块的组织方式。

3、完成进程创建原语和进程调度原语。

4、编写主函数对所做工作进行测试。

四、实验结果(程序)及分析

#include

#defineN10//系统中所允许的最大进程数量

#defineSLOT5//时间片大小

//进程状态枚举

typedefenum

{

Running,//运行状态

Aready,//就绪状态

Blocking//阻塞状态

}ProStatus;

//进程控制块

typedefstruct

{

intname;//进程标识符

ProStatusstatus;//进程状态

intax,bx,cx,dx;//通用寄存器

intpc;//程序计数器寄存器

intpsw;//程序状态字寄存器

intnext;//指向下一个进程的指针

}PCB;

//就绪队列指针

typedefstruct

{

inthead;//头指针

inttail;//尾指针

}Ready;

 

//模拟寄存器

intPSW,AX,BX,CX,DX,PC,TIME;

//PCB的静态链表

PCBpcbArea[N];//模拟PCB区域的数组

intrun;//运行状态程序的指针

Readyready;//就绪队列指针

intpfree;//空闲队列的指针

//初始化运行状态进程指针

voidInitRun()

{

run=-1;

}

//初始化就绪状态队列

voidInitReady()

{

ready.head=ready.tail=-1;

}

//初始化空闲队列

voidInitFree()

{

inttemp;

for(temp=0;temp

{

pcbArea[temp].next=temp+1;

}

pcbArea[temp].next=-1;

pfree=0;

}

//就绪队列出队

intPopReady()//返回结点在PCB区域数组的编号

{

inttemp;

if(ready.head==-1)

{

printf("就绪队列为空,不能出队。

\n");

return-1;

}

temp=ready.head;

ready.head=pcbArea[temp].next;

if(ready.head==-1)

ready.tail=-1;

pcbArea[temp].next=-1;

returntemp;

}

//空闲队列出队

intPopFree()//返回结点在PCB区域数组的编号

{

inttemp;

if(pfree==-1)

{

printf("空闲队列为空,不能出队。

\n");

return-1;

}

temp=pfree;

pfree=pcbArea[temp].next;

pcbArea[temp].next=-1;

returntemp;

}

//就绪队列入队

voidPushReady(intx)//x为入队结点的编号

{

inttemp;

if(ready.head==-1)

{

ready.head=x;

ready.tail=x;

}

else

{

temp=ready.tail;

ready.tail=x;

}

pcbArea[ready.tail].next=-1;

}

//创建PCB

voidCreatePCB(intx,PCBpcb)//x为要创建PCB在PCB区域数组的编号

{

pcbArea[x].ax=pcb.ax;

pcbArea[x].bx=pcb.bx;

pcbArea[x].cx=pcb.cx;

pcbArea[x].dx=pcb.dx;

pcbArea[x].name=pcb.name;

pcbArea[x].next=-1;

pcbArea[x].pc=pcb.pc;

pcbArea[x].psw=pcb.psw;

pcbArea[x].status=pcb.status;

}

//创建进程函数

voidCreate(PCBpcb)

{

inttemp;

if(pfree==-1)

{

printf("空闲队列为空,不能创建进程。

\n");

return;

}

temp=PopFree();

pcb.status=Aready;

CreatePCB(temp,pcb);

PushReady(temp);

}

//进程调度函数

voidSchedule()

{

inttemp;

if(ready.head==-1)

{

printf("系统内没有进程可以调度。

");

return;

}

temp=PopReady();

pcbArea[temp].status=Running;

TIME=SLOT;//恢复CPU现场

AX=pcbArea[temp].ax;

BX=pcbArea[temp].bx;

CX=pcbArea[temp].cx;

DX=pcbArea[temp].dx;

PC=pcbArea[temp].pc;

PSW=pcbArea[temp].psw;

run=temp;//将选中的进程赋给运行指针

printf("当前运行的程序:

\n");//输出调度结果

printf("进程号:

%d\n",pcbArea[run].name);

printf("进程状态:

%d\n",pcbArea[run].status);

printf("寄存器内容:

\nAX\tBX\tCX\tDX\tPC\tPSW\n");

printf("%d\t%d\t%d\t%d\t%d\t%d\n",

pcbArea[run].ax,pcbArea[run].bx,pcbArea[run].cx,pcbArea[run].dx,pcbArea[run].pc,pcbArea[run].psw);

}

 

voidmain()

{

inttemp;

PCBtmp_pcb;

printf("请输入进程号,以负数为结束(进程号应保持唯一)。

\n\n按任意键进入输入模式:

");

getchar();

InitRun();

InitReady();

InitFree();

printf("请开始输入进程号:

\n");

while

(1)

{

scanf("%d",&temp);

if(temp<0)

break;

tmp_pcb.name=temp;

tmp_pcb.ax=temp;

tmp_pcb.bx=temp;

tmp_pcb.cx=temp;

tmp_pcb.dx=temp;

tmp_pcb.pc=temp;

tmp_pcb.psw=temp;

Create(tmp_pcb);

}

printf("\n");

Schedule();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1