进程实验教学文稿_第1页
进程实验教学文稿_第2页
进程实验教学文稿_第3页
进程实验教学文稿_第4页
进程实验教学文稿_第5页
已阅读5页,还剩14页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、进程管理实验 进程调度算法采用剥夺式最高优先数法。各进程的进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。选择优先数最小(优先权最高)的就绪进程投入执行。先从先从r状态进程中选择,再从状态进程中选择,再从t状态进程中选择。当现行状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。行进程时,则剥夺现行进程的执行权。 各进程在使用临界资源各进程在使用临界资源S1

2、和和S2时,通过调用信号量时,通过调用信号量sem1和和sem2上的上的P、V操作来实现同步。阻塞和唤醒操操作来实现同步。阻塞和唤醒操作负责完成从进程的执行态到等待态以及从等待态到就作负责完成从进程的执行态到等待态以及从等待态到就绪态的转换。绪态的转换。 系统启动后,在完成必要的系统初始化后便执行进系统启动后,在完成必要的系统初始化后便执行进程调度程序。当执行进程因程调度程序。当执行进程因“时间片中断时间片中断”,或被排斥,或被排斥使用临界资源,或唤醒某个进程时,立即进行进程调度。使用临界资源,或唤醒某个进程时,立即进行进程调度。当当3个进程都处于完成状态后,系统退出运行。个进程都处于完成状态

3、后,系统退出运行。 基本思路基本思路 (1)每个进程有一个进程控制块)每个进程有一个进程控制块PCB,内容包括:,内容包括:id进程标识号,进程标识号,id0,1,2;status进程状态,可为进程状态,可为e,r,t,w,c;priority 进程优先数;进程优先数;nextwr 等待链指针,指示在同一信号量上等待的等待链指针,指示在同一信号量上等待的下一个进程的标识号。下一个进程的标识号。 (2)信号量)信号量semaphore,对应于临界资源,对应于临界资源S1和和S2分别分别有有sem1和和sem2,均为互斥信号量,内容包括:,均为互斥信号量,内容包括: value 信号量,初值为信号

4、量,初值为1; firstwr 等待链首指针,指示在同一信号量上等待等待链首指针,指示在同一信号量上等待的下一个进程的标识数。的下一个进程的标识数。数据结构数据结构 (3)现场保留区,用数组)现场保留区,用数组savearea34表示。即每表示。即每个进程都有一个大小为个进程都有一个大小为4个单元的保留区,用来保存被个单元的保留区,用来保存被“中断中断”时的现场信息,如通用寄存器的内容和断点地时的现场信息,如通用寄存器的内容和断点地址等。址等。 此外,系统中还用到下列主要全程变量:此外,系统中还用到下列主要全程变量: exe执行进程指针,其值为进程标识号;执行进程指针,其值为进程标识号; i

5、用来模拟一个通用寄存器;用来模拟一个通用寄存器; addr用来模拟程序计数器;用来模拟程序计数器; s1,s2两个公共变量,用作共享临界资源两个公共变量,用作共享临界资源 数据结构数据结构const MAXPRI=100; NIL=-1;TYPE procp=record PCB类型类型 id:integer; status:char; 进程号进程号,进程状态进程状态 nextwr:integer; mess:message; 等待号等待号,消息队指针消息队指针 inum:integer; addr:char; 运行次数运行次数,返回地址返回地址 priority:integer; end;

6、优先数优先数 message=messagetp; 指向消息块指针类型指向消息块指针类型 messagetp=record 消息块类型消息块类型(信息信息,指针指针,发送者号发送者号) num:integer; next:message; pro:integer; end; semaphorel=record 信号量类型信号量类型(信号量信号量,等待队头号等待队头号) value:integer; firstwr:integer; end;VAR pcb:array1.3 of procb; PCB表表 sem:array1.2 of semaphorel; 信号量表信号量表 addr:cha

7、r; i,seed,exe:integer; 当前进程地址当前进程地址,运行次数运行次数,随机变量随机变量,当前运行进程号当前运行进程号program processc(input,output);var q,p:message; 工作指针工作指针 begin new(p); p.num:=snum; 申请消息块申请消息块,写入缓冲写入缓冲 p.next:=NIL; :=sender; 下一指针置空下一指针置空,置发送者置发送者 writeln(send message to process ,receiver); writeln(process ,sender,already ru

8、n ,snum, times); q:=pcbreceiver.mess; q指向接收者消息等待队列首指向接收者消息等待队列首 if(q=NIL) then pcbreceiver.mess:=p q空则空则p插入队首插入队首 else begin while(q.nextNIL) do q:=q.next; q移到队尾移到队尾 q.next:=p; 将将p链接到队尾链接到队尾 end; end;proc send(sender, receiver, snum:integer); 发送发送var p,q:message; 工作指针工作指针begin p:=pcbreceiver.mess; p

9、指向接收者消息等待队列首指向接收者消息等待队列首 while(pNIL) do begin 显示发送者和接收者信息显示发送者和接收者信息 writeln(receive message from process ,); writeln(process ,,is already run, p.num,times); q=p; 陆续将接收过的的消息块删除并释放陆续将接收过的的消息块删除并释放 p:=p.next; dispose(q) end; pcbreceiver.mess:=NIL; 接收完后消息等待队列置空接收完后消息等待队列置空end; proce receive(r

10、eceiver:integer); 接收接收var j:integer;begin for j:=1 to 3 do 初始化各进程控制块初始化各进程控制块 begin pcbj.id:=j; pcbj.status:=r; 进程号进程号,进程状态进程状态 pcbj.nextwr:=NIL; pcbj.mess:=NIL; 等待等待,消息指针消息指针 write(process, j,priority?); readln(pcbj.priority); 读入优先数读入优先数 pcbj.inum:=0; pcbj.addr:=0; 运行次数运行次数, 地址地址 end; sem1.value:=1

11、; sem1.firstwr:=NIL; 对信号量初始化对信号量初始化 sem2.value:=1; sem2.firstwr:=NIL; exe:=NIL; 当前执行进程号置为空当前执行进程号置为空end;proce init; 初始化初始化func random:real; proc eexit(n:integer);func random:real; 产生产生01之间的随机数之间的随机数var m:integer; begin seed为为integer 型型,实际值在实际值在-32768到到32767之间之间 if seed0 then m:=-seed else m:=-seed;

12、seed:=(25171*seed+13841) mod 65536; random:=m/32767.0 end;proce eexit(n:integer); 退出退出 begin pcbn.status:=c; 本进程置为完成态本进程置为完成态 writeln(process,n,is completed !); exe:=NIL; 当前执行进程号置空当前执行进程号置空 end;func find:integer; 选进程选进程 var j, pd, w: integer;begin pd:=NIL; W:=MAXPRI; for j:=1 to 3 do 先在高就绪态中找优先数最小的进

13、程先在高就绪态中找优先数最小的进程 if pcbj.status=r then if pcbj.priorityw then begin w:=pcbj.priority; pd:=j end; if pd=NIL then for j:=1 to 3 do 再在低就绪态中找优先数最小的进程再在低就绪态中找优先数最小的进程 if pcbj.status=t then if pcbj.priorityw then begin w:=pcbj.priority; pd:=j end; find:=pd 返回进程号返回进程号end;func scheduler:integer; 调度调度 var p

14、d:integer;begin pd:=find; 找优先进程找优先进程 if (pdNIL) or (exeNIL) then begin if pdNIL then 若有就绪进程则若有就绪进程则 if exe=NIL then 若无当前执行进程则若无当前执行进程则 begin pcbpd.status:=e; exe:=pd; 新进程置执行态新进程置执行态 writeln(process,exe,is executing); end else if pcbpd.prioritypcbexe.priority then 切换切换 begin pcbexe.status:=r; 原执行进程置高

15、就绪态原执行进程置高就绪态 writeln(process,exe,enter into ready); pcbpd.status:=e; exe:=pd; 新进程置执行态新进程置执行态 writeln(process,exe,is executing); end; i:=pcbexe.inum; addr:=pcbexe.addr; 恢复现场恢复现场 end scheduler:=exe; 返回当前执行进程号返回当前执行进程号end; proce block(); 阻塞阻塞 proce wakeup(); 唤醒唤醒proce block(se:integer); var w:integer;

16、 工作指针工作指针begin writeln(process,exe,is block); pcbexe.status:=w; pcbexe.nextwr=NIL; 置阻塞态置阻塞态 w:=semse.firstwr; 信号量等待队列头指针赋给信号量等待队列头指针赋给w if w=NIL then semse.firstwr:=exe 空则当前进程作队头空则当前进程作队头 else begin while(pcbw.nextwrNIL) do w:=pcbw.nextwr; 指针后推到队尾指针后推到队尾 pcbw.nextwr:=exe 当前进程链接到队尾当前进程链接到队尾 end;end;p

17、roce wakeup(se:integer); var w:integer; begin w:=semse.firstwr; 队列头指针赋给队列头指针赋给w if wNIL then begin 非空则摘下首块非空则摘下首块 semse.firstwr:=pcbw.nextwr; 重链接重链接 pcbw.status:=r; 置为高就绪态置为高就绪态 writeln(process,exe,is wakeup); end; end;func p( ); func v( ); funct p(se:integer;ad:char):boolean; wait操作操作 begin semse.v

18、alue:=semse.value-1; 信号量减信号量减1 if semse.value=0 then p:=false 有资源不等待有资源不等待 else begin block(se); 阻塞到阻塞到 se 等待队列等待队列 pcbexe.inum:=i; pcbexe.addr:=ad; 保护现场保护现场 exe:=NIL; p:=true 执行进程置空执行进程置空,等待标志置真等待标志置真 end; end;function v(se:integer;ad:char):boolean; signal操作操作 begin semse.value:=semse.value+1; 信号量加

19、信号量加1 if semse.value0 then v:=false 无等待不重新调度无等待不重新调度 else begin wakeup(se); 有等待唤醒有等待唤醒 se 等待队列的进程等待队列的进程 pcbexe.inum:=i; pcbexe.addr:=ad; 保护现场保护现场 v:=true 要重新调度要重新调度 end;end;function timeint(ad:char):boolean; 模拟时间片中断模拟时间片中断var x:real;begin x:=rendom; x为为01之间的随机数之间的随机数 if (x=0.67)and(exe=3) or (x0.33

20、)and(x0.67)and(exe=2) then timeint:=false 若在各自的时间片不产生中断若在各自的时间片不产生中断 else begin 否则产生时间片中断否则产生时间片中断 pcbexe.inum:=i; pcbexe.addr:=ad; 保护现场保护现场 pcbexe.status:=t; 置为低就绪态置为低就绪态 writeln(Times silce interrupt.); writeln(process,exe,enter into ready); exe:=NIL; 执行进程置空执行进程置空 timeint:=true 中断标志置真中断标志置真 end; e

21、nd; procedure process1(var s1,s2:integer); 模拟并发进程模拟并发进程1label a1,b1,c1,d1,e1,f1,stop1;begin if addr=a then goto a1; if addr=b then goto b1; if addr=c then goto c1; if addr=d then goto d1; if addr=e then goto e1; if addr=f then goto f1; while(i=5) then eexit(1); 5次循环后本进程结束次循环后本进程结束end; writeln(proces

22、s1 calls p on sem1); if p(1,a) then goto stop1; 对信号量对信号量1进行进行P操作返回操作返回a地址地址a1: writeln(process1 is execution on its cretical section 1.);入临界区入临界区 if timeint(b) then goto stop1; 若时间片到则重新调度若时间片到则重新调度b1: s1:=s1+1; writeln(s1=,s1); s1是临界资源不是信号量是临界资源不是信号量 writeln(process1 calls v on sem1 and quit cretica

23、l section 1); if v(1,c) then goto stop1; 对信号量对信号量1进行进行V操作操作,出临界区出临界区c1: writeln(process1 calls p on sem2); if p(2,d) then goto stop1; 对信号量对信号量2进行进行P操作返回操作返回d地址地址d1: writeln(process1 is execution on its cretical section 2.); if timeint(e) then goto stop1;e1: s2:=s2+1; writeln(s2=,s2); s2是临界资源不是信号量是临界

24、资源不是信号量 writeln(process1 calls v on sem1 and quit cretical section 2.); if v(2,f) then goto stop1; 对信号量对信号量2进行进行V操作操作,出临界区出临界区f1: writeln(process1 cyclen count=, i+1); i:=i+1; send(1,2,i); send(1,3,i); readln; 循环次数加循环次数加1,发消息发消息procedure process2(var s1,s2:integer); 模拟并发进程模拟并发进程2label a2,b2,c2,d2,e2,f2,stop2;begin if addr=a then goto a2; if addr=b then goto b2; if addr=c then goto c2; if addr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论