您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 操作系统第六章实验——处理机管理
1第六章处理机管理软件1211102052019金凯1.实验题目:用FCFS、RR和优先级调度算法来模拟处理机调度FCFS:在多道程序或多任务系统中,系统中同时处于就绪态的进程又若干个,也就是说能运行的进程数远远大于处理机个数,为了使系统中的各个进程能有条不紊的运行,必须选择某种调度策略,以选择一进程占用处理机。RR:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务FCFS(firstcomefirstservice)总是把当前处于就绪队列之首的那个进程调度到运行状态。也就说,它只考虑进程进入就绪队列的先后,而不考虑它的下一个CPU周期的长短及其他因素。FCFS算法简单易行,但性能却不大好。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。优先级调度:(1)当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。(2)当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。2.程序中使用的数据结构及主要符号说明structtask_struct{charname[10];/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX];23.程序流程图1main函数以及进程信息的输入开始运行主函数输出选择进程调度算法的提示信息输入数据满足要求根据满足要求的输入,调用dispatch的构造函数构生成相应的dispatch对象从文本文档lin.txt读入进程信息关闭lin/.txt文档调用进程调度算法调用显示进程调度信息的算法print()用delete语句撤销dispatch对象结束主函数的运行是否32先来先服务进程调度算法(FCFS)调用FCFSS算法按到达时间顺序排列的PQueue进程队列是否为空?否取出第PQueue中的队首元素,即PQueue队列中到达时间最早的进程模拟运行该进程,对总周转时间,总带权周转时间进行赋值,对end_time(结束时间)点赋值。并把当前进程插入Queue队列,并删除其在PQueue中的信息察看当前进程是否访问过?否输出错误提示队列PQueue是否为空?是结束FCFS函数调用4源程序注:下列程序在c++编译器cfree上通过测试,vc6.0没有经过测试。1先来先服务算法说明:这里建立了如教材127页上面的一个例子,模拟了3个作业请求处理的情况。具体可以对照教材说明进行查阅。#includeiostreamusingnamespacestd;#defineMAX10structtask_struct{charname;/*进程名称*/intnumber;/*进程编号*/floatcome_time;/*到达时间*/floatrun_begin_time;/*开始运行时间*/floatrun_time;/*运行时间*/floatrun_end_time;/*运行结束时间*/intpriority;/*优先级*/intorder;/*运行次序*/intrun_flag;/*调度标志*/}tasks[MAX];intcounter;/*实际进程个数*/intfcfs()/*先来先服务算法*/{floattime_temp=0;inti;intnumber_schedul;time_temp=tasks[0].come_time;for(i=0;icounter;i++){tasks[i].run_begin_time=time_temp;tasks[i].run_end_time=tasks[i].run_begin_time+tasks[i].run_time;tasks[i].run_flag=1;time_temp=tasks[i].run_end_time;number_schedul=i;tasks[number_schedul].order=i+1;}5return0;}intpinput()/*进程参数的初始化,按照教材127页最上面的表格*/{inti;//初始化进程数counter=3;//初始化每个到达系统的时间tasks[0].come_time=0;tasks[1].come_time=0;tasks[2].come_time=0;//初始化每个进程估计运行的时间tasks[0].run_time=28;tasks[1].run_time=9;tasks[2].run_time=3;//初始化每个进程的名字tasks[0].name='A';tasks[1].name='B';tasks[2].name='C';cout************************先来先服务算法************************endlendl;for(i=0;icounter;i++){tasks[i].run_begin_time=0;tasks[i].run_end_time=0;tasks[i].order=0;tasks[i].run_flag=0;}return0;}intpoutput()/*调度结果输出*/{inti;floatturn_round_time=0,f1,w=0;cout作业名到达时间运行时间开始时间停止时间运行次序周转时间endl;for(i=0;icounter;i++){f1=tasks[i].run_end_time-tasks[i].come_time;turn_round_time+=f1;w+=(f1/tasks[i].run_time);couttasks[i].name'\t'tasks[i].come_time'\t'tasks[i].run_time'\t'tasks[i].run_begin_time'\t'tasks[i].run_end_time'\t'tasks[i].order'\t'f1'\t'endl;6}cout平均周转时间:turn_round_time/counterendl;cout平均带权周转时间:w/counterendl;cout;cout程序测试BY:金凯endl;cout;cout测试结果:符合先来先服务算法的要求和结果endl;return0;}intmain(void){pinput();fcfs();poutput();return0;}得到的结果如下:为了验证该程序的通用性,下面我把3个作业的调度顺序改为2、1、3,对于的程序片段修改如下://初始化每个进程估计运行的时间tasks[0].run_time=9;tasks[1].run_time=28;tasks[2].run_time=3;7然后得到了下面的结果:结果符合教材127页中提到的结果,平均作业时间为29ms,进一步说明的程序的正确性和通用性。继续调整作业进入顺序,将进入顺序调整为3、2、1可以得到:8该程序结果和教材上面的结果一致,FCFS算法测试完毕!2时间片轮转法说明:这里我用了链表来存放各个进程中的信息,用环形链表来保证数据的输出。#includeiostreamusingnamespacestd;structnode//建立链表来存放进程数据{charname[5];//进程名称intneed_time;//所需要的时间intallocation;//占用cpu的情况charstate;//目前的状态R为运行,E为运行完毕node*next;//链表的尾结点};intmain(void){intn=0,num=0;node*head=NULL;node*tail=NULL;cout*********************时间片轮转调度算法*********************endlendl;cout总共有多少个进程?;cinn;//输入进程数量if(n=1){cout进程数应大于1,请重新输入!endl;return0;}for(inti=0;in;i++){node*temp=newnode;cout请输入作业名和执行时间:;cintemp-nametemp-need_time;temp-state='R';//初始状态每个进程均为运行态temp-allocation=0;//初始时进程均不占用cpunum+=temp-need_time;//用num来限制循环的次数if(!head){tail=head=temp;}else{9tail-next=temp;tail=temp;tail-next=head;}}node*p;p=head;coutendl初始时刻:endl;cout进程'\t'剩余时间'\t'状态'\t'占用cpu时间endl;while(p!=tail){coutp-name'\t'p-need_time'\t''\t'p-state'\t'p-allocation's'endl;p=p-next;}couttail-name'\t'tail-need_time'\t''\t'p-state'\t'p-allocation's'endl;node*q;intlabel=1;inti=1;while(label==1&&i=num){coutendl;label=0;while(!p-need_time){p=p-next;}if(p-need_time){p-need_time--;p-allocation++;if(p-need_time==0){p-state='E';}label=1;p=p-next;}10cout执行i秒后:endl;q=head;cout进程'\t'剩余时间'\t'状态'\t'占用cpu时间endl;while(q!=tail){coutq-name'\t'q-need_time'\t''\t'q-state'\t'q-allocation's'endl;q=q-next;}couttail-name'\t'tail-need_time'\t''\t'p-state'\t'q-allocation's'endl;i++;}coutendl;cout程序测试BY:金凯endl;cout;cout测试结果:符合时间片轮转算法的要求和结果endl;return0;}运行结果:输入的3个进程如下表作业号进入时间预计执行时间A02B01C03Ps:在这个程序我有时会遇到运行状态表示不准确的问题,比如两个进程就可以正确输出,但如果换成3个进程就可能会遇到某一进程已经运行完毕,但程序却显示仍在运行(R),但通过分析程序并没有找到解决的办法。个人觉得是下面这个程序片段有误,故在此说明。if(p-need_time){p-need_time--;p-allocation++;
本文标题:操作系统第六章实验——处理机管理
链接地址:https://www.777doc.com/doc-5881383 .html