P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。也就是不好的一方面。
V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。也就是变好的一方面。
1,桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
解:设三个信号量S、So、Sa;信号量S表示盘子是否为空,其初值为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:
int S=1;
int Sa=0;
int So=0;
main(){beginfather();son();daughter();end
}
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);//吃苹果}
}
2,设公共汽车上,司机和售票员的活动分别是:
在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现他们的同步。
解:司机和售票员的活动得同步,如下所示
司机 | 售票员 |
---|---|
启动车辆 | 关车门 |
正常行车 | 售票 |
到站停车 | 开车门 |
设两个信号量S1,S2;
S1表示是否运行司机启动汽车,其初值为0
S2表示是否运行售票员开门,其初值为0
用P、V原语描述如下:
int S1=0;
int S2=0;
main(){begindriver();busman();end
}
driver(){while(1){P(S1);启动车辆;正常行车;到站停车;V(S2);}
}
busman(){while(1){关车门;V(S1);售票;P(S2);开车门;上下乘客;}
}
未完待续。。。