📜  门|门 IT 2008 |第 51 题

📅  最后修改于: 2021-09-26 03:44:06             🧑  作者: Mango

下面的代码有两个线程,生产者和消费者,可以并行运行。此外,S 和 Q 是配备标准 P 和 V 操作的二进制信号量。

semaphore S = 1, Q = 0;
integer x;

生产者:消费者:
while (true) do while (true) do
P(S); P(Q);
x = 生产 ();消耗(x);
V(Q); V(S);
完成 完成

关于上述程序,以下哪项是正确的?
(A)进程会死锁
(B)其中一个线程可能会饿死
(C)生产者生产的部分物品可能会丢失
(D)由生产者生成并存储在 ‘x’ 中的值总是会在生产者生成新值之前被消耗掉答案: (D)
说明:信号量是硬件或软件标记变量,其值指示公共资源的状态。它的目的是锁定正在使用的资源。需要资源的进程将检查信号量以确定资源的状态,然后决定继续进行。在多任务操作系统中,活动是通过使用信号量技术来同步的。
信号量上定义了等待和信号。进入临界区由等待操作控制,退出临界区由信号操作负责。等待、信号操作也称为 P 和 V 操作。信号量 (S) 的操作如下:

1. 等待命令 P(S) 将信号量值递减 1。如果结果值变为负数,则 P 命令被延迟,直到条件满足。
2. V(S) 即信号操作将信号量值加 1。

解决方案:

消费者只有在生产者生产了物品后才能消费,而生产者只有在消费者消费了物品后才能生产(第一次除外)。

让我们解释一下这段代码的工作原理。
提到生产者和消费者并行执行。

制作人:

st1 – S 值为 1,S 上的 P(S) 使其为 0 并且
st2 – 然后生成 x 项。
st3 – Q 值为 0。 Q 上的 V(Q) 使其为 1。

这是一个无限的while循环应该无限迭代。在 while 循环的下一次迭代中,S 已经是 0 ,进一步的 P(S) 在 0 上将 P 发送到 S 的阻塞列表。因此生产者被阻塞。

消费者:

Q 上的 P(Q) 使 Q = 0,然后消费该项目。
S 上的 V(S),
现在,消费者不再将 S 的值更改为 1,而是唤醒 Q 队列上的阻塞进程。因此进程P被唤醒。 P 从 st2 恢复,因为它在语句 1 处被阻塞。所以 P 现在生成下一项。所以消费者在生产者生产下一个项目之前消费了一个项目。
正确选项是(D)。

本题选择:

A)死锁不会发生,生产者和消费者都在不同的信号量上运行(没有保持和等待)
B) 没有饥饿发生,因为 P 和消费者之间有变化,这也使他们有界等待。
(C) 生产者生产的某些物品可能会丢失,但不会丢失。参考:
https://www.geeksforgeeks.org/mutex-vs-semaphore/

此解决方案由Nitika Bansal 提供
这个问题的测验