《处理器调度实验报告.docx》由会员分享,可在线阅读,更多相关《处理器调度实验报告.docx(11页珍藏版)》请在优知文库上搜索。
1、处理器调度班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:选择一个调度算法,实现处理器调度。在采用多道程序设计的系统中,往往有假设干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。实验内容与分析设计:本实验有两个题,学生可选择其中的一题做实验。第一题:设计一个按优先数调度算法实现处理器调度的程序。提示:(1)假定系统有五个进程,每-个进程用一个进程控制块PCB来代表,进程控制块的格式为:进程名,指针,要求运行时间,优先数,状态(2)在每次运
2、行你所设计的处理器调度程序之前,为每个进程任意确定它的优先数和“要求运行时间。(3)为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。(4)处理器调度总是选队首进程运行.采用动态改变优先数的方法,进程每运行一次优先数就减1。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数一1要求运行时间-1来模拟进程的一次运行.提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5)进程运行一次后,假设要求运行时间0,那么再将它
3、参加队列(按优先数大小插入,且置队首标志):假设要求运行时间=0,那么把它的状态修改成结束(E),且退出队列。(6)假设就绪状态的进程队列不为空,那么重复上面(4)和(5)的步骤,直到所有进程都成为“结束状态。(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。(8)为五个进程任意确定一组优先数和要求运行时间,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。第二题:设计一个按时间片轮转法实现处理器调度的程序。提示:(1)假定系统有五个进程,每一个进程用-个进程控制块PCB来代表。进程控制块的格式为:
4、进程名,指针,要求运行时间,己运行时间,状态(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的要求运行时间。(3)把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用标志单元记录轮到运行的进程。(4)处理器调度总是选择标志单元指示的进程运行。(5)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与己运行时间,假设该进程的要求运行时间己运行时间,那么表示它尚未执行结束,应待到下一轮时再运行。假设该进程的要求运行时间=已运行时间,那么表示它已经执行结束,应指导它的状态修改成结束(E)且退出队列。此时,应把该
5、进程的进程控制块中的指针值送到前面一个进程的指针位置。(6)假设就绪状态的进程队列不为空,那么重复上面的(4)和(5)的步骤,直到所有的进程都成为结束状态。(7)在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。(8)为五个进程任意确定一组要求运行时间,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。实验步骤与调试过程:1 .翻升vc,新建工程,并建基于控制台的文件2 .确定五个进程并在运行所设计的处理器调度程序前确定每个进程要求运行时间3 .把五个进程按顺序排成循环队列,用指针指出队列连接情况4 .需求分析
6、:了解根本原理,确定程序的根本功能,查找相关资料,画出根本的数据流图;【先来先效劳流程图】(开始-初始化说有的JCB使JCB按作业提交的时刻的先后顺序排队时间量Tl=O-调度对首作业投入运行-计算并打印作业i的完成时间Tc周转时间Ti带权周转时间Wi-更改时间量T的值-等待队列空?-空(不空一调度对首作业投入运行)-计算并打印这组作业的平均周转时间及带权平均周转时间-结束);【高优先权流程图】开始-初始化PCB,输入进程信息-各进程按优先数从高到低排列-就绪队列空?-(空-结束)不空-就绪队列进程投入运行-时间片到,运行进程已占用CPU时间+1-运行进程己占用CPU时间已到达所需的运行时间-(
7、己到达-进程完成,撤销该进程)-未到达-是运行进程的优先数T把运行进程插入就绪队列-就绪队列空?-)【按时间片轮转调度】(系统初始化-启动计数器-读取DTMF编码、摘、挂机信号-Of用户编号-所有用户任务以调用?-(没有调用-根据用户编号,子程序号调用相应任务-指向下一用户,编号+1-所有用户任务以调用?-)已调用-发送DTMF编码-定时时间己到?-(没有到-定时时间己到?-)-己到-启动计数器)6 .在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化7 .为五个进程任意确定组“要求运行时间,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名
8、以及进程控制块的动态变化过程。5.运行测试:实验结果:运行后可执行输入总进程个数后,显示出进程名,总运行时间,已运行时间,状态等信息,分别开始运行程序。运行完毕后会显示a进程己运行结束,进程被删除。完成处理器调度试验。四、疑难与小结:通过本次试验,我对处理器调度思想有了进-步的了解,通过动手实现其调度算法,更加深刻的理解了时间片轮调度算法与其他几种算法的不同优点。同时,在实验过程中,回忆书本上的理论知识,稳固了我的知识。1 轮转法就是按-定时间片(记为q)轮番运行各个进程。如果q是一个定值,那么轮转法是种对各进程时机均等的调度方法。2 .优先级调度的根本思想是,把肖前处于就绪队列中优先级最高的
9、进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。3 .先来先效劳调度算法:高响应比优先实现进程调度.(用C语言实现),如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先效劳(FCFS:firstcomefirstSerViCe)总是把当前处于就绪队列之首的那个进程调度到运行状态。4 .优先级调度程序:该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。5.时间片轮转法程序:在此程序中由于程序比拟小,未进行分模块设计。直接采用单模块。五、主要算法和程序清单:按时间片轮转法:#includcSincludeusingnamespacestd;typ
10、edefstructPNodestructPNode*next;charname10;intALL_Time;intRunedTime;charstate;*Proc;intProcNum;voidInitPCB(Proc&H)COUtG请输入总进程个数:;cinProcNum;intNum=ProcNum;H=(Proc)malIoc(sizeof(PNode);H-next=NULL;Procp=H;COIIt总进程个数为ProcNumnext=(Proc)malIoc(sizeof(PNode);CoUtpnamep-ALL-Timep-RunedTime;p-state=R;p-nex
11、t=NULL;p-next=H-next;voidDispInfo(ProcH)Procp=Hnext;doif(p-state!=E)CoUtX进程名:*name*t总运行时间:p-ALL_TimoRunod_Timcvt状态:*p-StHtenext;elsep=p-next;)while(p!=H-next);voidSJP_Simu1ator(Proc&H)coutendlnext;while(p-ALL_Timep-RuncdTime)round+;coutendl*Round*round*正在运行name进程RuncdTime+;DispInfo(三);if(p-ALL_Time=
12、p-RunedTime)p-state=,E;flag;COUtnamZU进程己运行结束,进程被删除!n;p=p-next;while(flag&p-ALL_Time=p-RunedTime)p=p-next;coutendl*ENDn*;voidmain()ProcH;InitPCB(三);DispInfo(三);SJP-Simulator(三);system(*pause*);先来先效劳法:#includefloatt,d;/*定义两个全局变最*/struct/*定义一个结构体数组,包括进程的信息*/intid;floatArriveTime;floatRequestTime;floatS
13、tartTimc;floatEndTime;floatRunTime;floatDQRunTimc;intStatus;arrayTask4;/*定义初始化的结构体数组*/GotTaSko/*给结构体数组赋值,输入到达,效劳时间*/inti;floata;for(i=0;i4;i+)arrayTaski.id=i+l;printf(*inputthenumber);printf(*inputthetheArriveTimeofarrayTask%d:*,i);*用户输入进程的时间,初始为零*/SCanf(%f,&a);arrayTaski.ArriveTime=a;printf(*inputt
14、heRequestTimeofarrayTask%di);SCanf(%f,&a);arrayTaski.RequestTime=a;arrayTaski.StartTime=0;arrayTaski.EndTime=O;arrayTaski.RunTime=O;arrayTaski.Status=O;*开始默认的标志位零*/intfcfs()/*定义FCFS中寻找未执行的进程的最先到达时间*/inti,j,w=0;/*在结构体数组中找到一个未执行的进程*/for(i=0;i4;i+)if(arrayTaski.Status=O)t=arrayTaski.ArriveTime;w=l;if(w=l)break;for(i=0;i4;i+)/*查找数组中到达时间最小未执行的进程*/if(arrayTaski.ArriveTimot&arrayTaski.Status=O)t=arrayTask