ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:18.37KB ,
资源ID:12281526      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12281526.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(时间片轮转算法和优先级调度算法 C语言模拟实现 收藏.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

时间片轮转算法和优先级调度算法 C语言模拟实现 收藏.docx

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

2、调度。每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。(一)进程控制块结构如下:NAME进程标示符PRIO/ROUND进程优先数/进程每次轮转的时间片数(设为常数2)CPUTIME进程累计占用CPU的时间片数NEEDTIME进程到完成还需要的时间片数STATE进程状态NEXT链指针注:1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN当前运行进程指

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

4、),但尚未完成的进程的PCB,插到就绪队列的队尾;(3)FIRSTIN调度就绪队列的第一个进程投入运行;(4)PRINT显示每执行一次后所有进程的状态及有关信息。(5)CREATE创建新进程,并将它的PCB插入就绪队列;(6)PRISCH按优先数算法调度进程;(7)ROUNDSCH按时间片轮转法调度进程。主程序定义PCB结构和其他有关变量。(四)运行和显示程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME值。每次显示结果均为如下5个字段:name cputime needtime priority state注:1在state字段中,R代表执行态,W代表就绪(等待)态

5、,F代表完成态。2应先显示R态的,再显示W态的,再显示F态的。3在W态中,以优先数高低或轮转顺序排队;在F态中,以完成先后顺序排队。view plaincopy to clipboardprint?1. /* 2. 操作系统实验之时间片轮转算法和优先级调度算法 3. ByVisualC+6.0 4. */ #include #include #include typedefstructnode charname20;/*进程的名字*/ intprio;/*进程的优先级*/ intround;/*分配CPU的时间片*/ intcputime;/*CPU执行时间*/ intneedtime;/*进

6、程执行所需要的时间*/ charstate;/*进程的状态,W就绪态,R执行态,F完成态*/ intcount;/*记录执行的次数*/ structnode*next;/*链表指针*/ PCB; PCB*ready=NULL,*run=NULL,*finish=NULL;/*定义三个队列,就绪队列,执行队列和完成队列*/ intnum; voidGetFirst();/*从就绪队列取得第一个节点*/ voidOutput();/*输出队列信息*/ voidInsertPrio(PCB*in);/*创建优先级队列,规定优先数越小,优先级越高*/ voidInsertTime(PCB*in);/*

7、时间片队列*/ 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: casep

8、: PrioCreate(); Priority(); break; caseR: caser: TimeCreate(); RoundRun(); break; 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); w

9、hile(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) 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%ctt%dn,p-na

10、me,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; ready=in; else while(fst

11、-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; if(ready=NULL) in-next=ready; ready=in; else while(fst-next!=NUL

12、L) fst=fst-next; in-next=fst-next; fst-next=in; voidInsertFinish(PCB*in)/*将进程插入到完成队列尾部*/ PCB*fst; fst=finish; if(finish=NULL) in-next=finish; finish=in; else while(fst-next!=NULL) fst=fst-next; in-next=fst-next; fst-next=in; voidPrioCreate()/*优先级调度输入函数*/ PCB*tmp; inti; printf(输入进程名字和进程所需时间:n); for(i

13、=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);/*按照优先级从高到低,插入到就绪队列*/ voidTimeCreate()/*时间片输入函数*/ PCB*tmp; inti; printf(输入进程名字和进程时间片所需时间:n); for(i=0;iname); getchar(); sc

14、anf(%d,&(tmp-needtime); tmp-cputime=0; tmp-state=W; tmp-prio=0; tmp-round=2;/*假设每个进程所分配的时间片是2*/ tmp-count=0; InsertTime(tmp); voidPriority()/*按照优先级调度,每次执行一个时间片*/ intflag=1; GetFirst(); while(run!=NULL)/*当就绪队列不为空时,则调度进程如执行队列执行*/ Output();/*输出每次调度过程中各个节点的状态*/ while(flag) run-prio-=3;/*优先级减去三*/ run-cpu

15、time+;/*CPU时间片加一*/ run-needtime-;/*进程执行完成的剩余时间减一*/ if(run-needtime=0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/ run-state=F; run-count+;/*进程执行的次数加一*/ InsertFinish(run); flag=0; else/*将进程状态置为W,入就绪队列*/ run-state=W; run-count+;/*进程执行的次数加一*/ InsertTime(run); flag=0; flag=1; GetFirst();/*继续取就绪队列队头进程进入执行队列*/ voidRou

16、ndRun()/*时间片轮转调度算法*/ intflag=1; GetFirst(); while(run!=NULL) Output(); while(flag) run-count+; run-cputime+; run-needtime-; if(run-needtime=0)/*进程执行完毕*/ run-state=F; InsertFinish(run); flag=0; elseif(run-count=run-round)/*时间片用完*/ run-state=W; run-count=0;/*计数器清零,为下次做准备*/ InsertTime(run); flag=0; flag=1; GetFirst();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1