欢迎来到天天文库
浏览记录
ID:20537554
大小:184.14 KB
页数:8页
时间:2018-10-10
《操作系统单处理器的进程调度实验报告》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、实验二单处理器系统的进程调度年级2009级学号2009443004姓名郭占强成缋专业生物信息学实验地点生科楼409指导教师王硕实验项目单处理器系统的进程调度实验日期2011年11月25口一、实验目的加深对进程概念的理解,明确进程和程序的区别;深入了解系统如何组织进程、创建进程;进一步认识如何实现处理器调度。二、实验要求编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。三、实验原理:单处理器系统的进程调度U!实验程序设计#include2、dio.h>#include#defineRUNNING1//用RUNNING表示进程处于运行态#defmeWAIT2//用wait表示进程处于就绪态#defineFINISH3//用FINISH表示进程己经执行完毕#defineTIME_PIECE5//用TIME_PIECE表示时间片大小#defineMAX_PROCESS_NUM10//假定系统允许进程个数为10intAX,BX,CX,DX,PC,PSW,TIME;//模拟寄存器intnm;//定义指向正在运行进程的进程控制块的指针intpfree;//定义指向空闲进程控制块队列的指针struct{inthea3、d;inttail;Jready;//定义指向就绪队列的头指针head和尾指针tailstruct{intname;//进程标识符intstatus;//进程状态intax,bx,cx,dx;//进程现场信息,通用寄存器内容intpc;//进程现场信息,程序计数器内容intpsw;//进程现场信息,程序状态字寄存器内容inttime;//进程每次申请的时间片大小inttotalTime;//执行进程需耍的总时间intremainingTime;//进程剩余的执行时间intnext;//下一个进程控制块的位置}pcbarea[MAX_PROCESS_NUM];//定义模拟进程控制块区域的4、数组//进程控制块初始化voidInit(){inti;run=ready.head=ready.tail=-1;//运行指针、就绪指针清空pfree=0;//空闲指针指向第一个进程for(i=0;i5、intf("无空闲进程控制块,进程创建失败n);return;}i=pfree;//取空闲进程控制块队列的第一个pfree=pcbarea[pfree].next;//pfree后移//填写该进程控制块内容pcbarea[i].name=process_name;pcbarea[i].status=WAIT;pcbareafil.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;pcbarea[6、i].totalTime=totalTime;pcbarea[i].remainingTime=totalTime;if(ready,head!=-!){//就绪队列不空时,置入就绪队列pcbarea[ready.tail].next=i;ready.tail=i;pcbarea[ready.tail].next=-l;}else{//就绪队列空吋,置入就绪队列ready.head=i;ready.tail=i;pcbarea[ready.tail].next=-1;}printfCXn");}//进程调度函数voidShedulingO{getchar();if(ready.head7、==-1){//空闲进程控制块队列为空,退出printf("进程调度完毕!");return;}run=ready.head;//就绪队列头指针赋给run,即让就绪队列的队头运行ready.head=pcbarea[ready.head].next;//就绪队列头指针后移if(ready.head==-1)ready.tail=-l;//就绪队列为空,修正尾指针ready.tailpcbarea[run].status=RUNNIN
2、dio.h>#include#defineRUNNING1//用RUNNING表示进程处于运行态#defmeWAIT2//用wait表示进程处于就绪态#defineFINISH3//用FINISH表示进程己经执行完毕#defineTIME_PIECE5//用TIME_PIECE表示时间片大小#defineMAX_PROCESS_NUM10//假定系统允许进程个数为10intAX,BX,CX,DX,PC,PSW,TIME;//模拟寄存器intnm;//定义指向正在运行进程的进程控制块的指针intpfree;//定义指向空闲进程控制块队列的指针struct{inthea
3、d;inttail;Jready;//定义指向就绪队列的头指针head和尾指针tailstruct{intname;//进程标识符intstatus;//进程状态intax,bx,cx,dx;//进程现场信息,通用寄存器内容intpc;//进程现场信息,程序计数器内容intpsw;//进程现场信息,程序状态字寄存器内容inttime;//进程每次申请的时间片大小inttotalTime;//执行进程需耍的总时间intremainingTime;//进程剩余的执行时间intnext;//下一个进程控制块的位置}pcbarea[MAX_PROCESS_NUM];//定义模拟进程控制块区域的
4、数组//进程控制块初始化voidInit(){inti;run=ready.head=ready.tail=-1;//运行指针、就绪指针清空pfree=0;//空闲指针指向第一个进程for(i=0;i5、intf("无空闲进程控制块,进程创建失败n);return;}i=pfree;//取空闲进程控制块队列的第一个pfree=pcbarea[pfree].next;//pfree后移//填写该进程控制块内容pcbarea[i].name=process_name;pcbarea[i].status=WAIT;pcbareafil.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;pcbarea[6、i].totalTime=totalTime;pcbarea[i].remainingTime=totalTime;if(ready,head!=-!){//就绪队列不空时,置入就绪队列pcbarea[ready.tail].next=i;ready.tail=i;pcbarea[ready.tail].next=-l;}else{//就绪队列空吋,置入就绪队列ready.head=i;ready.tail=i;pcbarea[ready.tail].next=-1;}printfCXn");}//进程调度函数voidShedulingO{getchar();if(ready.head7、==-1){//空闲进程控制块队列为空,退出printf("进程调度完毕!");return;}run=ready.head;//就绪队列头指针赋给run,即让就绪队列的队头运行ready.head=pcbarea[ready.head].next;//就绪队列头指针后移if(ready.head==-1)ready.tail=-l;//就绪队列为空,修正尾指针ready.tailpcbarea[run].status=RUNNIN
5、intf("无空闲进程控制块,进程创建失败n);return;}i=pfree;//取空闲进程控制块队列的第一个pfree=pcbarea[pfree].next;//pfree后移//填写该进程控制块内容pcbarea[i].name=process_name;pcbarea[i].status=WAIT;pcbareafil.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;pcbarea[
6、i].totalTime=totalTime;pcbarea[i].remainingTime=totalTime;if(ready,head!=-!){//就绪队列不空时,置入就绪队列pcbarea[ready.tail].next=i;ready.tail=i;pcbarea[ready.tail].next=-l;}else{//就绪队列空吋,置入就绪队列ready.head=i;ready.tail=i;pcbarea[ready.tail].next=-1;}printfCXn");}//进程调度函数voidShedulingO{getchar();if(ready.head
7、==-1){//空闲进程控制块队列为空,退出printf("进程调度完毕!");return;}run=ready.head;//就绪队列头指针赋给run,即让就绪队列的队头运行ready.head=pcbarea[ready.head].next;//就绪队列头指针后移if(ready.head==-1)ready.tail=-l;//就绪队列为空,修正尾指针ready.tailpcbarea[run].status=RUNNIN
此文档下载收益归作者所有