操作系统实验---处理机调度

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

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

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

资源描述

实验报告实验题目姓名:学号:课程名称:操作系统实验所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称处理机调度一、实验目的与要求:1、给出所选实验题目。2、给出源程序文件名和执行程序文件名。源程序中要有详细的注释。3、给出程序中使用的数据结构和符号说明。4、给出程序的流程图。5、给出运行结果。6、总结收获体会和对题解的改进意见及见解。二、实验设备及软件:装有Linux操作系统的PC机一台三、实验方法(原理、流程图)设计一个按时间片轮转法调度的算法1.进程控制块内容和先来先服务调度的算法一样,如右图所示。系统设置一个队头和一个队尾指针,分别指向队列的第一个和最后一个进程。2.为每个进程确定一个要求运行时间和到达时间。3.按进程到达的先后次序排成一个循环队列。4.处理机调度时,开始选择队首第一个进程运行,另外再设一个当前运行进程指针,指向当前正运行的进程。5.本实验是模拟,所选进程并不实际运行,只是执行:估计运行时间减1和输出当前运行进程名。6.进程运行一次后,应将当前运行进程指针下移一个位置,指向下一个进程。同时还应判断该进程的剩余运行时间是否为0。若不为0,则等待下一轮调度;若为0,则则状态改为完成状态,并撤出就绪队列。7.若就绪队列不空,重复上述5,6步。8.程序中应有显示和打印语句,显示每次选中进程名字和队列变化情况。进程名链接指针到达时间估计运行时间进程状态程序流程图如下:建立就绪队列函数按进程到达的先后次序排成一个循环队列开始选择队首第一个进程运行,另外再设一个当前运行进程指针,指向当前正运行的进程。处理运行队首进程运行一次,指向下一个进程,同时估计运行时间减一。剩余时间间是否为0?等待下一轮运行状态改为为完成,并把它从就绪队列删除是否四、实验过程、步骤及内容在下述三种调度算法中选择一题进行编程实验:1.设计一个按先来先服务调度的算法;2.设计一个按动态优先级调度的算法;3.设计一个按时间片轮转法调度的算法;本次实验选择按时间片轮转法调度的算法:时间片轮转算法参考代码:#defineN20#includestdio.h#includestdlib.h/*#includeconio.h*/typedefstructpcb/*进程控制块定义*/{charpname[N];intruntime;intarrivetime;charstate;structpcb*next;}PCB;PCBhead_input;//就绪队列头指针PCBhead_run;//运行队列头指针staticcharR='r',C='c';unsignedlongcurrent;//记录系统当前时间voidinputprocess();/*建立进程函数*/intreadyprocess();/*建立就绪队列函数*/intreadydata();/*判断进程是否就绪函数*/intrunprocess();/*运行进程函数*/intreadyprocess(){while(1){if(readydata()==0)return1;elserunprocess();}}intreadydata()//判断就绪队列是否为空{PCB*p1,*p2,*p3;if(head_input.next==NULL){if(head_run.next==NULL)return0;elsereturn1;}p1=head_run.next;p2=&head_run;while(p1!=NULL){p2=p1;p1=p2-next;}p1=p2;p3=head_input.next;p2=&head_input;while(p3!=NULL){if(((unsignedlong)p3-arrivetime=current)&&(p3-state==R)){printf(Timesliceis%8ld(time%4ld);Process%sstart.\n,current,(current+500)/1000,p3-pname);p2-next=p3-next;p3-next=p1-next;p1-next=p3;p1=p3;p3=p2;}p2=p3;p3=p3-next;}return1;}intrunprocess(){PCB*p1,*p2;if(head_run.next==NULL){current++;return1;}else{p1=head_run.next;p2=&head_run;while(p1!=NULL){p1-runtime--;//时间片大小为1current++;if(p1-runtime=0){printf(Timesliceis%8ld(time%4ld);Process%send.\n,current,(current+500)/1000,p1-pname);p1-state=C;p2-next=p1-next;free(p1);p1=p2-next;}else{p2=p1;p1=p2-next;}}return1;}}voidinputprocess(){PCB*p1,*p2;inti,num;unsignedlongmax=0;printf(Howmanyprocessesdoyouwanttorun:);scanf(%d,&num);p2=&head_input;for(i=0;inum;i++){p1=(PCB*)malloc(sizeof(PCB));p2-next=p1;printf(No.%3dprocessinputpname:,i+1);scanf(%s,p1-pname);printf(runtime:);scanf(%d,&(p1-runtime));printf(arrivetime:);scanf(%d,&(p1-arrivetime));p1-runtime=(p1-runtime)*1000;p1-arrivetime=(p1-arrivetime)*1000;p1-state=R;if((unsignedlong)(p1-arrivetime)max)max=p1-arrivetime;p2=p1;}p2-next=NULL;}voidmain(){printf(\ntime1=1000timeslice\n);current=0;inputprocess();readyprocess();system(stty-echo);getchar();system(sttyecho);}五、实验数据(现象)处理分析进一步生成可执行文件时出现错误1:解决办法:#includeconio.h是一个控制输出的头文件,getch()函数不能使用,所以去掉头文件并且修改getch()函数。具体修改部分如下图所示:进一步生成可执行文件时出现错误2:解决办法:malloc的功能与头文件#includestdlib.h有关,但是本参考代码没有给出头文件,所以添加头文件以后malloc的功能可以实现了。生成可执行文件并运行:进行第一次测试:进行第二次测试:进行第三次测试:实验数据分析:因为实验中我们规定的一个时间等于1000个时间片,所以在哪个时间片结束就会有出现不是1000的倍数的情况。在上面运行结果中,当进程aa运行了1000个时间片之后,因为bb已到达,所以bb从第1001个时间片开始运行。以此类推,轮流下去,a在第29999个之间片结束。六、实验结论通过本次实验更进一步的掌握了时间片轮转调度算法。虽然理论知识学过但是通过这次试验特别形象的掌握了时间片轮转调度算法的实际运行结果以及时间片对进程的运行时间和到达时间的要求。经过几次测试实验结果显示不同的时间片,运行时间以及到达时间对进程的顺利完成有紧密联系。刚开始直接利用实验手册里的参考代码没办法生成可执行文件,一直显示“conio.h目录不存在”,“malloc”和“getch”等函数未定义。通过查阅相关资料纠正对应的错误成功的生成可执行文件并且运行。这次试验虽然没有选先来先服务调度的算法和动态优先级调度的算法,但是通过时间片轮转调度算法间接的学会了进程调度基本思路。七、教师批阅意见:成绩评定:教师签字:年月日八、备注:

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

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

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

×
保存成功