您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 进程调度算法-实验报告
操作系统实验报告实验一:进程调度算法.学生:学号:学院:系别:专业:实验时间:报告时间:一、实验内容按优先数调度算法实现处理器调度。二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。三、实验原理设计一个按优先数调度算法实现处理器调度的程序。(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。要求运行时间——假设进程需要运行的单位时间数。优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:队首标志K2K1P1K2P2K3P3K4P4K5P50K4K5K3K12312415342RRRRRPCB1PCB2PCB3PCB4PCB5(4)处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5)进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。(6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。(8)为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。四、算法流程图N对象排序成输出结果有序队列Y队列中是否建立PCB类模拟系统运行有进程对象(进程对象修改)接收进程n重新排序进程个对象五、源程序及注释#includeiostream.hclassPCB//PCB类,包含time、range、state、next指针{public:voidIn(char*n,intt,intr);PCB(){}PCB(PCB*p)//复制PCB{strcpy(name,p-name);next=p-next;time=p-time;range=p-range;state=p-state;}voidRed()//模拟进程运行状态{开始结束time--;range--;if(!time)state=0;}voidprint()//输出当前PCB内容{coutname\ttime\trange\tstateendl;}charname[10];//进程名称PCB*next;//用于链表的指针inttime;//用于记录进程运行时间intrange;//用于记录优先值intstate;//用于判断该进程是否运行结束};voidPCB::In(char*n,intt,intr)//初始化PDB对象{strcpy(name,n);time=t;range=r;next=NULL;if(t0)state=1;elsestate=0;}voidPri_Li(PCB*head)//用于输出每一次运行的结果{if(head){cout进程队列为:;for(;head;head=head-next)couthead-name,;}elsecout进程已全部运行完毕。endl;coutendl;}voidGrp(PCB*&head,PCB*p,intnum)//用于队列的排序,num为当前队列中存在的指针个数{intii=num;if(p-state)//当该对象为新进程是,插入队列{if(!num){head=p;(head)-next=NULL;}else{PCB*tp=head;PCB*tp2=head;for(;num0;num--){if(p-rangetp-range&&ii==num)//位于头部插入{p-next=head;head=p;break;}elseif(p-rangetp-range)//位于中间插入{p-next=tp;tp2-next=p;break;}else{tp2=tp;tp=tp-next;}}if(!num&&!tp)//位于尾部插入{tp2-next=p;}}}else//当该对象是已完成进程时,从队列中除去{PCB*tp=head;inttem=num;for(PCB*tp2=tp;num0;num--,tp=tp-next){if(!strcmp(p-name,tp-name)&&tem==num){head=head-next;break;}elseif(!strcmp(p-name,tp-name)){tp2-next=tp-next;break;}elsetp2=tp;}}}intPro(PCB*&p,intsum)//模拟进程运行,并重新排序队列{PCB*k,*pk;inti;for(;sum;){k=p;p-Red();cout此次运行了进程p-name剩余时间p-time权值p-rangeendl;if(!k-state){Grp(p,k,sum);sum--;}elseif(sum==1)continue;else{pk=k=k-next;for(i=sum-1;i0;i--){if(p-range=k-range&&i==sum-1)//ok{break;}elseif(p-range=k-range){pk-next=p;p=p-next;pk-next-next=k;break;}pk=k;k=k-next;}if(!i&&!k){pk-next=p;p=p-next;pk-next-next=NULL;}}Pri_Li(p);}}intmain(){intnum,sum,t,r;charn[10];cout这是一个模拟系统加权进程调度程序endl请输入总的进程数:;cinsum;PCB*PP[sum];PCB*head;for(inti=0;isum;i++){PP[i]=newPCB;cout请输入进程名称、进程运行时间、进程优先数:;cinn;cint;cinr;PP[i]-In(n,t,r);num=i;Grp(head,PP[i],num);}Pro(head,sum);getchar();return0;}六、打印的程序运行时初值和运行结果七、实验小结由于理论课的局限性,让我不能很好地理解操作系统的一些算法思路,虽然只是模仿个别思想而做成的这个小程序,但是我从中不但明白了OS程序员们对进程调度的思想,还更好地加深和理解了指针的内层含义,而不是单单地抽象概念。而且C++的程序联系地实在是太少,这同样是一次很好的锻炼。由于不是很顺手,这次试验总共花了我4个多小时,但是其中的乐趣让我忘了午饭同样每一次debug并一步步排除错误后我感到很欣慰,因为我知道,我又成长了。
本文标题:进程调度算法-实验报告
链接地址:https://www.777doc.com/doc-5980304 .html