实验一处理机调度

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

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

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

资源描述

实验一处理机调度实验一、实验目的:用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。二、实验要求:用C++语言实验对N个进程采用非抢占式的动态优先权优先算法的进程调度三、实验内容:(1)设计一个有N个进程并发的进程调度程序。进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)算法。(2)每个进程有一个进程控制块(PCB)表示。PCB用结构来描述,包括以下字段:进程标识ID、优先数,为初始设定的模拟条件到达时间,为初始设定的模拟条件需要运行时间,为初始设定的模拟条件已用CPU时间,为初始设定的模拟条件进程阻塞时间startblock(表示进程在运行startblock个时间片后,进程将进入阻塞状态),为初始设定的模拟条件进程被阻塞的时间blocktime(表示进程等待blocktime个时间片后,将转换成就绪状态),为初始设定的模拟条件,模拟执行I/O操作需要的时间进程状态state,就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态队列指针next等等。(3)优先数改变的规则进程在就绪对列中呆一个时间片,优先数增加1;进程每运行一个时间片,优先数减3;(4)运行过程描述首先按照初始化输入,按照各进程优先级高低排列就绪队列中进程顺序,优先级最高的进程最先获得CPU控制权运行。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,此时应将进程的优先数减3(即降低一级),如果到了进程需被阻塞的时间点,阻塞进程,然后把它插入阻塞队列,等待经过blocktime后,再唤醒进程,把它按照优先级高低,插入就绪队列相应位置等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。备注:进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间或顺序。参考资料:部分数据结构说明:structpcb{/*定义进程控制块PCB*/charname[10];charstate;intsuper;intntime;intrtime;。。。。。。。。。。。。。。。structpcb*link;};部分函数说明:sort()/*建立对进程进行优先级排列函数*/input()/*建立进程控制块函数,初始化数据*/disp()/*建立进程显示函数,用于显示当前进程信息*/running()/*建立进程执行函数(进程运行时间到,置就绪状态*/main()/*主函数*/源代码:#includestdio.h#includestdlib.h#includeconio.h#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0#defineTIME2//时间片长度typedefstructpcb{//进程管理块charname[10];//进程名字charstate;//进程状态intqueue;//进程所在的队列intntime;//进程需要运行的时间intrtime;//进程已经运行的时间intetime;//进程在本队列可运行的时间片structpcb*link;}PCB;PCB*ready=NULL,*pinsert=NULL,*pfend=NULL,*p=NULL;//就绪队列,进程插入位置的变量intgeti()//使用户仅能输入整数{charch;inti=0;fflush(stdin);ch=getchar();while(ch=='\n'){printf(\tf输入不能为空..请重新输入\n);fflush(stdin);ch=getchar();}while(ch!='\n'){if(ch'9'||ch'0'){printf(\t输入有误!!输入只能为正整数,请重新输入...\n);fflush(stdin);i=0;ch=getchar();}else{i=i*10+(ch-'0');ch=getchar();}}returni;}voidfindpos()//更新状态量{PCB*ps=pfend;if(!ps||!ps-link||(ps-link-queue-ps-queue)1)pinsert=ps;else{while(ps-link&&ps-link-queue!=(pfend-queue+2))ps=ps-link;pinsert=ps;}}voidinsert()//插入进程{if(!ready){ready=p;pfend=p;pinsert=p;}elseif(ready-queue==1){//第一队列存在p-link=pfend-link;pfend-link=p;pfend=p;findpos();}else{p-link=ready;ready=p;findpos();}}voidinput()/*建立进程控制块函数*/{inti,num;printf(\n请输入进程的个数?);num=geti();for(i=0;inum;i++){printf(\n进程号No.%d:\n,i+1);p=getpch(PCB);printf(\n输入进程名:);scanf(%s,p-name);printf(\n输入进程运行时间:);p-ntime=geti();printf(\n);p-rtime=0;p-state='w';p-queue=1;p-etime=TIME;p-link=NULL;insert();/*调用insert函数*/}}voiddisp(PCB*pr)/*建立进程现实函数,用于显示当前进程*/{printf(\nname\tstate\tqueue\tntime\trtime\t在队列可停留时间\t\n);printf(|%s\t,pr-name);printf(|%c\t,pr-state);printf(|%d\t,pr-queue);printf(|%d\t,pr-ntime);printf(|%d\t,pr-rtime);printf(|%d\t,pr-etime);printf(\n);}voidcheck()/*建立进程查看函数*/{PCB*pr;printf(\n****当前正在运行的进程是:%s,ready-name);/*显示当前运行的进程*/disp(ready);pr=ready-link;printf(\n****当前就绪队列状态为:\n);/*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr-link;}}voidsort()//调整进程队列{if(!ready-link||ready-queueready-link-queue)return;p=ready-link;ready-link=pinsert-link;pinsert-link=ready;pinsert=ready;ready=p;if(ready&&ready-queue==pinsert-queue){findpos();}}voidaddnew()//添加新的进程{if(ready-queue!=1){(ready-queue)++;ready-etime*=2;ready-state='w';sort();/*调用sort函数*/input();}else{input();}}voiddestroy()/*建立进程撤销函数(进程运行结束,撤销进程)*/{printf(\n进程[%s]已完成.\n,ready-name);p=ready;ready=ready-link;free(p);if(ready&&ready-queue==pinsert-queue)findpos();}voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态)*/{(ready-rtime)++;ready-etime--;if(ready-rtime==ready-ntime){destroy();return;}elseif(ready-etime==0){inttime=2;(ready-queue)++;for(inti=2;i!=ready-queue;++i)time*=2;ready-etime=time;ready-state='w';sort();/*调用sort函数*/}}voidmain(){charch;input();while(ready!=NULL){printf(\nTheexecutename:%s\n,ready-name);ready-state='R';check();running();printf(\n按i键添加新进程....按其他任意键继续运行...);fflush(stdin);ch=getchar();if(ch=='i'||ch=='I')addnew();}printf(\n\n进程已经完成\n);getchar();}

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

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

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

×
保存成功