进程管理实验

上传人:suns****4568 文档编号:93480545 上传时间:2019-07-22 格式:PPT 页数:19 大小:110KB
返回 下载 相关 举报
进程管理实验_第1页
第1页 / 共19页
进程管理实验_第2页
第2页 / 共19页
进程管理实验_第3页
第3页 / 共19页
进程管理实验_第4页
第4页 / 共19页
进程管理实验_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《进程管理实验》由会员分享,可在线阅读,更多相关《进程管理实验(19页珍藏版)》请在金锄头文库上搜索。

1、本系统的同步机构采用信号量上的P、V操作的机制;控制机构包括: (1)阻塞和唤醒操作; (2)时间片中断处理程序模拟时间片中断; (3)进程调度程序负责为各进程分配处理机。 系统中涉及了3个并发进程。它们之间的关系是: (1) 3个进程需要互斥使用临界资源S2。 (2)进程1和进程2又需互斥使用临界资源S1 本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。,题目,系统为进程设置了5种运行状态: e执行态;r高就绪态;t低就绪态(执行进程因时间片到限而转入);w等待态;c完成态。各进程的初始状态均设置为r. 系统分时执行各进程,并规定3个进程的执行概率均为3

2、3。通过产生随机数x来模拟时间片。当进程process1访问随机数x时,若x=0.33;当进程process2访问x时,若x=0.66;当进程process3访问x时,若x0.66,则分别认为各进程的执行时间片到限,产生“时间片中断”而转入低就绪态t。,基本思路,进程调度算法采用剥夺式最高优先数法。各进程的优先数通过键盘输入予以静态设置。调度程序每次总是选择优先数最小(优先权最高)的就绪进程投入执行。先从r状态进程中选择,再从t状态进程中选择。当现行进程唤醒某个等待进程,且被唤醒进程的优先数小于现行进程时,则剥夺现行进程的执行权。 各进程在使用临界资源S1和S2时,通过调用信号量sem1和se

3、m2上的P、V操作来实现同步。阻塞和唤醒操作负责完成从进程的执行态到等待态以及从等待态到就绪态的转换。 系统启动后,在完成必要的系统初始化后便执行进程调度程序。当执行进程因“时间片中断”,或被排斥使用临界资源,或唤醒某个进程时,立即进行进程调度。当3个进程都处于完成状态后,系统退出运行。,基本思路,(1)每个进程有一个进程控制块PCB,内容包括: id 进程标识号,id0,1,2; status 进程状态,可为e,r,t,w,c; priority 进程优先数; nextwr 等待链指针,指示在同一信号量上等待的下一个进程的标识号。 (2)信号量semaphore,对应于临界资源S1和S2分别

4、有sem1和sem2,均为互斥信号量,内容包括: value 信号量,初值为1; firstwr 等待链首指针,指示在同一信号量上等待的下一个进程的标识数。,数据结构,(3)现场保留区,用数组savearea34表示。即每个进程都有一个大小为4个单元的保留区,用来保存被“中断”时的现场信息,如通用寄存器的内容和断点地址等。 此外,系统中还用到下列主要全程变量: exe 执行进程指针,其值为进程标识号; i 用来模拟一个通用寄存器; addr 用来模拟程序计数器; s1,s2 两个公共变量,用作共享临界资源,数据结构,const MAXPRI=100; NIL=-1; TYPE procp=re

5、cord PCB类型 id:integer; status:char; 进程号,进程状态 nextwr:integer; mess:message; 等待号,消息队指针 inum:integer; addr:char; 运行次数,返回地址 priority:integer; end; 优先数 message=messagetp; 指向消息块指针类型 messagetp=record 消息块类型(信息,指针,发送者号) num:integer; next:message; pro:integer; end; semaphorel=record 信号量类型(信号量,等待队头号) value:int

6、eger; firstwr:integer; end; VAR pcb:array13 of procb; PCB表 sem:array12 of semaphorel; 信号量表 addr:char; i,seed,exe:integer; 当前进程地址,运行次数,随机变量,当前运行进程号,program processc(input,output);,var q,p:message; 工作指针 begin new(p); p.num:=snum; 申请消息块,写入缓冲 p.next:=NIL; p.pro:=sender; 下一指针置空,置发送者 writeln(send message

7、to process ,receiver); writeln(process ,sender,already run ,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; 工作指针 be

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

9、 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; sem1.firstwr:=NIL; 对信号量初始化 sem2.value:=1; sem2.firstwr:

10、=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; seed:=(25171*seed+13841) mod 65536; random:=m/32767.0 end; proce eexit(n:integer); 退出 beg

11、in 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 先在高就绪态中找优先数最小的进程 if pcbj.status=r then if pcbj.priorityw then begin w:=pcbj.priority; pd:=j end; if pd=NIL then for j:=1 to

12、 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 pd:integer; begin pd:=find; 找优先进程 if (pdNIL) or (exeNIL) then begin if pdNIL then 若有就绪进程则 if exe=NIL then 若无当前执行进程则 begin pcbpd.status:=e; exe:=pd

13、; 新进程置执行态 writeln(process,exe,is executing); end else if pcbpd.prioritypcbexe.priority then 切换 begin pcbexe.status:=r; 原执行进程置高就绪态 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:=ex

14、e; 返回当前执行进程号 end;,proce block(); 阻塞 proce wakeup(); 唤醒,proce block(se:integer); var w:integer; 工作指针 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;,proce wakeup(se:integer); var w:integer; begin w:=semse.firstwr; 队列头指针赋给w if wNIL then begin 非空则摘下首块 semse.firstwr:=pcbw.nextwr; 重链接 pcbw.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号