进程高度实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:进程调度班级:学号:姓名:评语:成绩:指导教师:批阅时间:年月日《操作系统原理》实验报告-1-操作系统原理实验——进程调度实验报告1目的与要求:1)本实验目的是通过对进程调度算法的实现和实验模拟,加深对操作系统进程调度操作功能和进程调度算法的完整理解,培养和提高学生对操作系统开发的兴趣,以及进程调度程序的开发与应用能力;2)理论上必须深刻理解优先权调度算法和时间片轮转调度算法的基本思想和原理;3)独立使用C、C++或Java编程语言编写优先权调度或时间片轮转算算法调度模拟程序;4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)2实验内容或题目1)设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。2)模拟调度程序可任选两种调度算法之一实现(有能力的同学可同时实现两个调度算法)。3)程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。4)本次实验内容(项目)的详细说明以及要求请参见实验指导书。3实验步骤与源程序《操作系统原理》实验报告-2-代码:#includestdio.h#includeiostream#includestring#includeiomanip#includesstream#defineREADYtrue#defineOVERfalse#defineDATASIZE5#defineSLICE3usingnamespacestd;structJob{public:stringjobName;intarriveTime;intserveTime;Job(){}Job(stringname,intarrive,intserve){jobName=name;arriveTime=arrive;serveTime=serve;}};classExeResult:publicJob{private:intstartTime;intfinishTime;intturnaroundTime;floatweightTurnTime;public:ExeResult*next;ExeResult(){next=NULL;}ExeResult(stringname,intarrive,intserve):Job(name,arrive,serve){setStartTime(0);《操作系统原理》实验报告-3-next=NULL;}voidsetStartTime(intnewTime){startTime=newTime;}voidsetFinishTime(intnewTime){finishTime=newTime;}voidcountFinishTime(){finishTime=startTime+serveTime;}voidcountTurnaroundTime(){turnaroundTime=finishTime-arriveTime;}voidcountWeightTurnTime(){weightTurnTime=(float)turnaroundTime/serveTime;}intgetStartTime(){returnstartTime;}intgetFinishTime(){returnfinishTime;}intgetTurnaroundTime(){returnturnaroundTime;}floatgetWeightTurnTime(){returnweightTurnTime;}voidoutput(){coutsetiosflags(ios::right)setw(3)jobNamesetw(9)arriveTimesetw(9)serveTimesetw(9)getFinishTime()setw(9)setiosflags(ios::fixed)setprecision(2)getTurnaroundTime()setw(13)getWeightTurnTime()endl;}《操作系统原理》实验报告-4-};classTimeSlice:publicExeResult{private:intexecutedTime;public:TimeSlice*next;TimeSlice(){}TimeSlice(stringname,intarrive,intserve):ExeResult(name,arrive,serve){setExedTime(0);}voidsetExedTime(intnewTime){executedTime=newTime;}intgetExedTime(){returnexecutedTime;}};staticJobdata[5]={Job(A,0,4),Job(B,1,3),Job(C,2,5),Job(D,3,2),Job(E,4,4)};stringto_string(inti)//重载int--string{stringstreamints;stringtemps;intsi;intstemps;//int转换为stringreturntemps;}classRR《操作系统原理》实验报告-5-{public:TimeSlice*ready,*p,*endr,*finish,*endf;intcounter;//时间计数器stringsequence;//完成顺序记录RR(){counter=0;endr=newTimeSlice();endf=newTimeSlice();ready=endr;finish=endf;p=NULL;sequence=执行顺序:;}boolcondition()//判断就绪队列是否为空{if(ready-next!=NULL)returnREADY;elsereturnOVER;}//核心操作代码voidstart()//开始执行就绪队列的第一个作业{p=ready-next;//指向执行就绪队列的第一个作业if(p-getExedTime()==0){p-setStartTime(counter);//设置作业开始时间}cout\n时间+to_string(counter)+,+p-jobName+开始执行endl;sequence=sequence+to_string(counter)++p-jobName+;//记录执行顺序if(p-serveTime-p-getExedTime()SLICE)//如果剩余执行时间时间片宽度{counter+=SLICE;p-setExedTime(p-getExedTime()+SLICE);//修改作业已执行时间ready-next=p-next;//队头往下跳}else{counter+=p-serveTime-p-getExedTime();//时间计数器加上该片时间p-setExedTime(p-serveTime);//修改作业已执行时间p-setFinishTime(counter);//作业结束时间《操作系统原理》实验报告-6-p-countTurnaroundTime();//计算周转时间p-countWeightTurnTime();//计算带权周转时间ready-next=p-next;//从就绪队列中删除该时间轮转片endf-next=p;//将已完成的作业加入完成队列尾部endf=p;//已完成作业队列尾指针指向新的尾部endf-next=NULL;//将新的尾部指空cout时间+to_string(counter)+,+p-jobName+结束。endl;}}voidcirculate()//将时间片用完作业加入队尾{if(p==NULL)return;//防止p为空时出错if(p-getExedTime()==p-serveTime)return;//如作业已执行完则不加入队尾endJob(p);//时间片结束将当前未完作业接入就绪队列尾部cout时间+to_string(counter)+,+p-jobName+未完,接入队尾endl;}voidaddJob(JobnewJob)//建立新的作业结点插入到就绪队列尾部{TimeSlice*newTimeSlice=newTimeSlice(newJob.jobName,newJob.arriveTime,newJob.serveTime);endJob(newTimeSlice);}voidendJob(TimeSlice*job)//作业插入尾部{job-next=NULL;if(ready-next==NULL){ready-next=job;endr=job;}else{endr-next=job;endr=endr-next;}}};intmain(){RRrr;Jobjob;boolcondition=OVER;intcount=0;floatweightTurnTime=0;floatturnaroundTime=0;《操作系统原理》实验报告-7-cout时间片调度算法(RR):q=SLICEendlendl;while(condition==READY||countDATASIZE){if(condition==READY){rr.start();//开始作业}while(data[count].arriveTime=rr.counter&&countDATASIZE){cout时间+to_string(data[count].arriveTime)+,+data[count].jobName+到达,加入队尾endl;rr.addJob(data[count]);count++;}rr.circulate();//将时间片用完的作业加入队尾,判断条件在函数内condition=rr.condition();}cout'\n'rr.sequenceendlendl;//输出作业执行顺序cout\n作业名|到达时间|服务时间|完成时间|周转时间|带权周转时间endl;//打印执行结果for(rr.p=rr.finish-next;rr.p!=NULL;rr.p=rr.p-next){weightTurnTime+=rr.p-getWeightTurnTime();//累加带权周转时间turnaroundTime+=rr.p-getTurnaroundTime();//累加周转时间rr.p-output();//输出作业执行过程}cout平均;coutsetiosflags(ios::right)setiosflags(ios::fixed)setw(35)setprecision(1)turnaroundTime/DATASIZEsetw(11)setprecision(2)weightTurnTime/DATASIZEendlendl;//输出统计值cout程序已正确执行。\n程序即将退出;system(pause);return0;}《操作系统原理》实验报告-8-4测试数据与实验结果(可以抓图粘贴)5结果分析与实验体会本次实验用到C++,也算是对C++语言温故而知新。在RR的算法里本来应该用到多线程,一个线程用于作业排队,一个进程用于执行作业。我这里没有写得那么复杂,只是在一个时间片完或者一个作业完的时候检查数据数组,将到达作业插入就绪队列尾部,再将未完作业插入就绪队列尾部,这样我觉得比较简单,而且也算比较有条理。通过这次实验我也算明白了上课认真听讲的重要性了。只有在了解其算法的前提下,才能写代码,才能分析其去处过程。

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功