学年第学期操作系统课程实验报告学院:专业:班级:姓名:学号:任课教师:-2-实验题目处理机调度实验地点实验目的1.通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。2.了解Linux中进程(线程)的调度机制。3.学习使用Linux中进程(线程)调度算法,掌握相应的与调度有关的函数。实验内容1、程序说明:(1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS:firstcomefirstservice)总是把当前处于就绪队列之首的那个进程调度到运行状态。(2)轮转法就是按一定时间片(记为q)轮番运行各个进程。如果q是一个定值,则轮转法是一种对各进程机会均等的调度方法。(3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。2、具体步骤:(1)分析问题,提出解决问题的算法(2)编制程序(3)程序调试(4)记录实验结果,以及思考是否能够改善算法(1)编辑程序jcdd.c,编译并执行。#includestdio.h#includestdlib.h#defineP_NUM5#defineP_TIME50enumstate{ready,execute,block,finish};structpcbb{charname[4];intpriority;//数越大优先级越高intcputime;//已占用CPU的时间intneedtime;//执行时间intcount;enumstateprocess;structpcbb*next;};typedefstructpcbbpcb;voiddisplay_menu(){-3-printf(CHOOSETHEALGORITHM:\n);printf(1PRIORITY\n);printf(2ROUNDROBIN\n);printf(3EXIT\n);}pcb*get_process(){pcb*q;pcb*p;//头指针pcb*t;//尾指针inti=0;printf(inputnameandtime\n);while(iP_NUM){q=(pcb*)malloc(sizeof(pcb));scanf(%s,q-name);scanf(%d,&q-needtime);q-cputime=0;q-priority=P_TIME-q-needtime;q-process=ready;q-next=NULL;if(i==0){p=q;t=q;}else{t-next=q;t=q;}i++;}returnp;}voidfree_process(pcb*p){pcb*q;while(p!=NULL){q=p;p=p-next;free(q);}}voiddisplay(pcb*p){printf(namecputimeneedtimeprioritystate\n);while(p){printf(%s,p-name);printf();printf(%d,p-cputime);-4-printf();printf(%d,p-needtime);printf();printf(%d,p-priority);printf();switch(p-process){caseready:printf(ready\n);break;caseexecute:printf(execute\n);break;caseblock:printf(block\n);break;casefinish:printf(finish\n);break;}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){//让t指向优先级最高的进程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;p=get_process();intcpu=0;while(!process_finish(p)){//就绪队列中还有进程cpu++;printf(cputime:%d\n,cpu);cpuexe(p);//选择优先级最高的进程执行一个时间单位display(p);//每调度一次就显示次sleep(2);}free_process(p);//释放所有进程printf(Allprocesseshavefinished\n);}pcb*get_process_round(){pcb*q;pcb*p;//头指针pcb*t;//尾指针inti=0;printf(inputnameandtime\n);while(iP_NUM){q=(pcb*)malloc(sizeof(pcb));scanf(%s,q-name);scanf(%d,&q-needtime);q-cputime=0;q-count=0;q-process=ready;q-next=NULL;if(i==0){p=q;t=q;}else{t-next=q;t=q;}i++;}returnp;}voidcpu_round(pcb*q){if(q-needtime==1)q-cputime++;elseq-cputime+=2;-6-q-needtime-=2;if(q-needtime0){q-needtime=0;}q-count++;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;//k是刚刚被执行的节点,如果t-next=k,所明就绪队列除了k和t以外都已结束,按照时间片轮转算法,该t执行while(t-next!=k&&t-process==finish){t=t-next;}}returnt;}voidset_state(pcb*p){while(p){if(p-needtime==0){p-process=finish;}if(p-process==execute){p-process=ready;}p=p-next;}}voiddisplay_round(pcb*p){printf(namecputimeneedtimecountstate\n);while(p){printf(%s,p-name);printf();printf(%d,p-cputime);printf();printf(%d,p-needtime);printf();printf(%d,p-count);printf();-7-switch(p-process){caseready:printf(ready\n);break;caseexecute:printf(execute\n);break;caseblock:printf(block\n);break;casefinish:printf(finish\n);break;}p=p-next;}}voidround_cal(){pcb*p;pcb*r;p=get_process_round();intcpu=0;r=p;while(!process_finish(p)){//就绪队列中还有进程if(r-needtime==1)cpu+=1;elsecpu+=2;//时间片长度是2cpu_round(r);r=get_next(r,p);//获得下一个需要执行的进程printf(cputime:%d\n,cpu);display_round(p);//每调度一次就显示次set_state(p);sleep(2);}free_process(p);//释放所有进程}main(){display_menu();intk;scanf(%d,&k);switch(k){case1:priority_cal();break;case2:round_cal();break;case3:break;default:printf(YOUHAVENOTCHOOSEANYALGORITHM!\n);}}(2)编辑程序先来先服务调度算法fcfs.c,编译并执行。#includestdio.h#includestdlib.hintSUM=0,K=0;typedefstructlink-8-{inttime;intaverageTime;intpriority;structlink*next;}linknode;linknode*creat(){intn,m;linknode*head,*r,*s;head=r=(linknode*)malloc(sizeof(linknode));printf(输入各进程的处理时间和优先级并以两个0为结束标志:\n);while(scanf(%d%d,&n,&m)&&n&&m){s=(linknode*)malloc(sizeof(linknode));K++;s-time=n;s-priority=m;s-averageTime=0;r-next=s;r=s;}r-next=NULL;returnhead;}linknode*seekAverageTime(linknode*head){intsum=0;linknode*p;p=head-next;while(p){sum=sum+p-time;p-averageTime=sum;p=p-next;SUM+=sum;}}voidprint(linknode*head){linknode*p;p=head-next;printf(各进程处理时间为:);while(p){-9-printf(%-4d,p-averageTime);p=p-next;}printf(\n);}main(){linknode*head;head=creat();seekAverageTime(head);print(head);printf(平均处理时间为:%d\n,(SUM/K));}实验结果(1)优先级调度-10--11-(2)时间片轮转调度-12-(3)先来先服务调度-13-遇到问题及解决方法