进程的同步是指并发进程之间存在一种制约关系, 一个进程的执行依赖另一个进程的消息, 当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。
PV操作与管程是两种典型的同步机制。 本文只介绍怎样用PV操作实现进程间的同步。
某工厂有一个可以存放设备的仓库, 总共可以存放8台设备。 生产部门生产的每一台设备都必须入库。销售部门可以从仓库提出设备供应客户。 设备的入库和出库都必须借助运输工具。 现只有一套运输工具, 每次只能运输一台设备。 请设计一个能协调工作的自动调度管理系统。
实际上, 这仍然是一个生产者/消费者问题。 按题意可知, 该系统要协调的工作主要有两个方面:
1 仅当仓库不满时才允许把生产部门生产的设备存入仓库,仅当仓库有设备时才允许销售部门提出设备去销售。
2 生产部门与销售部门要竞争运输工具,以便各自完成设备的入库和出库。
对于1 而言,涉及到进程同步, 对于2而言,由于竞争共享资源的使用权, 应使它们互斥地使用运输工具, 所以这是一个同步与互斥的混合问题。
用PV操作实现管理时应定义3个信号量, 其中两个表示必须互通的消息, 另一个用于控制运输工具的互斥使用权。 各信号量的含义如下:
S1: 仓库中尚可存放多少设备, 初值应为8.
S2: 仓库中的设备数, 初值应为0.
mutex: 运输工具是否空闲, 初值为1, 表示空闲。
-----------------------------------
cobegin 和 coend的意思:cobegin 是并行开始的意思, coend并行结束的意思。
这个两个单词表示操作系统的并行语言的一种命令。这两个单词都是合成词。
co是concurrent的头两个字符,concurrent的意思为同时发生的
-----------------------------------
生产部门每生产一台设备后应调用P(S1)来测试仓库中是否还可存放设备, 调用P(mutex) 来测试是否可使用运输工具。当仓库尚未占满且运输工具空闲时才能把生产出来的设备送入仓库, 否则要等待。 当设备存入仓库后, 应调用 V(mutex)和V(S2)来归还运输工具的使用权和把仓库中有设备的消息发送给销售部门。 销售部门应调用P(S2)来测试仓库中是否存有设备,调用P(mutex)来竞争运输工具的使用权。当仓库中有设备且运输工具空闲时就可以从仓库中取出一台设备, 否则等待。 当取出一台设备后应调用V(mutes) 和V(S1)来归还运输工具的使用权和把仓库中有空位可以存放设备的消息发送给生产部门。
这个自动调度管理系统的程序如下:
begin
mutex, S1, S2: semaphore;
mutex : =1; S1 : =8;S2 : =0;
cobegin
Process A
begin
L1 : {生产一台设备};
P(S1); /**测试仓库中是否还可存放设备**/
P(mutex); /**测试能否使用运输工具*/
{把设备送入仓库} ;
V(mutex); /**归还运输工具的使用权**/
V(S2); /**发送仓库中又存了一台设备的消息**/
goto L1;
end;
Process B
begin
L2 : P(S2); /**测试仓库中是否有可供销售的设备**/
P(mutex); /**测试能否使用运输工具 **/
{从仓库取出一台设备};
V(mutex); /**归还运输工具的使用权**/
V(S1); /**发送仓库中有空位可存设备的消息 **/
{把设备销售给客户};
goto L2;
end;
coend;
end;