某系统中有一个缓冲区,进程P1不断地生产产品送入缓冲区,进程P2不断地从缓冲区取产品消费。假设该缓冲区只能容纳一个产品。进程P1与P2的同步模型如图所示:
为此,应设信号量S1的初值为 (47) ,信号量S2的初值为 (48) 。
(47)
参考答案:C
解析:这是经典的“生产者-消费者”问题,它不仅要解决生产者进程与消费者进程的同步关系,还要处理缓冲区的互斥关系,因此通常需要3个信号量来实现。
Empty,用于管理同步,说明空闲的缓冲区数量,最早没有产生东西,因此其初始值应为缓冲区的最大值。
Full,用于管理同步,说明已填充的缓冲区数量,其初始值应为0。
Mutex,用于管理互斥,保证同时只有一个进程在写缓冲区(因此其初始值应为1)。
其算法如下所示:
生产者 消费者
loop loop
… …
生产一个产品; P(full);
P(empty); P(mutex);
P(mutex); 从缓冲区中取一个产品;
将新产品放入缓冲区; V(mutex);
V(mutex); V(empty);
V(full); 使用产品;
… …
Endloop Endloop
但由于本例中“缓冲区只能容纳一个产品”,因此可以使用empty、full两个变量组合控制生产者、消费者对缓冲区放、取产品的控制。当缓冲区为空的时候,empty变量为1,fun变量为0,表明缓冲区只能用于生产者“将新产品放入缓冲区”;当缓冲区为满的时候,empty变量为0,full变量为1,表明缓冲区只能用于消费者“从缓冲区中取一个产品”。
因此,可以得知信号量S1就是相当于这里的empty,S2则是相当于full。由于empty需说明空闲的缓冲区数量,而本题中缓冲区数量一开始应该是空闲的,因此应该取值1。而full显然应该取值为0。