您好,欢迎访问三七文档
1安徽大学计算机实验教学中心学号E11614051专业计算机科学与技术姓名施飞宇实验日期2018/10/25教师签字成绩实验报告【实验名称】进程调度【实验目的】巩固和加深处理机调度的概念。设计调度算法,模拟实现处理机的调度【实验原理】先来先服务(FCFS)调度算法FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后把它放入就绪队列。【实验内容】2安徽大学计算机实验教学中心本次实验进程的数据结构如下:typedefstructpcb{charpname[N];//进程名intruntime;//运行时间intarrivetime;//到达时间intstarttime;//开始运行时间floatavgtime;//带权周转时间charstate;//进程状态structpcb*next;//链表指针}PCB;1.设计先来先服务调度算法FCFS测试数据:算法流程图(图1):3安徽大学计算机实验教学中心创建进程队列服务进程进程队列空输出进程执行信息结束程序执行程序否是图1源代码:/*2018/10/26施飞宇笃行南楼a202*/#defineN20#includeiostream#includestdlib.husingnamespacestd;typedefstructpcb4安徽大学计算机实验教学中心{charpname[N];//进程名intruntime;//运行时间intarrivetime;//到达时间intstarttime;//开始运行时间floatavgtime;//带权周转时间charstate;//进程状态structpcb*next;//链表指针}PCB;PCBheadinput;PCBheadrun;PCB*pcbinput;voidinputprocess();//建立进程函数intreadydata(){return1;}//判断进程是否进入就绪函数voidrunprocess();//运行进程函数voidinputprocess(){PCB*p1,*p2;cout输入进程数目endl;intnum;cinnum;inti=0;p1=&headinput;p2=p1;for(i=0;inum;i++){cout输入第i+1进程名,运行时间,到达时间endl;scanf(%s,p1-pname);cinp1-runtime;cinp1-arrivetime;p1-next=newPCB;p2=p1;p1=p1-next;}deletep1;p1=NULL;p2-next=NULL;}voidrunprocess(){PCB*p1;inttime=0;//时间p1=&headinput;printf(进程名到达时间服务时间开始执行时间完成时间周转时间带权周转时间\n);5安徽大学计算机实验教学中心while(p1!=NULL){if(timep1-starttime)time=p1-starttime;p1-starttime=time;p1-avgtime=(p1-starttime+p1-runtime-p1-arrivetime)*1.0/p1-runtime;time=p1-starttime+p1-runtime;printf(%s%10d%10d%10d%10d%10d%5f\n,p1-pname,p1-arrivetime,p1-runtime,p1-starttime,p1-starttime+p1-runtime,p1-starttime+p1-runtime-p1-arrivetime,p1-avgtime);p1=p1-next;}}intmain(){inputprocess();runprocess();return0;}运行截图:6安徽大学计算机实验教学中心2.设计按短进程优先调度算法SJF测试数据:算法流程图(图2):7安徽大学计算机实验教学中心创建进程队列并进行状态标记服务该进程并修改状态标记所有进程状态均修改输出进程执行信息结束程序执行程序检索进程队列中服务时间最短的进程图2源代码:否是8安徽大学计算机实验教学中心/*2018/10/26施飞宇笃行南楼a202*/#defineN20#includeiostream#includestdlib.h#includestdio.husingnamespacestd;typedefstructpcb{charpname[N];//进程名intruntime;//运行时间intarrivetime;//到达时间intstarttime;//开始运行时间floatavgtime;//带权周转时间charstate;//进程状态structpcb*next;//链表指针}PCB;PCBheadinput;PCBheadrun;PCB*pcbinput;voidinputprocess();//建立进程函数intreadydata(){return1;}//判断进程是否进入就绪函数voidrunprocess();//运行进程函数voidinputprocess(){PCB*p1,*p2;cout输入进程数目endl;intnum;cinnum;inti=0;p1=&headinput;p2=p1;for(i=0;inum;i++){cout输入第i+1进程名,到达时间,运行时间endl;scanf(%s,p1-pname);cinp1-arrivetime;cinp1-runtime;p1-state='a';p1-next=newPCB;p2=p1;p1=p1-next;}deletep1;p1=NULL;9安徽大学计算机实验教学中心p2-next=NULL;}voidrunprocess(){intb;PCB*p1,*p2;inttime=0;//时间intruntime=0;//存储运行最短时间intlabel;printf(进程名到达时间服务时间开始执行时间完成时间周转时间带权周转时间\n);while(1){runtime=100;p1=&headinput;label=1;while(p1!=NULL){if(p1-state!='a'){p1=p1-next;continue;}else{//cinb;if((runtimep1-runtime)&&(time=p1-arrivetime)){p2=p1;runtime=p1-runtime;//printf(%s%d\n,p1-pname,runtime);label=0;}p1=p1-next;}}if(label)break;p2-state='b';p2-starttime=time;p2-avgtime=(p2-starttime+p2-runtime-p2-arrivetime)*1.0/p2-runtime;time=p2-starttime+p2-runtime;printf(%s%10d%10d%10d%10d%10d%15.5f\n,p2-pname,p2-arrivetime,p2-runtime,p2-starttime,p2-starttime+p2-runtime,p2-starttime+p2-runtime-p2-arrivetime,p2-avgtime);10安徽大学计算机实验教学中心}}intmain(){inputprocess();PCB*p2=&headinput;//while(p2)//{//printf(%s%10d%10d%10d%10d%10d%5f\n,p2-pname,p2-arrivetime,p2-runtime,p2-starttime,p2-starttime+p2-runtime,p2-starttime+p2-runtime-p2-arrivetime,p2-avgtime);//p2=p2-next;//}runprocess();return0;}运行截图:【小结或讨论】在SJF算法设计时,程序总在指针操作的过程正出错。后来在程序中添加输入中断程序,调试发现错误后才得到正确的算法。11安徽大学计算机实验教学中心
本文标题:操作系统实验一
链接地址:https://www.777doc.com/doc-5355964 .html