1.
有一个盒子,混装了数量相等的围棋白子和黑子。现在要用自动分拣系统把白子和黑子分开。设系统有两个进程P1和P2,其中P1拣白子,P2拣黑子。当一个进程在拣子时,不允许另一进程去拣。试写出这两个并发进程能正确执行的程序。
begin
mutex := 1; cobegin P1: begin repeat
P(mutex); 拣白子; V(mutex); until false end P2: begin repeat
P(mutex); 拣黑子; V(mutex); until false end coend end
加上“当以一进程拣了一子时,必须让另一个进程去拣”条件:
设置两个信号量S1和S2来协调进程P1和P2之间的同步。假定先让P1拣白子,则信号量S1和S2的初值分别为1和0。两个并发进程相应的程序如下: begin
S1 :=1; S2 := 0; cobegin P1: begin repeat P(S1); 拣白子; V(S2); until false end
P2: begin repeat P(S2); 拣黑子; V(S1); until false end coend end 2.
用P、V操作实现下述问题的解。
桌上有一个盘子,可以存放一个水果,父亲总是放苹果到盘子中,而母亲则总是放香蕉到盘子中;一个儿子专等吃盘中的香蕉,而一个女儿专等吃盘中的苹果。
由于父亲和母亲可以同时向盘子放水果,所以盘子是临界资源,应设置一个互斥信号量mutex来实现放水果的互斥,其初值为1.此外父亲和女儿,母亲和儿子之间存在同步关系,及分别设置信号量apple和banana来分别实现这种同步关系,其初值均为0。 4个进程的并发程序如下: begin
mutex := 1;
apple := 0; banana := 0; cobegin father: begin repeat
P(mutex);
向盘中放苹果; V(apple); until false; end; mother: begin repeat P(mutex);
向盘中放香蕉; V(banana); until false end; daughter: begin repeat P(apple);
取盘中的苹果; V(mutex); until false; end; son: begin repeat P(banana);
取盘中的香蕉; V(mutex); until false; end; coend; end;
升级版
桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,可向盘中放桔子;儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿3个并发进程的同步。 begin
mutex := 1;
apple := 0; banana := 0; cobegin father: begin repeat
P(mutex);
将水果放入盘中;
if 放入的是桔子 then V(orange) else V(apple); until false; end;
daughter: begin repeat P(apple);
取盘中的苹果; V(mutex); until false; end;
son:
begin repeat P(orange);
取盘中的香蕉; V(mutex); until false; end; coend; end;
桌上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘子放苹果,妈妈专向盘子中放桔子;两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。请用P、V操作来实现爸爸、妈妈、儿子和女儿之间的同步与互斥关系。
与上一例不同的是,现在盘子可以放入两个水果,因此除了互斥信号量mutex之外,还应对允许向盘中放入水果的个数进行计数,即再设置一个信号量empty,其初值为2.此外由于盘子中可以放两个水果,即当盘中有一个水果时,存在着既可以放有可以取得情况,因此,除了对放水果进行互斥外,对取水果也应进行互斥。此时,4个进程的并发程序如下: begin
mutex := 1; empty := 2; apple := 0; orange := 0; cobegin father: begin repeat P(empty); P(mutex);
向盘中放苹果; V(mutex); V(apple); until false end
mother: begin repeat P(empty); P(mutex);
向盘中放桔子; V(mutex); V(orange); until false end
daughteri(i = 1, 2;):