小兔过河问题——PV问题新解

我正在参加「兔了个兔」创意投稿大赛,详情请看:「兔了个兔」创意投稿大赛

题目

在操作系统的PV操作中,有一类较为典型,即——路径分配问题:

小兔家族在草原上四通八达,在黑兔家(A)和白兔家(B)之间有一条弯曲的小路,(如图所示)
正值新年到来,黑白两兔家族要互相拜访,此时:
其中从S到T一段路每次只允许一只兔子通过,
但其中有一个小的安全岛M(同时允许两只兔子停留),可供两两只兔子已从两端进入小路情况下使用,如图所示。
试设计一个算法使来往的兔子们均可顺利通过。

image.png

分析及相关知识

在本题中,需要控制路段T到L,路段S到K及安全岛M的使用。 路段T到L及路段S到K同时只允许一只兔子通过,而安全岛M允许两只兔子使用,因此可以用三个信号量来管理它们。另一方面,同一方向上的兔子最多只能有一只通过这段路(两个方向上可以有两只),因此还应该用两个信号量来控制.

解:在本题中,应设置5个信号量ST,TS,K,L,M,信号量ST表示是否允许某一只兔子从A去B,其初值为1;信号量TS表示是否允许兔子从B去A,其初值为1;信号量K表示是否允许某一方向的兔子通过路段S到K,其初值为1;信号量L表示是否允许那个方向的兔子通过路段T到L,其初值为1;信号量M表示安全岛上还可暂存的兔子的数目,其初值为2。其控制过程描述如下:

int ST=1;
int TS=1;
int K=1;
int L=1;
int M=2;
totian( ) *从A去B*/{
p(ST);
p(K);
从S走到K;
p(M);
进入安全岛;
v(K);
p(L);
从L走到T;
v(M);
v(L);
v(ST);
}
tonan()/*从B去A*/{
p(TS);
p(L);
从T走到L;
p(M);
进入安全岛;
v(L);
p(K);
从K走到S;
v(M);
v(K);
v(TS);
}

理解: 我们可以将安全岛理解为与PC共用的一个单缓冲区。当缓冲区1为空时,进程PA可将一个记录读入其中;若缓冲区1中有数据且缓冲区2为空,则进程PB可将记录从缓冲区1复制到缓冲区2中;若缓冲区2中有数据,则进程PC可以打印记录。在其他条件下,相应进程必须等待。事实上,这是一个生产者-消费者问题。

posted @ 2023-01-29 21:22  Luciferpluto  阅读(0)  评论(0)    收藏  举报  来源