时间片轮转法调度CUP_操作系统课程设计报告_第1页
时间片轮转法调度CUP_操作系统课程设计报告_第2页
时间片轮转法调度CUP_操作系统课程设计报告_第3页
时间片轮转法调度CUP_操作系统课程设计报告_第4页
时间片轮转法调度CUP_操作系统课程设计报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、需求分析11、设计要求:12、解决方案:1二、概要设计21、根本原理:22、数据结构及模块说明:33、流程图:4三、详细设计:4主要函数设计及说明:4四、调试分析:61、调试过程及步骤:62、结果分析:8五、总结:81、遇到问题及解决方法:82、心得体会:9六、参考文献:9附录:源代码9计算机操作系统课程设计时间片轮转法进行CUP调度一、需求分析1、设计要求:在多道程序或多任务系统中,系统同时处于就绪状态的进程有假设干个。为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。要求用时间片轮转算法模拟单处理机调度,以稳固和加深处理机调度的概念。2、解决方案:

2、1、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。PCB包括:进程名、链接指针、到达时间、估计运行时间和进程状态。其中,进程名即进程标识。链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。估计运行时间:可由设计者任意指定一个时间值。到达时间:进程创立时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。进程状态:为简单起见,假定进程有两种状态,就绪和完成,并假定进程一创立就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用C表示。 2、为每个进程任意确定一个要求运行

3、时间和到达时间。 3、按照进程到达的先后顺序排成一个循环队列。再设一个队首指针指向第一个到达进程的首址。 4、执行处理机调度时,开始选择队首的第一个进程运行。另外再设一个当前运行进程的指针,指向当前正运行进程。 5、由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:a、估计运行时间减1;b、输出当前运行进程的名字。用这两个操作来模拟进程的一次运行。 6、进程运行一次后,以后的调度那么将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。同时还应判断该进程的剩余运行时间是否为零。假设不为零,那么等待下一轮的运行;假设该进程

4、的剩余运行时间为零,那么将该进程的状态置为完成状态C,并退出循环队列。 7、假设就绪队列不空,那么重复上述5和6步骤直到所有进程都运行完为止。 8、在所有设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。二、概要设计1、根本原理:系统将所有的就绪进程按先来先效劳的原那么排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几MS到几百MS。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后再把处理机分配给就绪队列中的新的队首进程,同时也让他执行

5、一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定时间内相应所有用户的请求。2、数据结构及模块说明:1、数据结构模块主要是定义本设计中需要的两个主要的结构体PCB和node,从而定义进程控制块变量与队列指针。2、函数模块只要用于实现进程的插入,时间片的插入,轮转法的实现。3、主界面模块主要用于提示使用者怎样进行轮转法的实现。 4、菜单界面块 主要用于提示使用者进入时间片轮转算法系统。3、流程图:开 始输入进程数 输入进程进程是否输入完?N输入时间片Y分配给执行队列队首时间片 时间片-1是否有新进程到达将新到进程插入队尾Y 效劳时

6、间-1N是否完成N退出时间片是否用完NYY是否所有进程都完成Y将未完成的插入队尾结 束N三、详细设计:主要函数设计及说明:1、创立进程;使用单链表的方法,单链表中的每个结点相当于一个进程:typedef structchar name20; /进程名int arrtime; /到达时间int runtime; /运行时间DataType;typedef struct nodeDataType pcb;struct node *next;ListNode;2、自定义所需进程数目:int f; cin>>f 。3、创立一个进程单链表,作为进程队列:LinkList head;p=(Li

7、stNode*)malloc(sizeof(ListNode);head=p;p->next=NULL;在进程数目之内,手动输入进程:p=(ListNode*)malloc(sizeof(ListNode); cin>>p->; cin>>p->pcb.arrtime; cin>>p->pcb.worktime;每输入一个进程都插进进程队列,并按arrtime从小到大排序。4、自定义时间片大小,int T; cin>>T。 5、创立执行队列:LinkList H;ListNode *rear;p=(List

8、Node*)malloc(sizeof(ListNode); p=NULL; H=p;并且定义一个参考变量f2!=f。 6、定义时间轴,初始化时间轴和执行队列: H=head->next; head->next=head->next->next; rear=H; rear->next=NULL; time=H->pcb.arrtime; 7、当f!=0时,分配给执行队列队首一个时间片t。 8、当t!=0时; t=t-1; time=time+1。进程队列的队首进程是否到达,假设到达,将其插到执行队列的队尾:rear->next=head->nex

9、t;head->next=head->next->next;rear=rear->next;rear->next=NULL。执行队列不为空时,执行队列的队首进程的worktime=worktime-1,判断是否执行完。执行完,f2=f2-1,该进程退出执行队列。 9、执行队列队首是否得到过一个完整的时间片,假设有那么该进程插入到执行队列的队尾:q=H; H=H->next; rear->next=q; rear=rear->next; rear->next=NULL。 10、执行队列不为空时,转到第7步。当执行队列和进程队列都为空时,转到第

10、6步。当两队列都为空时,所有进程运行完,模拟结束。四、调试分析:1、调试过程及步骤:1、翻开VC+6.0软件,建立一个以“ccc命名的工程名;2、将源代码输入进去,调试并运行;3、进入时间片轮转算法系统界面:4、输入进程个数,各个进程的名称、到达时间及运行时间,同时还要定义时间片的大小:5、所有数据输入完之后,按“enter键,系统就会自动生成:2、结果分析:首先,输入进程数、时间片大小和各个进程的进程名、运行时间及到达时间的信息,进程按照到达时间从小到达顺序,即先运行程序ccc,其状态仍为R;时刻为2时,有新进程yqx进入,那么先执行进程yqx,未执行完,状态为R;时刻为4时,继续执行进程c

11、cc,只需运行1秒就完成ccc进程,因此,ccc进程完成时间为5,状态改为C;时刻为5时,有新进程yh进入,那么先执行新进程yh,执行2秒,yh进程完成,那么其完成时间为7,状态改为C;时刻为7时,继续执行yqx进程,运行1秒,仍为完成;时刻为8时,仍继续执行yqx进程,运行2秒之后,进程完成,状态改为C,完成时间那么为10;时刻为10时,有新进程mrj,那么执行新的进程,运行2秒后,mrj进程完成,将其状态改为C,完成时间为12;时刻为12时,有新进程syc进入,运行2秒仍为完成,此时状态为R;时刻为14时,继续执行进程syc,运行2秒,进程结束状态改为C,完成时间为16。时刻为16时,没有

12、新进程,所有进程都执行完成,那么运行完毕。五、总结:1、遇到问题及解决方法: 问题:1、C+语言是大一下学期学的,有一年半没有使用有点生疏了。 2、知道时间片轮转算法的内容和根本原理,但是程序不会编。 解决: 1、把大一C+的书本资料拿出来温顾。 2、在图书馆查找相关代码,理解之后再进行编写。2、心得体会:为期一周半的课程设计就快结束了,这次课程设计是对学习?操作系统?的一次综合考察,锻炼我们综合分析问题、解决问题的能力。平时上机课都是把代码给我们了,最多要我们修改错误,而现在要我们自己编写有点困难,并且这次课程设计是用C+语言编写,C+已经有一年半没摸了,在试验过程中再次捧起C+的课本和资料

13、。在和同学的合作和自己努力下,终于把试验给搞定。对时间片轮转算法有了更深的了解:早期算法中,系统将所有的就绪进程按先来先效劳的原那么排成一个队列。每次调度时,把CPU分配给队首进程,并令其执行一个时间片。其中,时间片的大小对系统性能有很大的影响;选择很小的时间片将有利于短作业,因为它能较快的完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销;反之,时间片轮转算法那么退化为FCFS算法,无法满足交互式用户的需求。总的说来知识上的收获很是重要,精神上的丰收也是更加可喜的,让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你

14、。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆。六、参考文献: 1、汤小丹 . ?计算机操作系统? 第三版 . 西安电子科技大学出版社。 2、张丽芬 . ?操作系统实验教程? 清华大学出版社3、谭浩强 . ?C+程序设计? 清华大学出版社附录:源代码#include<stdio.h>#include<stdlib.h>#include<iostream.h>char X;int start;/使用单链表法创立进程typedef structchar name20; /进程名int arrtime; /到达时间int ru

15、ntime; /运行时间DataType;typedef struct nodeDataType pcb;struct node *next;ListNode; typedef ListNode *LinkList;LinkList head;/创立进程队列void create_insert_LinkList(int f1) ListNode *p,*p1,*p2;p=(ListNode*)malloc(sizeof(ListNode);head=p;p->next=NULL;while(f1>0) /f表示进程数p=(ListNode*)malloc(sizeof(ListNo

16、de); /新建结点cout<<"进程名:" cin>>p->;cout<<"到达时间:" cin>>p->pcb.arrtime; cout<<"运行时间:" cin>>p->pcb.runtime; cout<<"*"<<endl;p->next=NULL; p1=head;p2=p1->next;while(p2!=NULL&&p2->pcb.ar

17、rtime<p->pcb.arrtime)/对新建结点排序按arrtime从大到小p1=p2;p2=p2->next;p1->next=p;p->next=p2;f1=f1-1;/进行CPU调度void pcb_LinkList(int f2) LinkList H;ListNode *rear,*p,*q;int T,t,time,m,n;p=(ListNode*)malloc(sizeof(ListNode);p=NULL;H=p; /创立执行队列cout<<"定义时间片大小:"cin>>T;cout<<

18、"*"<<endl;t=T;H=head->next; /定义时间轴,初始化时间轴和执行队列 head->next=head->next->next;rear=H; rear->next=NULL;time=H->pcb.arrtime;while(f2!=0)n=0; while(t!=0) t=t-1; time=time+1; if(head->next!=NULL)if(head->next->pcb.arrtime<=time) /检测是否有新的进程到达if(H=NULL)H=head->

19、;next; head->next=head->next->next; rear=H; rear->next=NULL;else rear->next=head->next; head->next=head->next->next; rear=rear->next; rear->next=NULL; if(H!=NULL) H->pcb.runtime=H->pcb.runtime-1; m=1; /该进程有被执行 n=n+1; /该进程队首在这时间片中所有时间 if(H->pcb.runtime=0) /该进

20、程效劳完,从执行队列中删除 cout<<"在第"<<time-n<<"秒"<<endl; cout<<"进程名"<<H-><<" 运行了"<<n<<"秒"<<" 状态:C "<<" 完成时间:"<<time<<endl;cout<<endl;H=H->next;f

21、2=f2-1;m=0; /新的队首未被执行; n=0; if(m=1)cout<<"在第"<<time-n<<"秒"<<endl;cout<<"进程名"<<H-><<" 运行了"<<n<<"秒"<<" 状态:R "<<endl;cout<<endl;if(H=NULL) if(head->next!=NUL

22、L)time=head->next->pcb.arrtime;elseif(H->next!=NULL&&m=1&&n=T) /把未完成的进程插入到执行队列的队末 q=H; H=H->next; rear->next=q; rear=rear->next; rear->next=NULL;t=T;/*菜单函数*/void Menu() /*菜单项选择项*/ char menu; cout<<" -"<<endl; cout<<" | |"<

23、<endl; cout<<" | |"<<endl; cout<<" | * 欢送使用时间片轮转算法系统 * |"<<endl; cout<<" | |"<<endl; cout<<" | |"<<endl; cout<<" | 菜单项选择项: |"<<endl; cout<<" | |"<<endl; cout<<" | 时间片轮转调度(Y/y) |"<<endl; cout<<" | |"<<endl; cout<<" | 退出(Q/q) |"<<endl; cout<<" | |"&l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论