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

上传人:b****6 文档编号:7513992 上传时间:2023-01-24 格式:DOCX 页数:9 大小:51.93KB
下载 相关 举报
操作系统 单处理器的进程调度实验报告.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

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

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

实验二单处理器系统的进程调度

年级2009级学号2009443004姓名郭占强成绩

专业生物信息学实验地点生科楼409指导教师王硕

实验项目单处理器系统的进程调度

实验日期2011年11月25日

一、实验目的

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

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

进一步认识如何实现处理器调度。

二、实验要求

编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。

实验具体包括:

首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;

最后编写主函数对所作工作进程测试。

三、实验原理:

单处理器系统的进程调度

四、实验程序设计

#include

#include

#defineRUNNING1//用RUNNING表示进程处于运行态#defineWAIT2//用wait表示进程处于就绪态

#defineFINISH3//用FINISH表示进程已经执行完毕#defineTIME_PIECE5//用TIME_PIECE表示时间片大小#defineMAX_PROCESS_NUM10//假定系统允许进程个数为10

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

intrun;//定义指向正在运行进程的进程控制块的指针intpfree;//定义指向空闲进程控制块队列的指针

struct{

inthead;

inttail;

}ready;//定义指向就绪队列的头指针head和尾指针tail

struct{

-1-

intname;//进程标识符

intstatus;//进程状态

intax,bx,cx,dx;//进程现场信息,通用寄存器内容intpc;//进程现场信息,程序计数器内容

intpsw;//进程现场信息,程序状态字寄存器内容inttime;//进程每次申请的时间片大小

inttotalTime;//执行进程需要的总时间

intremainingTime;//进程剩余的执行时间

intnext;//下一个进程控制块的位置

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

//进程控制块初始化

voidInit(){

inti;

run=ready.head=ready.tail=-1;//运行指针、就绪指针清空pfree=0;//空闲指针指向第一个进程

for(i=0;i

pcbarea[i].next=i+1;pcbarea[MAX_PROCESS_NUM-1].next=-1;

}

//创建进程

voidCreate(intprocess_name,intax,intbx,intcx,intdx,intpc,intpsw,inttotalTime){

inti;

if(pfree==-1){

//空闲进程控制块队列为空

printf("无空闲进程控制块,进程创建失败\n");

return;

}

i=pfree;//取空闲进程控制块队列的第一个

pfree=pcbarea[pfree].next;//pfree后移

//填写该进程控制块内容

pcbarea[i].name=process_name;pcbarea[i].status=WAIT;pcbarea[i].ax=ax;

pcbarea[i].bx=bx;

pcbarea[i].cx=cx;

pcbarea[i].dx=dx;

pcbarea[i].pc=pc;

pcbarea[i].psw=psw;

pcbarea[i].time=TIME_PIECE;

-2-

pcbarea[i].totalTime=totalTime;pcbarea[i].remainingTime=totalTime;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;}

printf("\n");

}

//进程调度函数

voidSheduling(){

getchar();

if(ready.head==-1){

//空闲进程控制块队列为空,退出

printf("进程调度完毕~\n\n\n");

return;

}

run=ready.head;//就绪队列头指针赋给run,即让就绪队列的队头运行ready.head=pcbarea[ready.head].next;//就绪队列头指针后移if(ready.head==-1)

ready.tail=-1;//就绪队列为空,修正尾指针ready.tail

pcbarea[run].status=RUNNING;//修改进程控制块状态

//恢复该进程现场信息

AX=pcbarea[run].ax;

BX=pcbarea[run].bx;

CX=pcbarea[run].cx;

DX=pcbarea[run].dx;

PC=pcbarea[run].pc;

PSW=pcbarea[run].psw;

TIME=pcbarea[run].time;//设置相对时钟寄存器的时间片

//打印进程以及系统的状态信息

printf("\n进程编号:

%d\n",pcbarea[run].name);printf("进程状态:

运行\n");

printf("寄存器内容:

\n");

printf("AX:

%d\n",AX);

-3-

printf("BX:

%d\n",BX);

printf("CX:

%d\n",CX);

printf("DX:

%d\n",DX);

printf("PC:

%d\n",PC);

printf("PSW:

%d\n",PSW);

printf("TIME:

%d\n\n",TIME);

printf("\n**时间片用完**\n");

AX=BX=CX=DX=PC=PSW=TIME=0;//时间片用完立即归还CPU资源

//若进程执行完毕,则回收进程控制块

if(pcbarea[run].remainingTime<=TIME_PIECE){

getchar();

pcbarea[run].remainingTime=0;

pcbarea[run].status=FINISH;

ready.head=pcbarea[run].next;

//打印进程以及系统的状态信息

printf("\n进程编号:

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

printf("进程状态:

完成\n");

printf("寄存器内容:

\n");

printf("AX:

%d\n",AX);

printf("BX:

%d\n",BX);

printf("CX:

%d\n",CX);

printf("DX:

%d\n",DX);

printf("PC:

%d\n",PC);

printf("PSW:

%d\n",PSW);

printf("TIME:

%d\n\n",TIME);

//将该进程控制块置入空闲队列

if(pfree==-1){

pfree=run;

pcbarea[pfree].next=-1;

}

else{

pcbarea[pfree].next=run;

pfree=run;

pcbarea[run].next=-1;

}

}

//若进程还没执行完毕,则将其置入就绪队列,等待下次的时间片到来else{

getchar();

pcbarea[run].remainingTime-=TIME_PIECE;

pcbarea[run].status=WAIT;

-4-

//将进程置入就绪队列中

if(ready.tail!

=-1)

pcbarea[ready.tail].next=run;

else

ready.head=ready.tail=run;

pcbarea[run].next=-1;

ready.tail=run;

//打印进程以及系统的状态信息

printf("\n进程编号:

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

printf("进程状态:

等待\n");

printf("寄存器内容:

\n");

printf("AX:

%d\n",AX);

printf("BX:

%d\n",BX);

printf("CX:

%d\n",CX);

printf("DX:

%d\n",DX);

printf("PC:

%d\n",PC);

printf("PSW:

%d\n",PSW);

printf("TIME:

%d\n\n",TIME);

}

Sheduling();//如果还有进程没有执行完毕,则继续递归调度

}

voidmain(){

intprocess_name,ax,bx,cx,dx,pc,psw,totalTime;

inti;

charquit;//用于选择退出进程模拟系统

do{

i=MAX_PROCESS_NUM;

printf("==========================模拟单处理器系统的进程调度==========================\n\n\n");

Init();

printf("**创建进程,输入负数可结束创建**\n\n");

printf("输入一个进程的编号(现在还可以创建%d个进程):

",i);

scanf("%d",&process_name);

while(process_name>0){

printf("请输入该进程中ax、bx、cx、dx、pc、psw的初始现场信息:

");

scanf("%d%d%d%d%d%d",&ax,&bx,&cx,&dx,&pc,&psw);

printf("请输入该进程运行所需的总时间:

");

scanf("%d",&totalTime);

Create(process_name,ax,bx,cx,dx,pc,psw,totalTime);

if(i>0)

--i;

-5-

printf("输入一个进程的编号(现在还可以创建%d个进程):

",i);

scanf("%d",&process_name);

}

system("cls");

printf("请按回车开始调度……");

getchar();

Sheduling();

printf("退出请按0,重新测试请按任意键:

");

quit=getchar();

system("cls");

}while(quit!

='0');

printf("\n\n");

}

五、实验结果与分析

测试样本数据如下:

112345610

223434615

342532320

432233210

-1

-6-

调度结果1423

-7-

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

当前位置:首页 > 工作范文 > 演讲主持

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

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