您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 操作系统-单处理器的进程调度实验报告
-1-实验二单处理器系统的进程调度年级2009级学号2009443004姓名郭占强成绩专业生物信息学实验地点生科楼409指导教师王硕实验项目单处理器系统的进程调度实验日期2011年11月25日一、实验目的加深对进程概念的理解,明确进程和程序的区别;深入了解系统如何组织进程、创建进程;进一步认识如何实现处理器调度。二、实验要求编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。三、实验原理:单处理器系统的进程调度四、实验程序设计#includestdio.h#includestdlib.h#defineRUNNING1//用RUNNING表示进程处于运行态#defineWAIT2//用wait表示进程处于就绪态#defineFINISH3//用FINISH表示进程已经执行完毕#defineTIME_PIECE5//用TIME_PIECE表示时间片大小#defineMAX_PROCESS_NUM10//假定系统允许进程个数为10intAX,BX,CX,DX,PC,PSW,TIME;//模拟寄存器intrun;//定义指向正在运行进程的进程控制块的指针intpfree;//定义指向空闲进程控制块队列的指针struct{inthead;inttail;}ready;//定义指向就绪队列的头指针head和尾指针tailstruct{-2-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;iMAX_PROCESS_NUM-1;++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;-3-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.tailpcbarea[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);-4-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;-5-//将进程置入就绪队列中if(ready.tail!=-1)pcbarea[ready.tail].next=run;elseready.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_name0){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(i0)--i;-6-printf(输入一个进程的编号(现在还可以创建%d个进程):,i);scanf(%d,&process_name);}system(cls);printf(请按回车开始调度……);getchar();Sheduling();printf(退出请按0,重新测试请按任意键:);quit=getchar();system(cls);}while(quit!='0');printf(\n\n);}五、实验结果与分析测试样本数据如下:112345610223434615342532320432233210-1-7-调度结果1423
本文标题:操作系统-单处理器的进程调度实验报告
链接地址:https://www.777doc.com/doc-5630211 .html