时间片轮转算法及优先级调度算法C语言模拟实现收藏_第1页
时间片轮转算法及优先级调度算法C语言模拟实现收藏_第2页
时间片轮转算法及优先级调度算法C语言模拟实现收藏_第3页
时间片轮转算法及优先级调度算法C语言模拟实现收藏_第4页
时间片轮转算法及优先级调度算法C语言模拟实现收藏_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、WORD格式整理.时间片轮转算法和优先级调度算法C语言模拟实现收藏1里一、目的和要求进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。二、实验内容1 .设计进程控制块PCB的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的CPU寸问、进程到完成还需要的时间、进程的状态、当前队列指针等。2 .编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3 .按要求输出结果。三、提示和说明分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执

2、行状态(RUN、就绪状态(READY&括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。(一)进程控制块结构如下:NAME-进程标不符PRIO/ROUN进程优先数/进程每次轮转的时间片数(设为常数2)CPUTIME一进程累计占用CPUB勺时间片数NEEDTIM进程到完成还需要的时间片数STATE-进程状态NEXT-一链指针注:1 .为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;2 .各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。.专业知识分享WORD格式整理.(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RU当前运

3、行进程指针READ就需队列头指针TAIL就需队列尾指针FINISH完成队列头指针(三)程序说明1 .在优先数算法中,进程优先数的初值设为:50-NEEDTIME每执行一次,优先数减1,CPU寸间片数加1,进程还需要的时间片数减1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU寸间片数加2,进程还需要的时间片数减2,并退出CPU排到就绪队列尾,等待下一次调度。2 .程序的模块结构提示如下:整个程序可由主程序和如下7个过程组成:(1) INSERT1在优先数算法中,将尚未完成的PCBK优先数顺序插入到就绪队列中;(2) INSERT2-在轮转法中,将执行了一个时间片

4、单位(为2),但尚未完成的进程的PCB插到就绪队列的队尾;(3) FIRSTIN调度就绪队列的第一个进程投入运行;(4) PRINT-显示每执行一次后所有进程的状态及有关信息。(5) CREATE一创建新进程,并将它的PCBS入就绪队列;(6) PRISCH按优先数算法调度进程;(7) ROUNDSCH按时间片轮转法调度进程。主程序定义PCB结构和其他有关变量。(四)运行和显示程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME值。每次显示结果均为如下5个字段:namecputimeneedtimeprioritystate.专业知识分享WORD格式整理.注:1 .在s

5、tate字段中,R代表执行态,W代表就绪(等待)态,F代表完成态。2.应先显示R态的,再显示W态的,再显示F态的。3.在W态中,以优先数高低或轮转顺序排队;在F态中,以完成先后顺序排队。viewplaincopytoclipboardprint?1. /*2. 操作系统实验之时间片轮转算法和优先级调度算法3. ByVisualC+6.04. */#include#include#includetypedefstructnodecharname20;/*进程的名字*/intprio;/*进程的优先级*/intround;/*分配CPU的时间片*/intcputime;/*CPU执行时间*/int

6、needtime;/*进程执行所需要的时间*/charstate;/*进程的斗犬态,W就绪态,R执彳T态,F完成态*/intcount;/*记录执行的次数*/structnode*next;/*链表指针*/PCB;PCB*ready=NULL,*run=NULL,*finish=NULL;/*定义三个队列,就绪队列,执行队列和完成队列*/intnum;.专业知识分享WORD格式整理.voidGetFirst();/*从就绪队列取得第一个节点*/voidOutput();/*输出队列信息*/voidInsertPrio(PCB*in);/*创建优先级队列,规定优先数越小,优先级越高*/voidI

7、nsertTime(PCB*in);/*时间片队列*/voidInsertFinish(PCB*in);/*时间片队列*/voidPrioCreate();/*优先级输入函数*/voidTimeCreate();/*时间片输入函数*/voidPriority();/*按照优先级调度*/voidRoundRun();/*时间片轮转调度*/intmain(void)charchose;printf(请输入要创建的进程数目:n);scanf(%d,&num);getchar();printf(输入进程的调度方法:(P/R)n);scanf(%c,&chose);switch(chose)caseP:

8、casep:PrioCreate();Priority();break;caseR:caser:TimeCreate();RoundRun();break;.专业知识分享WORD格式整理.default:break;)Output();return0;)voidGetFirst()/*取得第一个就绪队列节点*/run=ready;if(ready!=NULL)run-state=R;ready=ready-next;run-next=NULL;)voidOutput()/*输出队列信息*/PCB*p;p=ready;printf(进程名t优先级t轮数tcpu时间t需要时间t进程犬态t计数器n)

9、;while(p!=NULL)printf(%st%dt%dt%dt%dtt%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count);p=p-next;)p=finish;while(p!=NULL).专业知识分享WORD格式整理.(printf(%st%dt%dt%dt%dtt%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count);p=p-next;p=run;while(p!=NULL)(printf(%st%dt%dt%dt%dtt

10、%ctt%dn,p-name,p-prio,p-round,p-cputime,p-needtime,p-state,p-count);p=p-next;voidInsertPrio(PCB*in)/*创建优先级队列,规定优先数越小,优先级越低*/(PCB*fst,*nxt;fst=nxt=ready;if(ready=NULL)/*如果队列为空,则为第一个元素*/(in-next=ready;ready=in;else/*查到合适的位置进行插入*/(if(in-prio=fst-prio)/*比第一个还要大,则插入到队头*/(in-next=ready;.专业知识分享WORD格式整理.rea

11、dy=in;)else(while(fst-next!=NULL)/*移动指针查找第一个别它小的元素的位置进行插入*/(nxt=fst;fst=fst-next;)if(fst-next=NULL)/*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/(in-next=fst-next;fst-next=in;)else/*插入到队列中*/(nxt=in;in-next=fst;)voidInsertTime(PCB*in)/*将进程插入到就绪队列尾部*/PCB*fst;fst=ready;.专业知识分享WORD格式整理.if(ready=NULL)(in-next=ready;read

12、y=in;)else(while(fst-next!=NULL)(fst=fst-next;)in-next=fst-next;fst-next=in;)void(InsertFinish(PCB*in)/*将进程插入到完成队列尾部*/PCB*fst;fst=finish;if(finish=NULL)(in-next=finish;finish=in;)else(while(fst-next!=NULL)(fst=fst-next;.专业知识分享.WORD格式整理.)in-next=fst-next;fst-next=in;)voidPrioCreate()/*优先级调度输入函数*/(PCB

13、*tmp;inti;printf(输入进程名字和进程所需时间:n);for(i=0;iname);getchar();/*吸收回车符号*/scanf(%d,&(tmp-needtime);tmp-cputime=0;tmp-state=W;tmp-prio=50-tmp-needtime;/*设置其优先级,需要的时间越多,优先级越低*/tmp-round=0;tmp-count=0;InsertPrio(tmp);/*按照优先级从高到低,插入到就绪队列*/.专业知识分享WORD格式整理.)voidTimeCreate()/*时间片输入函数*/(PCB*tmp;inti;printf(输入进程名

14、字和进程时间片所需时间:n);for(i=0;iname);getchar();scanf(%d,&(tmp-needtime);tmp-cputime=0;tmp-state=W;tmp-prio=0;2*/tmp-round=2;/*假设每个进程所分配的时间片是tmp-count=0;InsertTime(tmp);)voidPriority()/*按照优先级调度,每次执行一个时间片*/(intflag=1;GetFirst();.专业知识分享WORD格式整理.while(run!=NULL)/*当就绪队列不为空时,则调度进程如执行队列执彳T*/Output();/*输出每次调度过程中各个

15、节点的状态*/while(flag)(run-prio-=3;/*优先级减去三*/run-cputime+;/*CPU时间片加一*/run-needtime-;/*进程执行完成的剩余时间减一*/F,if(run-needtime=0)/*如果进程执行完毕,将进程状态置为将其插入到完成队列*/(run-state=F;run-count+;/*进程执行的次数加一*/InsertFinish(run);flag=0;else/*将进程状态置为W入就绪队列*/(run-state=W;run-count+;/*进程执行的次数加一*/InsertTime(run);flag=0;flag=1;GetFirst();/*继续取就绪队列队头进程进入执行队列*/.专业知识分享WORD格式整理.voidRoundRun()/*时间片轮转调度算法*/(intflag=1;GetFirst();while(run!=NULL)(Output();while(flag)(run-

温馨提示

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

评论

0/150

提交评论