考虑以下生产者-消费者同步问题的解决方案。共享缓冲区大小为 N。三个信号量empty、full和mutex定义为各自的初始值 0、N 和 1。Semaphore empty表示缓冲区中可用插槽的数量,供消费者读取。信号量已满表示缓冲区中可用插槽的数量,供生产者写入。下面代码中由 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,因此您不能在第一次尝试时等待空信号量。
注意 –空信号量表示填充槽的数量,因此生产者进程必须处理空和互斥信号量。 full semaphore 表示空槽的数量,因此消费者进程必须处理full和 mutex 信号量。
选项 (A) 导致饥饿。
选项 (B) 导致饥饿。
选项(D)由于填充槽的数量最初为 0 由空信号量表示,因此消费者进程无法消费。所以,这种暗示是错误的。
只有 P: empty , Q: full , R: full , S: empty是确保无死锁和无饥饿实现的正确顺序。
选项(C)是正确的。
观看 GeeksforGeeks 视频说明:
这个问题的测验