实验2处理器调度学院:计算机与软件专业:软件工程日期:2014年5月18日姓名:学号:指导老师:一、实验题目按时间片轮转法实现处理器调度的模拟设计与实现二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。三、实验内容:(1)实验思想假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名——作为进程的标识,假设五个进程的进程名分别为Q1,Q2,Q3,Q4,Q5。每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到P2执行,则有:标志单元K2K1Q1K2Q2K3Q3K4Q4K5Q5K2K3K4K5K12312410000RRRRRPCB1PCB2PCB3PCB4PCB5处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。若“就绪”状态的进程队列不为空,则重复上面步骤,直到所有的进程都成为“结束”状态。(2)流程图(3)总体设计(4)详细设计四、实验结果1、实验截图2、实验代码#includestdio.h#includestdlib.h#includestring.h#includewindows.h#definenum5structPCB{charname;//进程名inttime;//要求运行时间intpriority;//优先数charstate;//状态R就绪,E结束};voidinit(PCB*p)//PCB初始化子程序{printf(\n请分别输入:进程名进程优先级进程运行时间\n);for(inti=0;inum;i++){//为每个进程输入信息printf(\n输入PCB%d:\n,i+1);scanf(%s%d%d,&p[i].name,&p[i].priority,&p[i].time);p[i].state='R';//假设进程初始状态均为就绪Rgetchar();}}voidrun(PCB*p)//进程运行子程序{intt=0;//t为运行次数for(intj=0;jnum;j++){t+=p[j].time;}//运行次数即为各个进程运行时间之和printf(\n);printf(\n);printf(\n运行前进程状态显示:\n);printf(\n执行前进程信息显示:\n);printf(********************************************\n);printf(进程名进程优先级进程运行时间进程状态:\n);for(inti=0;inum;i++){printf(\n%s%d%d%c\n,&p[i].name,p[i].priority,p[i].time,p[i].state);}printf(********************************************\n);printf(按任意键继续执行:\n);getchar();//等待输入回车符while(t0){for(i=0;inum;i++){if(p[i].time)//具有最大优先数的进程没有运行完,让其运行{p[i].state='r';//将其状态置为r,表示其正在运行printf(\n子进程信息显示:\n);printf(********************************************\n);printf(进程名进程优先级进程运行时间进程状态:\n);for(j=0;jnum;j++){if(i==j){printf(\n%s%6d%8d%c-----该进程正在执行\n,&p[j].name,p[j].priority,p[j].time,p[j].state);if(p[j].priority0)p[j].priority-=1;//将当前运行进程的优先数减1p[j].time--;//要求运行时间减1t--;if(p[j].time==0)p[j].state='E';//运行完则将该进程状态置为结束elsep[j].state='R';//未运行完将其状态置为就绪}elseprintf(\n%s%6d%8d%c\n,&p[j].name,p[j].priority,p[j].time,p[j].state);}printf(********************************************\n);printf(\n进程正在进行............\n);}}}printf(\n执行后进程信息显示:\n);printf(********************************************\n);printf(进程名进程优先级进程运行时间进程状态:\n);for(i=0;inum;i++){printf(\n%s%d%d%c\n,&p[i].name,p[i].priority,p[i].time,p[i].state);}printf(********************************************\n);printf(\n进程执行完成\n);}voidmain()//按动态优先数调度主程序{structPCBp[num];init(p);//初始化各个进程PCBrun(p);//进程调度模拟}