天津大学仁爱学院操作系统实验报告实验类型:必修实验日期:2014年4月18日实验名称:进程调度实验地点:二实验楼504学生姓名:李帅帅指导教师:张磊班级:计科一班计算机科学与技术系天津大学仁爱学院——计算机科学与技术系——李帅帅-1-实验报告内容:1)实验目的用c语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。2)实验器材和设备硬件:二实验楼504计算机开发工具:MicrosoftVisualC++6.03)实验任务本实验模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解。用c语言编写和调试一个进程调度的算法程序,有一些简单的界面,能够运行,仿真操作系统中进程调度的原理和过程。通过对调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度4)实验原理无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。基本状态:1.等待态:等待某个事件的完成;2.就绪态:等待系统分配处理器以便运行;3.运行态:占有处理器正在运行。运行态→等待态往往是由于等待外设,等待主存等资源分配或等待人工干预而引起的。等待态→就绪态则是等待的条件已满足,只需分配到处理器后就能运行。运行态→就绪态不是由于自身原因,而是由外界原因使运行状态的进程让出处理器,这时候就变成就绪态。例如时间片用完,或有更高优先级的进程来抢占处理器等。就绪态→运行态系统按某种策略选中就绪队列中的一个进程占用处理器,此时就变成了运行态5)实验过程描述a)打开MicrosoftVisualC++6.0,创建工程。b)根据要求用c语言代码实现应用程序,并调试完成。c)运行程序,根据提示输入相应的字符。d)输入实验测试内容,并观察执行窗口显示的过程。天津大学仁爱学院——计算机科学与技术系——李帅帅-2-e)重复c、d过程,认真体会领悟。6)实验代码//lss.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includestdlib.h#includeconio.h#includeiostream.h#includewindows.h#defineP_NUM3#defineP_TIME50enumstate{ready,execute,block,finish};structpcb{charname[4];intpriority;intcputime;intneedtime;intcount;intround;stateprocess;pcb*next;};pcb*get_process(){pcb*q;pcb*t;pcb*p;inti=0;t=(structpcb*)malloc(sizeof(pcb));p=(structpcb*)malloc(sizeof(pcb));coutInputNameandTimeendl;while(iP_NUM){天津大学仁爱学院——计算机科学与技术系——李帅帅-3-q=(structpcb*)malloc(sizeof(pcb));cinq-name;cinq-needtime;q-cputime=0;q-priority=P_TIME-q-needtime;q-process=ready;q-next=NULL;if(i==0){p=q;t-next=q;}else{q-next=t-next;t=q;q=p;}i++;}returnp;}voiddisplay(pcb*p){coutnamecputimeneedtimeprioritystateendl;while(p){coutp-name;cout;coutp-cputime;cout;coutp-needtime;cout;coutp-priority;cout;switch(p-process){caseready:coutreadyendl;break;caseexecute:coutexecuteendl;break;caseblock:coutblockendl;break;casefinish:coutfinishendl;break;}天津大学仁爱学院——计算机科学与技术系——李帅帅-4-p=p-next;}}intprocess_finish(pcb*q){intb1=1;while(b1&&q){b1=b1&&q-needtime==0;q=q-next;}returnb1;}voidcpuexe(pcb*q){pcb*t=q;inttp=0;while(q){if(q-process!=finish){q-process=ready;if(q-needtime==0){q-process=finish;}}if(tpq-priority&&q-process!=finish){tp=q-priority;t=q;}q=q-next;}if(t-needtime!=0){t-priority-=3;t-needtime--;t-process=execute;t-cputime++;}}天津大学仁爱学院——计算机科学与技术系——李帅帅-5-voidpriority_cal(){pcb*p;system(cls);p=get_process();intcpu=0;system(cls);while(!process_finish(p)){cpu++;coutcuptime:cpuendl;cpuexe(p);display(p);Sleep(1000);}printf(Allprocesseshavefinished,pressanykeytoexit);getch();}voiddisplay_menu(){cout\nCHOOSETHEALGORITHM:endl;cout1PRIORITYendl;cout2roundrobinendl;cout3EXITendl;}//显示调度算法菜单,可供用户选择优先权调度算法和时间轮转调度算法pcb*get_process_round(){pcb*q;pcb*t;pcb*p;inti=0;t=(structpcb*)malloc(sizeof(pcb));p=(structpcb*)malloc(sizeof(pcb));coutinputnameandtimeendl;while(iP_NUM){q=(structpcb*)malloc(sizeof(pcb));cinq-name;cinq-needtime;q-cputime=0;天津大学仁爱学院——计算机科学与技术系——李帅帅-6-q-round=0;q-count=0;q-process=ready;q-next=NULL;if(i==0){p=q;t-next=q;}else{q-next=t-next;t=q;q=p;}i++;}returnp;}voidcpu_round(pcb*q){q-cputime+=2;q-needtime-=2;if(q-needtime0){q-needtime=0;}q-count++;q-round++;q-process=execute;}pcb*get_next(pcb*k,pcb*head){pcb*t;t=k;do{t=t-next;}while(t&&t-process==finish);if(t==NULL){t=head;while(t-next!=k&&t-process==finish)天津大学仁爱学院——计算机科学与技术系——李帅帅-7-{}}returnt;}voidset_state(pcb*p){while(p){if(p-needtime==0){p-process=finish;//如果所需执行时间为0,则设置运行状态为结束}if(p-process==execute){p-process=ready;//如果未执行状态则设置为就绪}p-next;}}//设置队列中进程执行状态voiddisplay_round(pcb*p){coutNAMECPUTIMENEEDTIMECOUNTROUNDSTATEendl;while(p){coutp-name;cout;coutp-cputime;cout;coutp-needtime;cout;coutp-count;cout;coutp-round;cout;switch(p-process){caseready:coutreadyendl;break;caseexecute:coutexecuteendl;break;casefinish:coutfinishendl;break;天津大学仁爱学院——计算机科学与技术系——李帅帅-8-}p=p-next;}}//时间片轮转调度算法输出调度信息voidround_cal(){pcb*p;pcb*r;system(cls);p=get_process_round();intcpu=0;system(cls);r=p;while(!process_finish(p)){cpu+=2;cpu_round(r);r=get_next(r,p);coutcpucpuendl;display_round(p);set_state(p);Sleep(1000);}}intmain(intargc,char*argv[]){display_menu();intk;scanf(%d,&k);while(1){switch(k){case1:priority_cal();break;case2:round_cal();break;case3:return0;}display_menu();scanf(%d,&k);}printf(\n本调度算法成功结束!\n;);return0;}天津大学仁爱学院——计算机科学与技术系——李帅帅-9-7)实验结果截图天津大学仁爱学院——计算机科学与技术系——李帅帅-10-8)对实验的总结本次实验,任务是用c语言代码实现进程调度模拟系统,从而观察进程的运行过程及加深对进程的了解。这次实验,加深了我对进程概念及进程调度的理解;熟悉了进程调度算法。使得理论知识得到的实践,也使我的编程能力得到了进一步提高。实验中,我们小组共同学习、共同努力,虽然在实验中遇到了一些问题,但在查阅资料后都解决了。实验过程也让我认识到自己的不足,好多知识已经模糊不清,在今后自己要多一些实验及相关的小项目,来提高自己的编程能力。