主观题:h415.利用管程解决教科书上的哲学家进餐问题。
利用管程解决教科书上的哲学家进餐问题。
答案:解:
利用管程解决哲学家进餐问题,首先要为它们建立一个管程,命名为Philosopher,简称为PH。其中包括2个过程:
(1) get(i)过程。第i号哲学家取筷子的过程。用整型数组chop[0..4]来表示筷子,chop[i]=1表示第i号筷子空闲,chop[i]=0表示第i号筷子已被取走。当chop[i]=1且chop [(i+1) mod 5]=1时,第i号哲学家才可取筷子(chop[i]=0,chop [(i+1) mod 5]=0);否则阻塞。(4分)
(2) put(i)过程。第i号哲学家放下筷子的过程。对左右筷子对应的变量分别置1,并且唤醒等待该筷子的哲学家进程。(6分)
PH管程可描述如下(用伪代码):
type PH=monitor
var chop:array[0..4] of integer;
cc: array[0..4] of condition;
procedure entry get(integer i) //第i号哲学家取筷子过程
begin
j:=(i+1) mod 5;
L1: if chop[i]=0 or chop[j]=0 then
begin
if chop[i]=0 then cc[i].wait;
else cc[j].wait;
goto L1; //被唤醒后必须回到if语句开头(L1处)(2分)
end
chop[i]:=0; //拿起左边的筷子
chop[j]:=0; //拿起右边的筷子
end
procedure entry put(integer i) //第i号哲学家放下筷子过程
begin
chop[i]:=1; //放下左边筷子
if cc[i].queue then cc[i].signal;
chop[j]:=1; //放下右边筷子
if cc[j].queue then cc[j].signal;
end
begin
chop[0]:=:chop[1]:=chop[2]:=1; //初始化数据(2分)
chop[3]:=chop[4]:=1;
end
利用管程解决哲学家进餐问题时,第i个哲学家进程可描述为:
Pi ( ) (i=0..4)
begin
repeat
PH.get(i); //取筷子
吃面条;
PH.put(i); //放下筷子
思考问题;
until false
end
parbegin
P0( );
P1( );
P2( );
P3( );
P4( );(2分)
parend
答案:解:
利用管程解决哲学家进餐问题,首先要为它们建立一个管程,命名为Philosopher,简称为PH。其中包括2个过程:
(1) get(i)过程。第i号哲学家取筷子的过程。用整型数组chop[0..4]来表示筷子,chop[i]=1表示第i号筷子空闲,chop[i]=0表示第i号筷子已被取走。当chop[i]=1且chop [(i+1) mod 5]=1时,第i号哲学家才可取筷子(chop[i]=0,chop [(i+1) mod 5]=0);否则阻塞。(4分)
(2) put(i)过程。第i号哲学家放下筷子的过程。对左右筷子对应的变量分别置1,并且唤醒等待该筷子的哲学家进程。(6分)
PH管程可描述如下(用伪代码):
type PH=monitor
var chop:array[0..4] of integer;
cc: array[0..4] of condition;
procedure entry get(integer i) //第i号哲学家取筷子过程
begin
j:=(i+1) mod 5;
L1: if chop[i]=0 or chop[j]=0 then
begin
if chop[i]=0 then cc[i].wait;
else cc[j].wait;
goto L1; //被唤醒后必须回到if语句开头(L1处)(2分)
end
chop[i]:=0; //拿起左边的筷子
chop[j]:=0; //拿起右边的筷子
end
procedure entry put(integer i) //第i号哲学家放下筷子过程
begin
chop[i]:=1; //放下左边筷子
if cc[i].queue then cc[i].signal;
chop[j]:=1; //放下右边筷子
if cc[j].queue then cc[j].signal;
end
begin
chop[0]:=:chop[1]:=chop[2]:=1; //初始化数据(2分)
chop[3]:=chop[4]:=1;
end
利用管程解决哲学家进餐问题时,第i个哲学家进程可描述为:
Pi ( ) (i=0..4)
begin
repeat
PH.get(i); //取筷子
吃面条;
PH.put(i); //放下筷子
思考问题;
until false
end
parbegin
P0( );
P1( );
P2( );
P3( );
P4( );(2分)
parend