P81:
第2题、第22题、第24题
补充:
1.某车站售票厅,最多可容纳20名购票者进入,当售票厅中少于20名购票者时,其厅外的购票者可立即进入,否则,需在外面等待.若把一个购票者看作一个进程,请回答下列问题: (1)写出用P/V操作管理这些并发进程时信号量的初值以及信号量的各种取值的含义。 (2)根据所定义的信号量,把应执行的P/V操作填人下述方框中,以保证进程能够正确地并发执行。
procedure Pi (i=1,2,…);
begin
|①|
进入售票厅; 购票;
退出售票厅; |②| end ; begin parbegin
Pi (i=1,2,…) parend end.
(3)若欲购票者最多为n个人,试写出信号量取值的可能的变化范围(最大值和最小值). 答:(1)定义一个信号量S,其初值为20,s取值的含义如下:
S 〉O S的值表示可继续进入售票厅的人数 S =0 表示售票厅中已有20名顾客(购票者) S (3)S的最大值为20,S的最小值为20-n. 2.桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。 解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初为0。同步描述如下: int s=1; int Sa=0; int S0=0; main( ) cobegin father( ); son ( ); dauduer( ); coend } father ( ) { while (1) { p(S); 将水果放入盘中: if(放入的是桔子〉v(So); else v(Sa); } } son ( ) { while(1) { p(So); 从盘中取出桔子; v(S); 吃桔子; } } daughter( ) { while(1) { p(Sa); 从盘中取出苹果: v(S); 吃苹果; } } 3、设公共汽车上,司机和售票员的活动分别是: 司机的活动: 售票员的活动: 启动车辆; 关车门; 正常行车; 售 票; 到站停车; 开车门; 在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。 解:在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。因此司机启动车辆的动作必须与售票员关车门的动作取得同步:售票员开车门的动作也必须与司机停车取得同步。 在本题中,应设置两个信号量:s1、s2,s1表示是否允许司机启动汽车,其初值为0;s2表示是否允许售票员开门,其初值为0。用P、V原语描述如下z int s1=0; int s2=0; main( ) { parbegin driver( ); busman( ); parend } driver( ) { while(1〉 { p(s1); 启动车辆; 正常行车; 到站停车; v(s2); } } busman( ) { while(1) { 关车门; v(sl); 售票; p(s2); 开车门; 上下乘客; } }