1/14洛阳理工学院实验报告系别计算机与信息工程系班级B110503学号B11050308姓名张鑫课程名称操作系统实验日期2013.10.12实验名称进程调度成绩实验目的:通过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:计算机一台,VSc++6.0实验原理:设计程序模拟进程的时间片轮转法调度过程。假设初始状态为:有ready个进程处于就绪状态,有blocked个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过counter个时间片,唤醒处于阻塞队列队首的进程。实验内容:#includestdio.h#includemalloc.h#includewindows.h#defineTRUE1#defineFALSE0typedefstructPCB_type{charname;//进程名intstate;//进程状态2/14//2——表示“执行”状态//1——表示“就绪”状态//0——表示“阻塞”状态intCPU_time;//运行需要的CPU时间(需要运行的时间片个数)}PCBcontrol;typedefstructQueueNode//定义结点{PCBcontrolPCB;structQueueNode*next;}LinkQueueNode;typedefstructQueue//定义队列{LinkQueueNode*head;LinkQueueNode*tail;}LinkQueue;voidfuzhi(PCBcontrol*PCB1,PCBcontrol*PCB2);LinkQueuerq,bq,runq;intdeleteState=0;intready=2;intblocked=3;intcounter=5;intcreateQueue(LinkQueue*Q)//队列初始化{/*将Q初始化为一个空的链队列*/Q-head=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));if(Q-head!=NULL){Q-tail=Q-head;Q-head-next=NULL;return(TRUE);3/14}elsereturn(FALSE);}intenterQueue(LinkQueue*Q,LinkQueueNodex)//入队列操作算法{/*将数据元素x插入到队列中*/LinkQueueNode*NewNode;NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));if(NewNode!=NULL){fuzhi(&NewNode-PCB,&x.PCB);NewNode-next=NULL;Q-tail-next=NewNode;Q-tail=NewNode;return(TRUE);}elsereturn(FALSE);}LinkQueueNode*deleteQ(LinkQueue*Q){LinkQueueNode*NewNode;if(Q-head==Q-tail){deleteState=0;}else{NewNode=Q-head-next;Q-head-next=NewNode-next;4/14if(Q-tail==NewNode)Q-tail=Q-head;deleteState=1;}returnNewNode;}voiddisplay(LinkQueueQ){LinkQueueNode*Newhead=Q.head-next;while(Newhead!=Q.tail-next){printf(**************\n);printf(该进程的名称为:%c\n,Newhead-PCB.name);printf(该进程的状态为:%d\n,Newhead-PCB.state);printf(进程运行所需的CPU时间为:%d\n,Newhead-PCB.CPU_time);printf(**************\n);Newhead=Newhead-next;}}voidcreateOS(){inti;LinkQueueNode*NewNode;PCBcontrol*pcbnode;NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));pcbnode=(PCBcontrol*)malloc(sizeof(PCBcontrol));printf(就绪队列\n);for(i=1;i=ready;i++){printf(第%d条队列\n,i);5/14printf(请输入进程名:);scanf(%c,&pcbnode-name);fflush(stdin);printf(\n);printf(请输入进程运行需要的时间:);scanf(%d,&pcbnode-CPU_time);fflush(stdin);printf(\n);printf(请输入状态:0阻塞、1就绪、2运行\n);scanf(%d,&pcbnode-state);printf(\n);fflush(stdin);fuzhi(&NewNode-PCB,pcbnode);enterQueue(&rq,*NewNode);}NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));pcbnode=(PCBcontrol*)malloc(sizeof(PCBcontrol));printf(阻塞队列\n);i=1;for(;i=blocked;i++){printf(第%d条队列\n,i);printf(请输入进程名称:);scanf(%c,&pcbnode-name);fflush(stdin);printf(\n);printf(请输入进程阻塞的时间:);scanf(%d,&pcbnode-CPU_time);fflush(stdin);printf(\n);printf(请输入状态:0阻塞、1就绪、2运行\n);6/14scanf(%d,&pcbnode-state);printf(\n);fflush(stdin);fuzhi(&NewNode-PCB,pcbnode);enterQueue(&bq,*NewNode);}display(rq);display(bq);}intGetStateQueue(LinkQueueQ){intretval;if(Q.head==Q.tail)retval=0;//得到空队列elseretval=1;returnretval;}voiddispath(){intcounte=0;LinkQueueNode*deleteNode;//PCBcontrol*a;intflag1,flag2;createOS();while(TRUE){Sleep(1000);if(GetStateQueue(rq)||GetStateQueue(bq)){7/14if(GetStateQueue(rq)){deleteNode=deleteQ(&rq);flag1=enterQueue(&runq,*deleteNode);if(flag1)printf(-----★进程%c调度成功,状态由就绪变成运行!★\n,deleteNode-PCB.name);deleteNode-PCB.state=2;printf(----进程状态变为:%d\n,deleteNode-PCB.state);deleteNode-PCB.CPU_time--;if(deleteNode-PCB.CPU_time0){deleteNode-PCB.state=1;flag1=enterQueue(&rq,*deleteNode);if(flag1)printf(-----★进程%c调度成功,状态由运行变成就绪!★\n,deleteNode-PCB.name);printf(---进程状态变为:%d\n,deleteNode-PCB.state);}elsefree(deleteNode);}counte++;if(counte==counter){if(GetStateQueue(bq)){deleteNode=deleteQ(&bq);flag2=enterQueue(&rq,*deleteNode);if(flag2)printf(-----★进程%c调度成功,状态由阻塞变成就绪!★8/14\n,deleteNode-PCB.name);deleteNode-PCB.state=1;printf(--进程状态变为:%d\n,deleteNode-PCB.state);counte=0;}}}elsereturn;}}voidInitQ(){intrevalrq=createQueue(&rq);intrevalbq=createQueue(&bq);intrevalrunq=createQueue(&runq);if(revalrq&&revalbq&&revalrunq)printf(所有队列初始化成功!\n);else{printf(程序发生错误\n两秒退出!);Sleep(2000);exit(0);//自动退出}}voidfuzhi(PCBcontrol*PCB1,PCBcontrol*PCB2){PCB1-name=PCB2-name;PCB1-state=PCB2-state;PCB1-CPU_time=PCB2-CPU_time;}9/14voidmain(){InitQ();Sleep(1000);system(cls);dispath();}10/14原始数据纪录:输入数据:a,6,1;b,4,1;3,0;d,6,0;e,2,0输出数据:11/1412/1413/14实验总结:预期的输出:数据:输入数据:a,6,1;b,4,1;3,0;d,6,0;e,2,0实际输出数据与预期的输出相同。14/14