S1 信号量保护计数器,其初值为 1,R 的初值为 0 ;互斥使用桥的信号量用 S 表示,其初值为 1。(2’) 同步算法描述如下: procedure goriver() begin L:P(S1); // 为同时过河, 申请对计数器计数 If R>N begin V(S1); goto L; end // 同方向过河的人站满桥墩时, 重新申请计数 R=R+1; If R==1 P(S); // 申请过河 V(S1); // 释放计数器的使用权(3’) 占有一个桥墩, 并顺序过河到对岸; P(S1); R=R-1; If R==0 V(S); // 如果已经无同向的人过河, 释放占用权 V(S1); (3’) end. 7 在一个飞机订票系统中, 多个用户共享一个数据库。各用户可以同时查询信息, 若有一个用户要订票, 须更新数据库时, 其余所有用户都不可以访问数据库。请用 P,V 操作设计一个同步算法, 实现用户查询与订票功能。要求: 当一个用户订票而需要更新数据库时, 不能因不断有查询者到来而使其长时间等待。利用信号量机制保证其正常执行。解: 这是典型的读者——写者问题, 查询信息的用户是读者, 订票用户是写者, 并且要求写者优先。(2’) 变量说明: (`2 ’) 计数变量 rc ——正在运行的查询者进程数目,初值为 0. 信号量 Sw ——控制订票者进程的活动,初值为 1. Src ——互斥使用 rc 变量,初值为 1. S ——当订票者到达时封锁后续的读进程,初值为 1. 读者进程 P(S) P(Src) rc=rc+1 if (rc==1) P(Sw) V(Src) V(S) (2’) 查询库当中的信息 P(Src) rc=rc-1; if (rc==0) V(Sw) V(Src) (2’) 写者进程(`2 ’) P(S) P(Sw) 更新数据库内容 V(Sw)