资源描述:
《pascal模拟实现按优先数进行处理机调度》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实习作业:设计一个实现按优先数进行处理机调度的方案一.设计时间:2001年10月2日二.功能说明:●采用静态优先数个调读策略,是不可抢占的;●数据结构说明:对每一个进程的PCD,采用记录类型。此纪录包括进程名(name,字符串型)优先级数(priority整数型)状态(status枚举类型)进程地址(address数型)相关信息(messages数型)及指向下一进程PCB的指针(link指针类型);●进程调度的实现:①对每一个进程的就绪对列固定进程个数(此处为三个)共有若干(此处为两个)就绪对列。就绪对列由子程序(crea
2、te)自动生成,为进程调度算法作好准备;②每一个进程的优先级数是事先确定下来的(此处用随机函数产生一个1-100的整数);③当进程调度开始后,利用查寻子程序(find)找出就绪队列中优先级数最大的进程,并把其从就绪队列删除;在进程进入处理机过程中,它可以调用阻塞原语,使自己处于等待状态,同时把它插入等待对列,由waitp子程序实现,同时进程的优先级数被改变。当然,进程也可以不用阻塞厚语,当一个就绪队列的的所有进程执行过后,把刚插入等待对列(whead)中的进程再插入的当前就绪队列,直到当前对列的所有进程全部运行结束再转入下
3、一就绪对列的处理。三.程序流程图:(如图1)四.设计总结:本设计只是简单的模拟了按优先数进行处理机调度的方案,不能动态的,完美的进行演示,因此还需进一步改进。五.PASCAL源程序如下:programZpcb(input,output);typestatus_type=(ready,wait,run);pointer=^pcb;pcb=recordname:string[10];priority:integer;address:integer;status:status_type;messages:integer;link
4、:pointerend;varr,i,j,w,n:integer;rhead:array[1..3]ofpointer;p,q,whead:pointer;functionrnd(varr:integer):integer;constl=20;c=217;m=1024;beginr:=(r*l+c)modm;7rnd:=round(r/m*100)end;procedurecreate(varp:pointer;varr:integer;n,m:integer);varb,c:char;h:integer;beginc:=
5、chr(n+ord('0'));b:=chr(m+ord('0'));p^.name:='PCB-'+c+'-'+b;p^.priority:=rnd(r);p^.address:=10+100*n;p^.status:=ready;h:=rnd(r);ifh<50thenp^.messages:=0elsep^.messages:=1;p^.link:=nilend;procedurefind(varp:pointer;varrhead:pointer);varq,r,h:pointer;beginp:=rhead;q:
6、=rhead^.link;h:=nil;r:=rhead;while(q<>nil)doifq^.priority>p^.prioritythenbeginh:=r;p:=qendelsebeginr:=q;q:=q^.linkend;ifh<>nilthenh^.link:=p^.linkelserhead:=p^.linkend;procedurewaitq(varp:pointer;varwhead:pointer;varr:integer);vart,h:pointer;7beginp^.link:=nil;p^.
7、priority:=rnd(r);p^.messages:=0;p^.status:=wait;ifwhead=nilthenwhead:=pelsebeginh:=whead;t:=whead^.link;while(t<>nil)dobeginh:=t;t:=t^.linkend;h^.link:=pendend;procedurechange(varrhead:pointer;varwhead:pointer;varw:integer);varq:pointer;beginq:=whead;while(q<>nil)
8、dobeginq^.status:=ready;q:=q^.linkend;rhead:=whead;whead:=nil;w:=0end;procedurewtime(n:integer);consth=3000;vart,j,i,x:integer;beginfori:=1tondoforx:=1t