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

上传人:gbs****77 文档编号:9682178 上传时间:2020-04-07 格式:DOC 页数:12 大小:73.50KB
返回 下载 相关 举报
时间片轮转算法和优先级调度算法-C语言模拟实现-收藏_第1页
第1页 / 共12页
时间片轮转算法和优先级调度算法-C语言模拟实现-收藏_第2页
第2页 / 共12页
时间片轮转算法和优先级调度算法-C语言模拟实现-收藏_第3页
第3页 / 共12页
点击查看更多>>
资源描述
时间片轮转算法和优先级调度算法 C语言模拟实现 收藏 一、目的和要求进程调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先数算法和时间片轮转算法的具体实施办法。二、实验内容1.设计进程控制块PCB的结构,通常应包括如下信息:进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程到完成还需要的时间、进程的状态、当前队列指针等。2.编写两种调度算法程序:优先数调度算法程序循环轮转调度算法程序3.按要求输出结果。三、提示和说明分别用两种调度算法对伍个进程进行调度。每个进程可有三种状态;执行状态(RUN)、就绪状态(READY,包括等待状态)和完成状态(FINISH),并假定初始状态为就绪状态。(一)进程控制块结构如下:NAME进程标示符PRIO/ROUND进程优先数/进程每次轮转的时间片数(设为常数2)CPUTIME进程累计占用CPU的时间片数NEEDTIME进程到完成还需要的时间片数STATE进程状态NEXT链指针注:1.为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;2.各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。(二)进程的就绪态和等待态均为链表结构,共有四个指针如下:RUN当前运行进程指针READY就需队列头指针TAIL就需队列尾指针FINISH完成队列头指针(三)程序说明1. 在优先数算法中,进程优先数的初值设为:50-NEEDTIME每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。2. 程序的模块结构提示如下:整个程序可由主程序和如下7个过程组成:(1)INSERT1在优先数算法中,将尚未完成的PCB按优先数顺序插入到就绪队列中;(2)INSERT2在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;(3)FIRSTIN调度就绪队列的第一个进程投入运行;(4)PRINT显示每执行一次后所有进程的状态及有关信息。(5)CREATE创建新进程,并将它的PCB插入就绪队列;(6)PRISCH按优先数算法调度进程;(7)ROUNDSCH按时间片轮转法调度进程。主程序定义PCB结构和其他有关变量。(四)运行和显示程序开始运行后,首先提示:请用户选择算法,输入进程名和相应的NEEDTIME值。每次显示结果均为如下5个字段:name cputime needtime priority state注:1在state字段中,R代表执行态,W代表就绪(等待)态,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;/*进程执行所需要的时间*/ charstate;/*进程的状态,W就绪态,R执行态,F完成态*/ intcount;/*记录执行的次数*/ structnode*next;/*链表指针*/ PCB; PCB*ready=NULL,*run=NULL,*finish=NULL;/*定义三个队列,就绪队列,执行队列和完成队列*/ intnum; voidGetFirst();/*从就绪队列取得第一个节点*/ voidOutput();/*输出队列信息*/ voidInsertPrio(PCB*in);/*创建优先级队列,规定优先数越小,优先级越高*/ voidInsertTime(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: casep: 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); 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) 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-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; ready=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; if(ready=NULL) in-next=ready; ready=in; else while(fst-next!=NULL) 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=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(); scanf(%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-cputime+;/*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();/*继续取就绪队列队头进程进入执行队列*/ voidRoundRun()/*时间片轮转调度算法*/ 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@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!