您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统课程设计——进程调度模拟算法(5种)
福建农林大学计算机与信息学院课程设计报告课程名称:操作系统实习题目:进程调度算法模拟姓名:***系:计算机专业:计算机科学与技术年级:2011级学号:**指导教师:***职称:***2014年1月16日福建农林大学计算机与信息学院信息工程类课程设计报告结果评定评语:成绩:指导教师签字:评定日期:目录1.进程调度算法模拟课程设计的目的……………………………………………12.进程调度算法模拟课程设计的要求……………………………………………13.进程调度算法模拟课程设计报告内容…………………………………………13.1前言………………………………………………………………………13.2进程调度算法模拟设计的环境…………………………………………13.3系统流程图及各模块……………………………………………………24.总结…………………………………………………………………………18参考文献………………………………………………………………………19参考网站………………………………………………………………………19进程调度算法模拟1.进程调度算法模拟课程设计的目的和意义2013-2014学年,在学习了《操作系统》这门课后,对当中的进程调度算法产生了浓厚的兴趣。各种调度算法,理论上比较好理解。为了加深印象,我决定把各种调度算法用C语言写出来。于是便产生这份从头到尾都让我绞尽脑汁的课程设计。做这份课程设计,对从事系统开发的人员来说,是必要的,可以在一定程度上为自己以后的发展铺路。虽然用处不是特别明显,但对加深系统调用算法的理解无疑用处是巨大的。2.进程调度算法模拟课程设计的要求1.用C语言写出至少两种进程调度算法。2.画出大概流程图。3.对算法过程出现的bug进行调试。4.展示最后的算法结果3.1前言:目前比较常见的几种进程调度算法有:1.先到先服务(FCFS)2.短进程优先(非抢占和抢占)算法(SPF)3.高响应比优先算法4.时间片轮转算法我选出其中三种即先到先服务,短进程优先(2种)和时间片轮转算法进行C语言描述以加深对这三种算法的理解。3.2进程调度算法模拟设计的环境VC++6.0及CodeBlocks,32位计算机WIN7操作系统。3.3流程图定义进程结构体:structPro{intnum;//进程号inttime_in;//进程到达时间intwork_time;//进程服务时间intbtime;//用于抢占式进程优先记录该进程开始时间intl_w_time;//用于抢占式进程优先记录剩余服务时间intend_time;//记录该进程结束时间,(需要时时监测)intjudge;//用于需要时的标记}pro[10];//进程结构体1先到先服务算法描述:把所有进程按到达先后排序,每次取最先到的进程执行后淘汰,再取下一个,直到所有进程调度完毕。主要代码:voidFCFS()//先到先服务{chars[]={先到先服务};printmat(s);PT;inti,j;intmin;intt=pro_num;intbegin_time=0x7fff;for(i=1;i=pro_num;i++){if(pro[i].time_inbegin_time)begin_time=pro[i].time_in;pro[i].judge=0;//所有进程号查找标志置0,表示还未查找}while(t--){for(i=1;i=pro_num;i++){if(pro[i].judge==0){min=i;//设其为目前最早到达的时间for(j=i+1;j=pro_num;j++){if(pro[j].judge==0&&pro[j].time_in=pro[min].time_in)//该进程号若还未被查找且小于预设min=j;}pro[min].judge=1;//该进程号被查找过printf(Format2,pro[min].num,pro[min].time_in,pro[min].work_time,begin_time,begin_time+pro[min].work_time,begin_time+pro[min].work_time-pro[min].time_in);begin_time+=pro[min].work_time;puts();}}}printmat(s);puts();}程序截图:2段进程优先非抢占算法描述:每次选出最短的进程进行调度,调度完毕则淘汰,直到所有进程都调度完毕;voidSJF()//短进程优先(非抢占){chars[]=非抢占短进程优先;printmat(s);PT;structPro*p,*q,*head;intt_num,t_work_time,t_time_in;head=&pro[1];/************************按所有进程到达时间排序*************/p=head;while(p-headpro_num){for(q=p+1;q-headpro_num;q++){if(q-time_inp-time_in||(q-work_timep-work_time&&q-time_in==p-time_in)){t_num=p-num,t_time_in=p-time_in,t_work_time=p-work_time;p-num=q-num,p-time_in=q-time_in,p-work_time=q-work_time;q-num=t_num,q-time_in=t_time_in,q-work_time=t_work_time;}}p++;}/*************************************************************//**********找出第一个执行的进程,即最先到达的最短进程*********/inttime=0;p=head;for(q=head;qhead+pro_num;q++){q-judge=0;if(q-time_inp-time_in)p=q;if(q-time_in==p-time_in&&q-work_timep-work_time)p=q;}intcnt=pro_num;p=head;while(cnt--){time=timep-time_in?p-time_in:time;p-judge=1;p-begin_time=time;time+=p-work_time;p-end_time=time;for(q=head;qhead+pro_num;q++){if(p-judge==1&&q-judge==0)p=q;elseif(p-judge==0&&(q-work_timep-work_time)){p=q;}}}for(p=head;phead+pro_num;p++){printf(Format2,p-num,p-time_in,p-work_time,p-begin_time,p-end_time,p-end_time-p-time_in);puts();}printmat(s);puts();}3短进程优先(抢占)算法描述:按时间叠加,当新进程到达时,判断如果比当前执行的进程短,则发生抢占,执行完的淘汰,直到所有进程都调度完毕。intfind(intpp,inttime){inti;for(i=1;i=pro_num;i++){if(pro[pp].l_w_time==0||(pro[i].l_w_time!=0&&pro[i].l_w_timepro[pp].l_w_time&&time=pro[i].time_in))pp=i;}returnpp;}voidtest(){inti;for(i=1;i=pro_num;i++){printf(Format2,pro[i].num,pro[i].time_in,pro[i].work_time,pro[i].btime,pro[i].end_time,pro[i].end_time-pro[i].time_in);puts();}}voidSJF2()//抢占式短进程优先{chars[]={抢占式短进程优先};printmat(s);PT;inti;structPro*p,*q;//先对到达时间进行排序//structPro*head=&pro[1];intt_num,t_time_in,t_work_time;inttime_cnt=0,time;p=head=&pro[1];while(p-headpro_num){for(q=p+1;q-headpro_num;q++){if(q-time_inp-time_in){t_num=p-num,t_time_in=p-time_in,t_work_time=p-work_time;p-num=q-num,p-time_in=q-time_in,p-work_time=q-work_time;q-num=t_num,q-time_in=t_time_in,q-work_time=t_work_time;}}p++;}for(i=1;i=pro_num;i++){pro[i].l_w_time=pro[i].work_time;time_cnt+=pro[i].work_time;}intpp=1;time=pro[pp].time_in;while(time_cnt--){pro[pp].l_w_time--;time++;if(pro[pp].l_w_time==0){pro[pp].end_time=time;}else;if(pro[pp].btime==0&&pro[pp].time_in!=0)pro[pp].btime=time-1;else;pp=find(pp,time);}test();printmat(s);puts();}4时间片轮转(以单位1为例)取当前已经到达的进程,执行一个时间片,跳转至下一个已经到达的进程,再执行一个时间片,直到所有进程都调度完毕。voidTROT(){char*s=时间片轮转算法;printmat(s);PT;structPro*p,*q,*head;intt_num,t_time_in,t_work_time;head=&pro[1];p=head;/************************给所有进程按到达时间排序*************/while(p-headpro_num){for(q=p+1;q-headpro_num;q++){if(q-time_inp-time_in){t_num=p-num,t_time_in=p-time_in,t_work_time=p-work_time;p-num=q-num,p-time_in=q-time_in,p-work_time=q-work_time;q-num=t_num,q-time_in=t_time_in,q-work_time=t_work_time;}}p++;}/*************************************************************/inttime=pro[1].time_in;for(p=head;phead+pro_num;p++){p-judge=0;p-left_work=p-work_time;}intflag=1;for(p=head;flag;p++){if(p-time_in=time&&p-left_work0){p-left_work--;if(p-judge==0){p-judge=1;p-begin_time=time;}if(p-left_work==0)p-
本文标题:操作系统课程设计——进程调度模拟算法(5种)
链接地址:https://www.777doc.com/doc-2060743 .html