资源描述:
《进程实验教学文稿.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、进程管理实验进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,再从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。各进程在使用临界资源S1和S2时,通过调用信号量sem1和sem2上的P、V操作来实现同步。阻塞和唤醒操作负责完成从进程的执行态到等待态以及从等待态到就绪态的转换。系统启动后,在完成必要的系统初始化后便执行进程调度程序。当执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个进程时,立即进行进程调度。当3个进
2、程都处于完成状态后,系统退出运行。基本思路(1)每个进程有一个进程控制块PCB,内容包括:id进程标识号,id=0,1,2;status进程状态,可为e,r,t,w,c;priority进程优先数;nextwr等待链指针,指示在同一信号量上等待的下一个进程的标识号。(2)信号量semaphore,对应于临界资源S1和S2分别有sem1和sem2,均为互斥信号量,内容包括:value信号量,初值为1;firstwr等待链首指针,指示在同一信号量上等待的下一个进程的标识数。数据结构(3)现场保留区,用数组savearea[3][4]表示。即每个进程都有一个大小为4个单元的保留区,用来保存被“中断
3、”时的现场信息,如通用寄存器的内容和断点地址等。此外,系统中还用到下列主要全程变量:exe执行进程指针,其值为进程标识号;i用来模拟一个通用寄存器;addr用来模拟程序计数器;s1,s2两个公共变量,用作共享临界资源数据结构constMAXPRI=100;NIL=-1;TYPEprocp=record{PCB类型}id:integer;status:char;{进程号,进程状态}nextwr:integer;mess:message;{等待号,消息队指针}inum:integer;addr:char;{运行次数,返回地址}priority:integer;end;{优先数}message=^
4、messagetp;{指向消息块指针类型}messagetp=record{消息块类型(信息,指针,发送者号)}num:integer;next:message;pro:integer;end;semaphorel=record{信号量类型(信号量,等待队头号)}value:integer;firstwr:integer;end;VARpcb:array[1..3]ofprocb;{PCB表}sem:array[1..2]ofsemaphorel;{信号量表}addr:char;i,seed,exe:integer;{当前进程地址,运行次数,随机变量,当前运行进程号}programproce
5、ssc(input,output);varq,p:message;工作指针beginnew(p);p^.num:=snum;申请消息块,写入缓冲p^.next:=NIL;p^.pro:=sender;下一指针置空,置发送者writeln('sendmessagetoprocess',receiver);writeln('process',sender,'alreadyrun',snum,'times');q:=pcb[receiver].mess;q指向接收者消息等待队列首if(q=NIL)thenpcb[receiver].mess:=pq空则p插入队首elsebeginwhile
6、(q^.next<>NIL)doq:=q^.next;q移到队尾q^.next:=p;将p链接到队尾end;end;procsend(sender,receiver,snum:integer);发送varp,q:message;工作指针beginp:=pcb[receiver].mess;p指向接收者消息等待队列首while(p<>NIL)dobegin显示发送者和接收者信息writeln('receivemessagefromprocess',p^.pro);writeln('process',p^.pro,'isalreadyrun',p^.num,'times');q=p;陆续将接收
7、过的的消息块删除并释放p:=p^.next;dispose(q)end;pcb[receiver].mess:=NIL;接收完后消息等待队列置空end;procereceive(receiver:integer);接收varj:integer;beginforj:=1to3do初始化各进程控制块beginpcb[j].id:=j;pcb[j].status:='r';进程号,进程状态pcb[j].next