考虑以下生产者-消费者同步问题的解决方案。共享缓冲区的大小为N。定义了三个信号量为空,完整和互斥的初始值分别为0,N和1。信号量为空表示缓冲区中可供用户读取的可用插槽数。信号量已满表示生产者要写入的缓冲区中的可用插槽数。以下代码中的占位符变量(用P,Q,R和S表示)可以分配为empty或full 。有效的信号量操作为: wait()和sigmal() 。
对P,Q,R和S进行以下哪一项赋值将得出正确的解决方案?
(A) P:满,Q:满,R:空,S:空
(B) P:空,Q:空,R:满,S:满
(C) P:已满,Q:空,R:空,S:已满
(D) P:空,Q:满,R:满,S:空答案: (C)
说明:鉴于,
空= 0
满= N
互斥体= 1
由于空信号量的值为0,所以您不能等待空信号量的第一次尝试。
注–空信号量表示已填充的插槽数,因此生产者进程必须处理空信号量和互斥量信号量。完整的信号量表示空插槽的数量,因此使用者进程必须处理完整和互斥的信号量。
选项(A)导致饥饿。
选项(B)导致饥饿。
选项(D)由于已填充的插槽数最初为空信号量表示为0,因此无法使用消费者进程。因此,这种暗示是错误的。
只有P:空,Q:满,R:满,S:空才是正确的顺序,以确保无死锁和无饥饿的实现。
选项(C)是正确的。
这个问题的测验