院学学华夏武汉理工大课程设计报告书操作系统原理课程名称:时间片轮转调度算法题目:系名:信息工程系专业班级:名:姓学号:指导教师司晓梅:2015626日年月武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:司晓梅自动化与计算开课系、教研室:班级名称:计算机1131-2机一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系语言程序设计技术进行实际问题处理的能力,进一步提高学生进统原理、Linux系统、C行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。
学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。
二、课程设计的内容与基本要求1、课程设计题目时间片轮转进程调度模拟算法的实现2、课程设计内容用c/c++语言实现时间片轮转的进程调度模拟算法。
要求:个以上进程5 1.至少要有后,打印出该进程正在运行的相关信息CPU.2进程被调度占有提示:时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来处理机则仅使用一个时间片。
在使用完一个时间片后,进程还没先服务原则调度,但一旦进程占用有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。
1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加就可以了。
1PCB结构所包含的内容,有进程名、进程所需运行时间、已运行2)为进程设计出PCB结构。
时间和进程的状态以及指针的信息等。
、设计报告撰写格式要求:31设计题目与要求2设计思想3系统结构数据结构的说明和模块的算法流程图45:内容包含如何登录、退出、读、写等操作说明使用说明书(即用户手册)运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)6.7自我评价与总结8附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周,现代教育技术中心。
具体安排如下:课程设计集中时间安排:星期三星期四星期一星期二星期五周次第3-6节第2-3节第2-3第17周第2-3节第2-3节节现教地点现教现教现教现教四、课程设计考核及评分标准课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、答辩情况等各因素。
具体评分标准如下:(1)设计方案正确,具有可行性、创新性;30分20)系统开发效果较好;分2(20分(3)设计报告规范、课程设计报告质量高、参考文献充分(4)课程设计答辩时,问题回答正确;20分分5()态度认真、刻苦钻研、遵守纪律;10按上述五项分别记分后求和,总分按五级制记载最后成绩。
6960格,分7970等,分8980好,分90100优秀(~)良(~)中(~)及(~分)分)59~0,不及格(.1、实验概叙1.1实验目的弄明白时间片轮转的工作流程和原理,通过实验让自己更明白切身体会的深!时间片轮转主要是解决处理机调度进程时的优化!正确理解提高处理机的利用率及改善系统性能在很大程度上取决于处理机调度性能的好坏,在操作系统中调度的实质是一种资源分配,调度算法是指根据系统的资源分配策略规定的资源分配算法,对不同的系统和系统目标,应采用不的调度算法。
在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。
也就是说能运行的进程数远远大于处理机个数。
为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。
通过本实验,加深对处理机调度的理解。
弄明白时间片轮转的工作流程和原理,通过实验让自己更明白切身体会的深!1.2实验原理基于时间片轮转调度算法思想用C语言编程实现1.3实验环境(使用的软件)Visual C++6.02、实验思想及内容2.1设计思想按照时间片工作原理:时间片轮转的原则是系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,把CPU分配对手进程,并令其执行一个时间片,当执行完时,有一个计时器发出时钟中断请求,该进程停止,并被送到就绪队列的末尾,然后再把处理机分配就绪队列的队列进程,同时也让它执行一个时间片!2.2实验原理基于时间片轮转调度算法思想用C语言编程实现2.3系统结构设计时间片大小固定,由用户输入。
进程个数由用户输入。
每个进程用一个PCB表示。
PCB包括进程名,到达时间,运行时间,剩余时间,进程状态,链接指针。
其中,进程名,到达时间和运行时间由用户输入,剩余时间的初值等于运行时间。
为简单起见,进程状态设为三种:就绪,运行和完成。
链接指针指向下一个进程的PCB;按照进程到达的先后顺序排成一个队列。
设置一个队头指针指向队列中第一个进程,并设置一个队尾指针指向队列中的最后一个进程;执行调度时,先选择队首的第一个进程运行。
另外设置一个指向当前运行进程的指针;由于本实验是模拟实验,所以对选中进程并不实际启动运行,而只是执行:被选中进程的状态置为运行态;被选中进程的剩余时间减去时间片大小;按照队列的顺序依次输出每个进程的进程名,到达时间,运行时间,剩余时间,进程状态。
用这三个操作来模拟进程的一次运行;进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针,以指示应运行进程。
同时还应判断该进程的剩余时间是否为0。
如果不为0,则等待下一轮的运行;如果该进程的剩余时间为0,则将该进程的状态置为完成态,并退出队列;步直到所有进程都运行完为止。
e步和第d若处于就绪态的进程不为空,则重复第2.4算法流程图开始初始化PCB,输入进程信息各进程按优先数从高到低排列就绪队列为空?结束就绪队列首进程投入运行时间片到,运行进程已占用CUP时+1间运行进程已占进程完成撤时间CPU用销该进程达到所需运行时间-1使运行进程优先数,把运行进程插入优先队列。
.实验过程(实验步骤、记录、数据、分析)2.5测试用例1:屏幕显示:Please input the process name,arrive time and run time 输入:121<enter>231<enter>322<enter>412<enter>511<enter>测试数据2:112<enter>232<enter>312<enter>431<enter>511<enter>测试数据3:111<enter>222<enter>321<enter>412<enter>511<enter>、结论(结果)33.1测试数据1的运行结果(截图)::的运行结果(截图)2测试数据 3.2.:的运行结果(截图)3测试数据 3.3.4、源程序代码:#include獜摴潩栮#include獜摴楬?屨struct stud{int name;int arrive;int run;int rest;char*state;struct stud*next;};/*pcb结构体*/struct stud*create(){int a,i;struct stud*head,*rear,*p,*q,*t;/*定义各个指针*/ head=rear=NULL;);畮扭牥尺process the input Please printf(scanf(╜層,&a);printf(\Please input the process name,arrive time and run time:\nFor example:12就湜);for(i=0;i<a;i++){p=(struct stud*)malloc(sizeof(struct stud));scanf(╜╤╤層,&p->name,&p->arrive,&p->run);p->rest=p->run;p->state=牜慥祤;if(rear==NULL)/*只有一个进程*/{head=p;p->next=NULL;rear=p;}else{t=NULL;q=head;while(q&&q->arrive<p->arrive){t=q;q=q->next;}if(q==head)/*指向头进程的下一个进程*/{p->next=head;head=p;}else if(t==rear)/*运行到最后一个进程*/{rear->next=p;p->next=NULL;rear=p;}else{t->next=p;p->next=q;}}}return head;}void output(struct stud*head){struct stud*p,*t,*r;int slice;);汳捩?the input Please printf(scanf(╜層,&slice);while(head!=NULL){r=p=head;while(p!=NULL){t=head;p->rest=p->rest-slice;/*剩余时间减去时间片*/ p->state=牜湵楮杮;if(p->rest<0)/*剩余的时间用完了*/p->rest=0;printf(屜湜???????????????????屜屮);printf(湜浡履瑜牡楲敶屜牴湵屜牴獥屴瑜瑳瑡履湜);while(t!=NULL){printf(╜層瑜搥屜?層瑜搥屜?屳湜,t->name,t->arrive,t->run,t->rest,t->state);t=t->next;}if(p->rest==0)/*判断是否删除结点*/{if(p==head){head=p->next;free(p);p=head;}/*删除头结点*/else{r->next=p->next;p=r->next;r=p;}}else{r=p;p->state=牜慥祤;/*如果不删除头结点指针指向下一个,状态变为准备*/p=p->next;}}}}void main(){struct stud*head;head=create();output(head);}5、小结实验中产生的错误及原因分析:5.1程序运行不下去:5.1.1错误分析:链表初始化排序过程中:指针p=Null时,不能执行q->arrive等命令;错误解决方法:将while(q->arrive<p->arrive&&q){t=q;q=q->next;}改为:while(q&&q->arrive<p->arrive){t=q;q=q->next;}5.1.2进程运行时间大于时间片时,程序进入死循环:当进程所需时间等于时间片时,运行结果正确:进程运行时间大于时间片时,程序进入死循环:错误分析:进程所需剩余时间计算错误;错误修改:将while(p!=NULL){t=head;p->rest=p->run-slice;p->state=牜湵楮杮;修改为:while(p!=NULL){t=head;p->rest=p->rest-slice;p->state=牜湵楮杮;实验的体会及收获:5.2通过这次试验,我对处理机的调度算法---基于时间片轮转调度算法思想有了更深的理解;另外使我对链表的知识有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做些这方面的练习。