进程调度先来先服务时间片轮转法优先服务调_第1页
进程调度先来先服务时间片轮转法优先服务调_第2页
进程调度先来先服务时间片轮转法优先服务调_第3页
进程调度先来先服务时间片轮转法优先服务调_第4页
进程调度先来先服务时间片轮转法优先服务调_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、进程调度先来先效劳时间片轮转法优先效劳调度处理器调度免费下载C或C+/*标题:设计一:进程调度设计目的:进程治理是操作系统中的重要功能,用来创立进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法.在进程治理中,进程调度是核心,由于在采用多道程序设计的系统中,往往有假设干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器.本实验模拟在单处理器情况下的进程调度,目的是加深对进程调度工作的理解,掌握不同调度算法的优缺点.设计题目:设计一个按先来先效劳,算法时间片轮转法,优先数调度算法实现处理器调度的程序.*/*亲爱的同学们,

2、大家好.欢送访问我的百度空间,在此我向大家提供免费的资料,这是我们实习要做的.主要是由于我看到很多下载都要金币,而我自己没有金币,不爽.现在我提供免费下载,做个好人.复制到VC+寸可能有些格式问题,稍微修改一下就OK了,程序本身不存在问题的.大三第一个学期实习的哦*/*先来先效劳:是一种最简单的调度算法,每次调度都从后备作业或者进程当中选择一个或者多个最先进入该队列的作业或进程,将它们调入内存,为它们分配资源、创立进程,然后放入就绪队列.当调用FCFSB法时,系统为它们分配处理机,让它们运行.该算法的优点是比拟利于长作业进程,而缺点是不利于短作业进程.算法时间片轮转法:系统将所有的就绪进程根据

3、先来先效劳的原那么排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.当执行完时间片时,计时器就会发出中断请求,调度程序就会停止该进程的执行,并把它送往就绪队列的末尾;然后再把处理机分配给就绪队列中新的队首进程,同时也分配时间片给它.这样保证就绪队列中的所有进程在一个给定的时间片当中都能够获得一个时间片的处理机执行时间.而时间片的大小最好取适中的,即略大于一次典型的交互所需时间.优先数调度算法:该方法又分成两种算法分支,分别是非抢占式优先权算法和抢占式优先权调度算法.该算法被调度时,系统将后备队列中选择假设干个优先权最高的作业装入内存,开始调度时,处理机就会分配给就绪队列中

4、优先权最高的进程.非抢占式优先权算法中,处理机一旦把处理机分配给就绪队列中优先权最高的进程后,该进程就会一直执行下去,直至完成;除非某事件发生而使该进程放弃处理机,系统才将处理机分配给另一个优先权最高的进程.而抢占式优先权算法,当系统把处理机分配给优先权最高的进程时,让它执行,而在执行期间,只要又出现另一个优先权更高的进程,那么进程调度就会立即停止当前进程的执行,重新将处理机分配给优先权最高的进程.先来先效劳是使用数组,算法时间片使用指针,优先数调度使用数组.*/*进程调度的C/C+项法实现*/#include<stdio.h>#include<str

5、ing.h>#include<stdlib.h>/*这是先来先效劳的程序*/structfcfs/定义先来先效劳结构体、参数charname10;floatdaodatime;/到达时间floatfuwutime;/效劳时间floatkaishitime;/开始时间floatwanchengtime;/完成时间floatzhouztime;/周转时间floatdaiquantime;/带权周转时间;fcfsa100;voidinput(fcfs*p,intN)/构造一个输入进程的信息的函数,定义结构体指针inti;for(i=0;i<=N

6、-1;i+)printf("输入第个进程的名字、到达时间、效劳时间:n",i+1);scanf("%s%f%f",&,&pi.daodatime,&pi.fuwutime);/把输入的信息保存到结构体指针所对应的内存中/构造一个输出函数voidPrint(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,int

7、N)intk;printf("执行顺序:n");printf("%s",);for(k=1;k<N;k+)printf("->%s",);printf("n进程的相关信息如下:n");printf("n名字t到达t效劳t开始t完成t周转t带权周转n");for(k=0;k<=N-1;k+)(printf("%st%-.2ft%-.

8、2ft%-.2ft%-.2ft%-.2ft%-.2ftn",,pk.daodatime,pk.fuwutime,pk.kaishitime,pk.wanchengtime,pk.zhouztime,pk.daiquantime);/题目中参加-.2是保存双精度的两位.一般f默认保存六位小数的.voidsort(fcfs*p,intN)/进程根据到达时间进行排序(for(inti=0;i<=N-1;i+)for(intj=0;j<=i;j+)if(pi.daodatime<pj.daodatime)/如果i的时间到达时间小

9、于j的到达时间,就交换(fcfstemp;/在结构体中定义第三个变量进行交换temp=pi;pi=pj;pj=temp;核心的运行阶段voiddeal(fcfs*p,floatdaodatime,floatfuwutime,floatkaishitime,floatwanchengtime,floatzhouztime,floatdaiquantime,intN)intk;for(k=0;k<=N-1;k+)if(k=0)/K=0,表示第一个进程到达pk.kaishitime=pk.daodatime;/那么开始时间=到达时间pk.wanchengtime=pk.daodatim

10、e+pk.fuwutime;/完成时间=到达时间+效劳时间elsepk.kaishitime=pk-1.wanchengtime;/下一个进程的开始时间=上一个进程的完成时间pk.wanchengtime=pk-1.wanchengtime+pk.fuwutime;/完成时间=上一个进程的完成时间+效劳时间for(k=0;k<=N-1;k+)计算周转时间和带权周转时间pk.zhouztime=pk.wanchengtime-pk.daodatime;/周转时间=完成时间-至U达时间pk.daiquantime=pk.zhouztime/pk.fuwutime;/带权周转时间=周转

11、时间/效劳时间voidFCFS(fcfs*p,intN)/定义先来先效劳函数floatdaodatime=0,fuwutime=0,kaishitime=0,wanchengtime=0,zhouztime=0,daiquantime=0;/初始化变量为0sort(p,N);/声明排序函数deal(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,N);/声明运行函数Print(p,daodatime,fuwutime,kaishitime,wanchengtime,zhouztime,daiquantime,

12、N);/声明输出函数/*这是算法时间片轮转法的代码*/*structshijian/定义时间片的结构体charname;/定义进程名intdaodatime;/到达时间intfuwutime;/效劳时间intshengyutime;/乘f余时间char*state;/所处状态structshijian*next;structshijian*time()inta,i;structshijian*head,*rear,*p,*q,*t;/定义队首、队尾、P是队尾指针、Q是队首指针和执行时间head=rear=NULL;/初始化队首和队尾为空printf("请输入进程数目:&

13、;quot;);scanf("%d",&a);for(i=0;i<a;i+)p=(structshijian*)malloc(sizeof(structshijian);/初始化一个空间给进程进入printf("输入第个进程的名字、到达时间、效劳时间:n",i+1);scanf("%s%d%d",&p->name,&p->daodatime,&p->fuwutime);

14、p->shengyutime=p->fuwutime;p->state="就绪"if(rear=NULL)当输入结束时,把P的数据放到队首,以便执行下一步head=p;p->next=NULL;rear=p;else否那么执行时间就为空,队首变成Qt=NULL;q=head;while(q&&q->daodatime<p->daodatime)/当Q和Q的到达时间小于P的到达时间时,把执行时间给Qt=q;q=q->n

15、ext;if(q=head)而当Q是队首时,那么下一个队首变成P,以便每个进程都能够得到时间片p->next=head;head=p;elseif(t=rear)/当执行时间片到达队尾时(执行完时),返回给队首Prear->next=p;p->next=NULL;rear=p;else否那么给队首P占用执行时间,P执行完后到Qt->next=p;p->next=q;returnhead;/返回队首voidoutput(structshijian*head)定义输出函数structshijian*p,*t,*r;intnum;

16、printf("请输入时间片:");scanf("%d",&num);while(head!=NULL)当队首不为空时,把P给队首r=p=head;while(p!=NULL)/把执行时间给队首t=head;p->shengyutime=p->shengyutime-num;P的乘U余时间=乘!|余时间-时间片p->state="运行"/状态变成运行态if(p->shengyutime<0)/当P运行完

17、,即剩余时间小于0时,仍然把它当做0处理p->shengyutime=0;printf("n*程序开始运行*n");printf("进程到达时间效劳时间剩余时间当前状态n");while(t!=NULL)时间不为空时,输出当前进程的信息,并把时间片交给下一个进程printf("%2c%8d%8d%14d%10sn",t->name,t->daodatime,t->fuwutime,t->shengyutime,t-&a

18、mp;gt;state);t=t->next;getchar();/按住回车键观看if(p->shengyutime=0)/当队首的剩余时间为0时,先把队首改成P的下一个,然后释放内存,删除队首节点if(p=head)head=p->next;free(p);p=head;else否那么返回执行,把队尾的下一个指针变成P的下一个指针,队尾的位置移动到队首r->next=p->next;p=r->next;r=p;else否那么把队首的位置给队尾,把队首的状态显示为“就绪状态(r=p;p->stat

19、e="就绪"p=p->next;)这是优先效劳调度算法的代码/*/typedefstructPCB2(charname10;/进程名intruntime;/要求运行时间intfrist;/定义优先数charzhuangtai;/定义状态,R为就绪,F为完成);structPCB2PCBcontrol4;/定义进程限制块数组voidyouxian()/构造优先函数(inti,n;printf("请输入进程的个数:n");scanf("%d",&n);print

20、f("请输入进程的名字、优先权、运行时间n");printf("n");for(i=0;i<n;i+)(printf("请输入第个进程的信息:n",i+1);scanf("%s%d%d",&PCB,&PCBcontroli.frist,&PCBcontroli.runtime);PCBcontroli.zhuangtai='R'进程初

21、始状态均为就绪getchar();/等待回车进入下一次运行)intmax_frist_process()/确定最大优先级进程子程序(intmax=-10;/max为最大优先数,初始化为-10inti,key;for(i=0;i<3;i+)(if(PCBcontroli.zhuangtai='r')/r表示正在运行return-1;/返回-1elseif(max<PCBcontroli.frist&&PCBcontroli.zhuangtai='R')/从就绪进程中选取优先

22、数最大的进程(max=PCBcontroli.frist;/max存放每次循环中的最大优先数key=i;/将进程号赋给keyif(PCBcontrolkey.zhuangtai='F')/具有最大优先数的进程假设已运行完毕return-1;/那么返回-1elsereturnkey;/将key作为返回值返回voidshow()/显示函数(inti;printf("n进程名优先级运行时间当前状态n");printf("*printf("%st%dt%dt%stn",&a

23、mp;PCB,PCBcontroli.frist,PCBcontroli.runtime,&PCBcontroli.zhuangtai);*n");for(i=0;i<3;i+)/依次显示每个进程的名、优先数、要求运行时间和状态printf("n请按回车键进行查看");voidrun()/进程运行子程序(inti,j;intt=0;/t为运行次数for(j=0;j<3;j+)(t+=PCBcontrolj.runtime;/运行次数即为各个进程运行时间之和printf(&

24、amp;quot;n进程没运行前,当前的状态是:n");show();/调用show()子程序显示运行前PCB的情况getchar();/等待回车进入下一次运行for(j=0;j<t;j+)(while(max_frist_process()!=-1)/具有最大优先数的进程没有运行完,让其运行(表示其正在运PCBcontrolmax_frist_process().zhuangtai='r'/将其状态置为r,行for(i=0;i<3;i+)(if(PCBcontroli.zhuangtai='r&am

25、p;#39;)(PCBcontroli.frist-=1;/将当前运行进程的优先数减1PCBcontroli.runtime-;/要求运行时间减1(if(PCBcontroli.runtime=0)PCBcontroli.zhuangtai='F'/运行完那么将该进程状态置为结束elsePCBcontroli.zhuangtai='R'/未运行完将其状态置为就绪show();/显示每次运行后各PCB的情况getchar();/等待回车进入下一次运行voidmain()(intN;intnumber;charTishikuang;/提示框doprintf("*n");printf("*桂林出版社版权所有欢送下载*n");printf("n");printf("*【进程调度*n");printf("*n");printf("*输入1一先来先效劳*n");printf("*n");printf("*n");printf(&a

温馨提示

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

评论

0/150

提交评论