您好,欢迎访问三七文档
1/9洛阳理工学院实验报告系别计算机系班级学号姓名课程名称操作系统实验日期2014.10.17实验名称实验一:进程调度成绩实验目的:通过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:微机一台、VC++6.0实验原理:设计程序模拟进程的时间片轮转法调度过程。假设初始状态为:有ready个进程处于就绪状态,有blocked个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过counter个时间片,唤醒处于阻塞队列队首的进程。实验内容:流程图:开始createq(&runq)createq(&rq)createq(&bq)dispatch()createJC()结束录入各进程的信息,进入模拟调度过程2/9源代码:#includestdio.h#includemalloc.h#definetrue1#definefalse0typedefstructPCB_type{charname;intstate;//进程状态//2--表示执行状态//1--表示就绪状态//0--表示阻塞状态intcpu_time;//运行需要的CPU时间(需运行的时间片个数)}pcb;typedefstructLinkQueueNode{structPCB_typePCB;structLinkQueueNode*next;}LinkQueueNode;typedefstruct{LinkQueueNode*head;LinkQueueNode*tail;}LinkQueue;LinkQueuerq,bq,runq;//ready队列、blocked队列、run队列intready=2;intblocked=3;intcounter=5;intcreateq(LinkQueue*Q)//队列创建{Q-head=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));3/9if(Q-head!=NULL){Q-tail=Q-head;Q-head-next=NULL;returntrue;}elsereturnfalse;}voidcopy(pcb*PCB1,pcb*PCB2){PCB1-name=PCB2-name;PCB1-state=PCB2-state;PCB1-cpu_time=PCB2-cpu_time;}intenterq(LinkQueue*Q,LinkQueueNodex)//入队{LinkQueueNode*q;q=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));if(q!=NULL){copy(&q-PCB,&x.PCB);q-next=NULL;Q-tail-next=q;Q-tail=q;returntrue;}elsereturnfalse;}LinkQueueNode*deleteq(LinkQueue*Q)//出队4/9{intflag;LinkQueueNode*q;if(Q-head==Q-tail)flag=0;q=Q-head-next;Q-head-next=q-next;if(Q-tail==q){Q-tail=Q-head;flag=1;}returnq;}voiddisplay(LinkQueueQ)//输出进程信息{LinkQueueNode*Newhead=Q.head-next;while(Newhead!=Q.tail-next){printf(%6c%10d%14d\n,Newhead-PCB.name,Newhead-PCB.state,Newhead-PCB.cpu_time);Newhead=Newhead-next;}}voidcreateJC()//创建进程{inti;LinkQueueNode*NewNode;pcb*pcbNode;NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));5/9pcbNode=(pcb*)malloc(sizeof(pcb));printf(******录入就绪队列信息******\n\n);for(i=0;iready;i++){printf(请输入进程名:);scanf(%c,&pcbNode-name);printf(请输入进程运行时间:);scanf(%d,&pcbNode-cpu_time);printf(请输入状态:0阻塞、1就绪、2执行:);scanf(%d,&pcbNode-state);copy(&NewNode-PCB,pcbNode);enterq(&rq,*NewNode);printf(\n);getchar();}NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));pcbNode=(pcb*)malloc(sizeof(pcb));printf(******录入阻塞队列信息******\n\n);for(i=0;iblocked;i++){printf(请输入进程名:);scanf(%c,&pcbNode-name);printf(请输入进程阻塞的时间:);scanf(%d,&pcbNode-cpu_time);printf(请输入状态:0阻塞、1就绪、2执行:);scanf(%d,&pcbNode-state);copy(&NewNode-PCB,pcbNode);enterq(&bq,*NewNode);printf(\n);getchar();}6/9printf(******各进程的信息******\n\n);printf(进程的名字进程的状态进程执行的时间\n);printf(\n);display(rq);display(bq);}intQueueState(LinkQueueQ)//判断队列是否为空{intflag0;if(Q.head==Q.tail)flag0=0;elseflag0=1;returnflag0;}voiddispatch()//模拟调度函数{intcount=0;intflag1;LinkQueueNode*p;createJC();printf(******模拟进程调度过程******\n\n);while(true){if(QueueState(rq)||QueueState(bq)){if(QueueState(rq)){p=deleteq(&rq);flag1=enterq(&runq,*p);if(flag1)7/9printf(***进程%c调度成功,状态由就绪转化为执行!\n,p-PCB.name);p-PCB.state=2;printf(***进程状态为%d\n,p-PCB.state);p-PCB.cpu_time--;if(p-PCB.cpu_time0){p-PCB.state=1;enterq(&rq,*p);}elsefree(p);}count++;if(count==counter){if(QueueState(bq)){p=deleteq(&bq);enterq(&rq,*p);p-PCB.state=1;printf(***进程状态为%d\n,p-PCB.state);count=0;}}}elsereturn;}}main()//主函数{8/9createq(&runq);createq(&rq);createq(&bq);printf(\n);printf(\n);dispatch();printf(调度结束!);}原始数据纪录:输入数据:9/9输出数据:实验总结:进程调度顺序为:abababacbacadcddededd实际输出数据与预期的输出相同。通过这次试验进一步了解了进程时间片轮转法调度的过程,就是队列的使用学过的时间久了有些生疏,又重新看了数据结构书,请教同学后才写出这个程序。
本文标题:进程调度实验报告
链接地址:https://www.777doc.com/doc-2002222 .html