1. 案例介绍 有一单向行驶的公路桥,每次只允许一辆汽车通过。当汽车到达桥头时,若桥上无车,便可上桥;否则需等待,直到桥上的汽车下桥为止。若每一辆车为一个进程,请用Wait、Signal操作保证汽车按要求过桥。 2. 案例分析 可以将公路桥看作一个临界资源,设置一个信号量S实现互斥,初值为1。由于每个汽车过桥的过程相同,这里只给出一辆汽车Pi过桥的同步描述。 Semaphore S=1; Pi( ){ While(1){ 到达桥头; Wait(Mutex); 上桥行驶; 到达桥的另一端; Signal(Mutex); } } 3. 教学组织 传统教学是注入式教学,而在案例教学过程中,教师是主导地位,学生是主体地位,教师可以带领学生从未知领域进入已知领域[4]。在组织实施时,可以在给出问题描述后先让学生讨论,然后引导学生分析在这个问题中需要互斥访问的临界资源是什么,如何去定义信号量,初始值是多少。定义好信号量后,和学生一起写出解决这个问题的算法。 二、利用信号量实现前趋关系的案例 有些进程在运行时具有前趋关系。例如,进程C完成数据处理后进程P才可以进行结果打印,则进程C和P之间存在前趋关系,即C→P。利用信号量可以实现进程间的前趋关系。 (一)基本方法 在实现前趋关系时,可以为进程C和P定义一个公用信号量S,并设置初始值0。进程C完成数据处理后要执行Signal(S)操作向进程P发一个信号,而进程P在打印之前要执行Wait(S)操作,即收到信号后才可以打印。 |