《操作系统实验---处理机调度(共11页).doc》由会员分享,可在线阅读,更多相关《操作系统实验---处理机调度(共11页).doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实 验 报 告实验题目姓名: 学号: 课程名称: 操作系统实验所在学院:信息科学与工程学院专业班级: 计算机任课教师: 实验项目名称处理机调度一、实验目的与要求: 1、给出所选实验题目。 2、给出源程序文件名和执行程序文件名。源程序中要有详细的注释。 3、给出程序中使用的数据结构和符号说明。 4、给出程序的流程图。 5、给出运行结果。 6、总结收获体会和对题解的改进意见及见解。 二、实验设备及软件:装有Linux操作系统的PC机一台三、实验方法(原理、流程图) 设计一个按时间片轮转法调度的算法1.进程控制块内容和先来先服务调度的算法一样,如右图所示。系统设置一个队头和
2、一个队尾指针,分别指向队列的第一个和最后一个进程。2.为每个进程确定一个要求运行时间和到达时间。 3.按进程到达的先后次序排成一个循环队列。 4.处理机调度时,开始选择队首第一个进程运行,另外再设一个当前运行进程指针,指向当前正运行的进程。5.本实验是模拟,所选进程并不实际运行,只是执行: 估计运行时间减1和输出当前运行进程名。 6进程运行一次后,应将当前运行进程指针下移一个位置, 指向下一个进程。同时还应判断该进程的剩余运行时间是否为0。若不为0,则等待下一轮调度;若为0,则则状态改为完成状态,并撤出就绪队列。 7若就绪队列不空,重复上述5,6步。8程序中应有显示和打印语句,显示每次选中进程
3、名字和队列变化情况。进程名 链接指针 到达时间 估计运行时间 进程状态建立就绪队列函数程序流程图如下:按进程到达的先后次序排成一个循环队列处理开始选择队首第一个进程运行,另外再设一个当前运行进程指针,指向当前正运行的进程。运行队首进程运行一次,指向下一个进程,同时估计运行时间减一。是剩余时间间是否为0?否等待下一轮运行状态改为为完成,并把它从就绪队列删除四、实验过程、步骤及内容 在下述三种调度算法中选择一题进行编程实验:1设计一个按先来先服务调度的算法;2设计一个按动态优先级调度的算法;3. 设计一个按时间片轮转法调度的算法;本次实验选择按时间片轮转法调度的算法:时间片轮转算法参考代码: #d
4、efine N 20#include#include/*#include*/typedef struct pcb/* 进程控制块定义*/ char pnameN; int runtime; int arrivetime; char state; struct pcb *next; PCB;PCB head_input;/就绪队列头指针PCB head_run; /运行队列头指针static char R=r,C=c;unsigned long current; /记录系统当前时间void inputprocess();/*建立进程函数 */int readyprocess();/*建立就绪队列
5、函数*/int readydata();/*判断进程是否就绪函数 */int runprocess();/*运行进程函数 */int readyprocess() while(1) if(readydata()=0) return 1; else runprocess(); int readydata() /判断就绪队列是否为空 PCB *p1,*p2,*p3; if(head_input.next=NULL) if(head_run.next=NULL) return 0; else return 1; p1 = head_run.next; p2 = &head_run; while (p
6、1 != NULL) p2 = p1; p1 = p2-next; p1 = p2; p3 = head_input.next; p2 = &head_input; while (p3 != NULL) if( (unsigned long)p3-arrivetime state = R) printf(Time slice is %8ld( time %4ld); Process %s start.n, current, (current+500)/1000, p3-pname); p2-next = p3-next; p3-next = p1-next; p1-next = p3; p1
7、= p3; p3 = p2; p2 = p3; p3 = p3-next; return 1;int runprocess() PCB *p1,*p2; if(head_run.next = NULL) current+; return 1; else p1 = head_run.next; p2 = &head_run; while(p1 != NULL) p1-runtime-;/时间片大小为1 current+; if(p1-runtime pname); p1-state = C; p2-next=p1-next; free(p1); p1=p2-next; else p2 = p1;
8、 p1 = p2-next; return 1; void inputprocess() PCB *p1,*p2; int i,num; unsigned long max = 0; printf(How many processes do you want to run:); scanf(%d,&num); p2 = &head_input; for (i=0; inext = p1; printf(No.%3d process input pname:,i+1); scanf(%s,p1-pname); printf(runtime:); scanf(%d,&(p1-runtime); p
9、rintf(arrivetime:); scanf(%d,&(p1-arrivetime); p1-runtime = (p1-runtime)*1000; p1-arrivetime = (p1-arrivetime)*1000; p1-state = R; if(unsigned long)(p1-arrivetime) max) max = p1-arrivetime; p2 = p1; p2-next = NULL; void main() printf(ntime 1 = 1000 time slicen); current = 0; inputprocess(); readypro
10、cess(); system(stty -echo); getchar(); system(stty echo);五、实验数据(现象)处理分析进一步生成可执行文件时出现错误1:解决办法:#include 是一个控制输出的头文件,getch()函数不能使用,所以去掉头文件并且修改getch()函数。具体修改部分如下图所示:进一步生成可执行文件时出现错误2:解决办法:malloc的功能与头文件#include 有关,但是本参考代码没有给出头文件,所以添加头文件以后malloc的功能可以实现了。生成可执行文件并运行:进行第一次测试:进行第二次测试:进行第三次测试:实验数据分析:因为实验中我们规定的一
11、个时间等于1000个时间片,所以在哪个时间片结束就会有出现不是1000的倍数的情况。在上面运行结果中,当进程aa运行了1000个时间片之后,因为bb已到达,所以bb从第1001个时间片开始运行。以此类推,轮流下去,a在第29999个之间片结束。六、实验结论 通过本次实验更进一步的掌握了时间片轮转调度算法。虽然理论知识学过但是通过这次试验特别形象的掌握了时间片轮转调度算法的实际运行结果以及时间片对进程的运行时间和到达时间的要求。经过几次测试实验结果显示不同的时间片,运行时间以及到达时间对进程的顺利完成有紧密联系。刚开始直接利用实验手册里的参考代码没办法生成可执行文件,一直显示“conio.h目录不存在”,“malloc”和“getch”等函数未定义。通过查阅相关资料纠正对应的错误成功的生成可执行文件并且运行。这次试验虽然没有选先来先服务调度的算法和动态优先级调度的算法,但是通过时间片轮转调度算法间接的学会了进程调度基本思路。七、教师批阅意见:成绩评定: 教师签字: 年 月 日 八、备注:专心-专注-专业