(二)案例分析 在操作系统中也有很多有趣的进程同步问题可以归为这一类,如公共汽车问题、围棋问题、抽烟问题、4×100接力赛问题等。下面以公共汽车问题为例进行介绍。 1. 案例介绍 在公共汽车上,司机和售票员各行其职,司机负责开车和到站停车;售票员负责售票和开、关车门,当售票员关好车门后,驾驶员才能开车行驶。试用Wait、Signal操作实现司机与售票员间的同步。 2. 案例分析 这是一个典型的用信号量实现前趋关系的案例:司机必须到站停车后售票员才可以打开车门,乘客上车,售票员关上车门后司机才可以再开车行驶。所以,在这个案例中要定义两个信号量,一个是司机何时开车,一个是售票员何时开车门。司机和售票员的同步关系可描述如下: Semaphore S1=0; /*开车信号 Semaphore S2=0; /*开车门信号 Driver( ){ While(1){ 正常行车; 到站停车; Signal(S2); Wait(S1); } } BookingClerk( ){ While(1){ 售票; Wait(S2); 开车门; 关车门; Signal(S1); } } 3. 教学组织 |