操作系统课程设计06

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

网络教育学院继续教育学院计算机会计课程设计函授站(学习中心)株洲.会计专业12春级(春、秋)层次专科.学生姓名:耿云力.武汉理工大学《计算机会计》课程设计操作系统课程设计报告一.课程设计的目的:通过课程设计更清楚地理解下列基本概念:1.实时调度:指在实时系统下的调用,而实时系统是指系统能够在限定的响应时间内提供所需水平的服务。同时一个实时系统也是指计算的正确性不仅取决于程序的逻辑正确性,也取决于结果产生的时间,如果系统的时间约束条件得不到满足,将会发生系统出错。实时调度算法又可分为:非抢占式调度算法和抢占式调度算法。非抢占式调度算法分为:(1)非抢占式轮转调度算法。(2)非抢占式优先调度算法。抢占式调度算法分为:(1)基于时钟中断的抢占式优先权调度算法。(2)立即抢占(ImmediatePreemption)的优先权调度算法我们此次课程设计只用到了抢占式调度算法。2.最低松弛度优先算法:该算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,以使之优先执行。二.课程设计的内容:设有3个周期性的实时任务A、B、C,任务A要求每20ms执行一次,执行时间为5ms;任务B要求每30ms执行一次,执行时间为15ms;任务C要求每50ms执行一次,执行时间为10ms。试编一调度程序按最小松弛度优先算法对这3个任务进行调度并输出每次调度时被调入运行任务的状态:(任务名,所处周期数,调度时刻,运行持续时间)。注:①程序中设置一个closetime(建议定为200)控制调度程序的终止。②变化A,B,C的周期和执行时间,再运行你的程序。注意:设定实时任务的处理时间和周期时应满条件:三.三个周期性实时任务的最短松弛度优先调度算法程序:#includestdio.h#defineclosetime200#definePERIOD120/*任务1的周期*/武汉理工大学《计算机会计》课程设计#definePERIOD230/*任务2的周期*/#definePERIOD350/*任务3的周期*/#defineCPUTIME15/*任务1需要的CPU时间*/#defineCPUTIME215/*任务2需要的CPU时间*/#defineCPUTIME310/*任务3需要的CPU时间*/typedefstructTCB{intperiod;/*周期*/intcputime;/*需要的cpu时间*/intremain;/*剩余的cpu时间*/intpnum;/*所处周期数*/intlaxity;/*松弛度*/}TCB;TCBtcb[3];/*任务控制块,容易扩充为多个*/intcurtime;/*当前时间,初始为0*/voidinit(void){inti;floatf;curtime=0;/*当前时间为0*/tcb[0].period=PERIOD1;tcb[0].cputime=CPUTIME1;/*周期与*/tcb[1].period=PERIOD2;tcb[1].cputime=CPUTIME2;/*CPU时间*/tcb[2].period=PERIOD3;tcb[2].cputime=CPUTIME3;武汉理工大学《计算机会计》课程设计f=(float)tcb[0].cputime/tcb[0].period+(float)tcb[1].cputime/tcb[1].period+(float)tcb[2].cputime/tcb[2].period;/*数据合法性检查*/if(f1){printf(非法周期!);return;}for(i=0;i3;++i){tcb[i].pnum=1;/*初始周期号*/tcb[i].remain=tcb[i].cputime;/*初始剩余时间*/tcb[i].laxity=tcb[i].period-tcb[i].remain;/*初始松弛度*/}}voidschedule(void)/*调度程序*/{inti,j,m,n,p,q;/*i是被调度运行任务,j,m是未运行任务,其中m始终是松弛度次小的任务n,p,q是中间变量*/intduration;/*本次运行持续时间*/m=tcb[0].laxity=tcb[1].laxity?0:1;/*选最小松弛度的任务*/i=tcb[m].laxity=tcb[2].laxity?m:2;if(i==m){if(m==1)n=tcb[0].laxity=tcb[2].laxity?0:2;/*选最小松弛度的任务*/elsen=tcb[1].laxity=tcb[2].laxity?1:2;m=n;}n=tcb[0].laxity=tcb[1].laxity?0:1;/*求松弛度次小的*/j=tcb[n].laxity=tcb[2].laxity?n:2;if(curtimetcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/{n=i;i=m;/*选次小的任务*/武汉理工大学《计算机会计》课程设计if(curtimetcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/i=j;if(curtimetcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/{p=(tcb[0].pnum-1)*tcb[0].period=(tcb[1].pnum-1)*tcb[1].period?0:1;/*当三个进程的周期都尚未到来时,让CPU空跑至最近的进程周期处*/q=(tcb[p].pnum-1)*tcb[p].period=(tcb[2].pnum-1)*tcb[2].period?p:2;curtime=(tcb[q].pnum-1)*tcb[q].period;for(i=0;i3;++i)/*重新计算松弛度*/tcb[i].laxity=tcb[i].pnum*tcb[i].period-curtime-tcb[i].remain;schedule();}}if(tcb[i].remain=tcb[m].laxity)duration=tcb[i].remain;/*让它运行到结束*/elseduration=tcb[m].laxity;/*只能运行另一任务的松弛度的时间*/tcb[i].remain-=duration;/*修改剩余时间*/printf(任务号=%-3d周期序号=%-3d调度时刻=%-6d运行时间长度=%-3d\n,i,tcb[i].pnum,curtime,duration);curtime+=duration;/*时间推进到下一调度时刻*/if(tcb[i].remain==0){/*本周期的任务已完成*/tcb[i].pnum++;/*向前推进一个周期*/tcb[i].remain=tcb[i].cputime;/*设置初始剩余时间*/}for(i=0;i3;++i)/*重新计算松弛度*/tcb[i].laxity=tcb[i].pnum*tcb[i].period-curtime-tcb[i].remain;}武汉理工大学《计算机会计》课程设计voidmain(void){init();while(curtimeclosetime)schedule();}四.三个周期性实时任务的最短松弛度优先调度算法结果:五.最早截止时间优先即EDF算法1.最早截止时间优先EDF(EarliestDeadlineFirst)算法是非常著名的实时调度算法之一。在每一个新的就绪状态,调度器都是从那些已就绪但还没有完全处理完毕的任务中选择最早截止时间的任务,并将执行该任务所需的资源分配给它。在有新任务到来时,调度器必须立即计算EDF,排出新的定序,即正在运行的任务被剥夺,并且按照新任务的截止时间决定是否调度该新任务。如果武汉理工大学《计算机会计》课程设计新任务的最后期限早于被中断的当前任务,就立即处理新任务。按照EDF算法,被中断任务的处理将在稍后继续进行。2.该算法的思想是从两个任务中选择截至时间最早的任务,把它暂作为当前处理任务,再判断该任务是否在当前周期内,若不在当前周期内,就让另一任务暂作当前处理任务,若该任务也不在当前周期内,就让CPU空跑到最靠近的下一个截至时间的开始,若有任务在该周期内,就判断该任务的剩余时间是否小于当前截至时间与当前时间的差,若小于,则让该任务运行到结束.否则,就让该任务运行到该周期的截止时间,就立即抢回处理器,再判断紧接着的最早截至时间,并把处理器给它,做法同上,如此反复执行.3.最早截止时间优先即EDF算法的程序如下:#includestdio.h#defineclosetime200#definePERIOD110/*任务1的周期*/#definePERIOD240/*任务2的周期*/#defineCPUTIME15/*任务1需要的CPU时间*/#defineCPUTIME220/*任务2需要的CPU时间*/typedefstructTCB{intperiod;/*周期*/intcputime;/*需要的cpu时间*/intremain;/*剩余的cpu时间*/intpnum;/*所处周期数*/intlaxity;/*松弛度*/}TCB;TCBtcb[2];/*任务控制块,容易扩充为多个*/intcurtime;/*当前时间,初始为0*/武汉理工大学《计算机会计》课程设计voidinit(void){inti;floatf;curtime=0;/*当前时间为0*/tcb[0].period=PERIOD1;tcb[0].cputime=CPUTIME1;/*周期与*/tcb[1].period=PERIOD2;tcb[1].cputime=CPUTIME2;/*CPU时间*/f=(float)tcb[0].cputime/tcb[0].period+(float)tcb[1].cputime/tcb[1].period;/*数据合法性检查*/if(f1){printf(非法周期!);return;}for(i=0;i2;++i){tcb[i].pnum=1;/*初始周期号*/tcb[i].remain=tcb[i].cputime;/*初始剩余时间*/}}voidschedule(void)/*调度程序*/{inti,p;/*i是被调度运行任务,p是当前周期值*/intduration;/*本次运行持续时间*/i=tcb[0].period*tcb[0].pnum=tcb[1].period*tcb[1].pnum?0:1;/*选最早截止时间的的任务*/if(curtimetcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/{p=tcb[i].period*(tcb[i].pnum-1);i=(i+1)%2;/*选另一个任务*/if(curtimetcb[i].period*(tcb[i].pnum-1))/*尚未进入该周期*/武汉理工大学《计算机会计》课程设计curtime=p;elseif(tcb[i].remain=p-curtime)duration=tcb[i].remain;/*让它运行到结束*/elseduration=p-curtime;/*只能运行到下个周期到来时刻*/tcb[i].remain-=duration;/*修改剩余时间*/printf(任务号=%-3d周期序号=%-3d调度时刻=%-6d运行时间长度=%-3d\n,i,tcb[i].pnum,curtime,duration);curtime+=duration;/*时间推进到下一调度时刻*/if(tcb[i].remain==0){/*本周期的任务已完成*/tcb[i].pnum++;/*向前推进一个周期*/tcb[i].remain=tcb[i].cputime;/*设置初始剩余时间*/}}else{p=tcb[i].p

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功