操作系统实验一进程调度

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1/8洛阳理工学院实验报告系别计算机系班级B150403学号B15040320姓名姜明课程名称计算机操作系统实验日期2017.11.10实验名称实验一进程调度成绩实验目的:通过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:微机一台,操作系统:windows7,编程环境:MicrosoftVisualStudio2010。实验原理:设计程序模拟进程的时间片轮转法调度过程。假设初始状态为:有ready个进程处于就绪状态,有blocked个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过counter个时间片,唤醒处于阻塞队列队首的进程。实验内容:#includestdio.h#includemalloc.h#includewindows.h#defineTRUE1#defineFALSE0typedefstructPCB_type{charname;//进程名intstate;//进程状态//2--表示执行状态//1--表示就绪状态//0--表示阻塞状态intCPU_time;//运行需要的CPU时间(需要运行的时间片个数)}PCBcontrol;typedefstructQueueNode//定义结点{PCBcontrolPCB;2/8structQueueNode*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);}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;3/8if(Q-head==Q-tail){deleteState=0;}else{NewNode=Q-head-next;Q-head-next=NewNode-next;if(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);printf(请输入进程名:);scanf(%c,&pcbnode-name);fflush(stdin);printf(\n);printf(请输入进程运行需要的时间:);scanf(%d,&pcbnode-CPU_time);fflush(stdin);4/8printf(\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);scanf(%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(){5/8intcounte=0;LinkQueueNode*deleteNode;//PCBcontrol*a;intflag1,flag2;createOS();while(TRUE){Sleep(1000);if(GetStateQueue(rq)||GetStateQueue(bq)){if(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调度成功,状态由阻塞变成就绪!★\n,deleteNode-PCB.name);deleteNode-PCB.state=1;printf(--进程状态变为:%d\n,deleteNode-PCB.state);counte=0;}}6/8}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;}voidmain(){InitQ();Sleep(1000);system(cls);dispath();}7/8原始数据纪录:实验结果:8/8实验总结:本次实验比上次是要复杂的,操作系统这本书上也没有什么例子供参考,有了第一次实验的经历,相对来说能轻松点。这次实验让我们加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功