Process Synchronization Problems
1、在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。
司机和售票员工作流程图
分析:司机必须在售票员关门后才能启动车辆。在车辆启动后,售票员的售票行为和正常行车已经到站停车都没有相互制约关系。然而,售票员的开车门动作必须在司机到站停车动作完成后才能发生。因此定义司机的信号量为Driver_S ,售票员信号量为Conductor_S, init: Driver_S = Conductor_S=0;
算法:
Semaphore Driver_S = 0, Conductor_S = 0;
Driver(){
While(true){
Wait(Driver_S) //等待售票员关门
StartBus(); //启动车辆
NormalDriving(); //正常行驶
StopBus(); //停车
Signal(Conductor_S); //允许售票员开门
}
}
Conductor (){
While(true){
closeDoor(); //关门
signal(Driver_S); //允许司机启动
sellTicket(); //售票
wait(Conductor_S); //等待司机停车
openDoor(); //关门
}
}
main()
{
cobegin{
Driver();
Conductor ();
}
}
2、桌子上有一只盘子,盘子中只能放一只水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。用wait()和signal()信号量操作实现他们之间的同步机制。
分析:因为盘子中只能放一只水果,因此爸爸和妈妈对盘子的访问必须是互斥的,那么定义一个信号量用来互斥访问盘子Dish,儿子和女儿对苹果和橘子的需求不同因此定义苹果和橘子的信号量为Apple,Orange;init: Dish= 1, Apple=Orange = 0;
Semaphore Dish = 1, Apple=Orange=0;
Father(){
Wait(Dish); //等待盘子没有水果
putAppleIntoDish(); //往盘子里放苹果
signal(Apple); //盘子有苹果,儿子可以拿
}
}
mother(){
While(true){
Wait(Dish); //等待盘子没有水果
putOrangeIntoDish(); //往盘子里放橘子
signal(Orange); //盘子有橘子,女儿可以拿
}
}
Son(){
While(true){
Wait(Apple); //等待爸爸放苹果
pickApple(); //拿走苹果
Signal(Dish); //盘子可以放水果了
}
}
Daughter(){
While(true){
Wait(Orange); //等待妈妈放橘子
pickOrange (); //拿走橘子
Signal(Dish); //盘子可以放水果了
}
}
main()
{
cobegin{
Father();
Mother();
Son();
Daughter();
}
}
3、设有一个售票厅,可容纳100人购票。如果厅内不足100人则允许进入,进入后购票,购票后退出。如果厅内已有100人,则在厅外等候。试问:
(1) 购票者之间是同步还是互斥?
互斥关系;
(2) 用wait()和signal()操作表达购票者的工作过程。
分析:售票厅最多能容纳100人,因此需要一个信号量empty ,来控制售票厅是否能进入。购票者之间为互斥关系,因此需要一个信号量来制约购票mutex; init: empty=100,mutex = 1;
Semaphore empty = 100,mutex = 1;
BuyTicketProcedure(){
While(true){
Wait(empty); //售票厅允许进入
Wait(mutex); //没人在买票
buyTicket(); //买票
signal(mutex); //退出售票窗口
signal(empty); //走出售票厅
}
}
Main(){
Cobegin(){
BuyTicketProcedure();
}
}