有8个存储区域,编号为0、1、2……、8,用一个8位的标志字,位号对应为0、1、2,……、8,分别描述8个存储区域的使用状态:当某一位标志字为1时,表示对应存储区域已分配,如果为0,表示对应的存储区域空闲。Get进程负责存储区域分配,每次分配一个区域,找出标志字的该位,将0改变为1。Put进程负责存储区域的回收,把回收存取区域的标志字对应位改为0。
要求:
(1)分析get进程与put进程的具体同步关系。
(2)采用PV操作同步工具,写出get进程与put进程的同步算法。
依题意可知,此问题属于进程互斥和同步的混合问题。设置一个数组,表示标志位,当数值为0,表示其所对应的存储区域为空,数值为1,表示其所对应的存储区域已经分配;设置8个信号量,Si(i=1,2,……,8),分别表示对应的存储区域是否可用,初值为1;再设置8个信号量,Iq(j=1,2,……,8),分别表示对应的存储区域是否已经分配,初值为0;get进程欲分配存储区域,先调用P(Si),测试该存储区域是否可用,如果可用,将该存储区域分配后,将标志位置为1,标识此存储区域已经被分配,再调用V(Iq),发消息此区域已经被分配;put进程欲将收回存储区域,先调用V(Iq)测试该存储区域是否已经被分配,如果被分配,将其清空,将其标志位置为0,标识此存储区域已经为空,再调用P(Si),发消息此存储区域可以再分配。过程如下: Begin B:array[O…8]of integer; Si(i=1,2,……8),Kj(j=1,2,……8):semaphore;/*信号量*/ Si:=l;Kj:=0;/*赋初值*/ Cobegin Process get Begin Lm:P(Si);/*调用P(Si),测试能否把数据存入存储区域*/ 分配该存储区域; B[i]:=1;/*将标志位置为1,表示已经分配*/ V(Kj);/*调用V(Kj),发消息此存储区域已经被分配*/ Goto Lm; End; Process put Begin Ln:P(Kj);/*测试缓冲区域是否被分配/ 收回存储区域; B[i]:=0;/*将标志位置为0,表示已经清空*/ V(Si);/*发送存储区域已经被清空*/ Goto Ln; End; Coend; End;