📜  门| Gate IT 2008 |第51章

📅  最后修改于: 2021-06-29 20:59:07             🧑  作者: Mango

以下是具有两个线程(生产者和使用者)的代码,它们可以并行运行。此外,S和Q是配备有标准P和V操作的二进制信号量。

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

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

关于上述程序,以下哪项是正确的?
(A)进程可能会死锁
(B)一根线可能饿死
(C)生产者生产的某些物品可能会丢失
(D)由生产者生成并存储在“ x”中的值将始终在生产者生成新值之前被消耗掉答案: (D)
说明:信号量是硬件或软件标签变量,其值指示公共资源的状态。其目的是锁定正在使用的资源。需要资源的进程将检查信号量以确定资源的状态,然后再决定是否继续。在多任务操作系统中,通过使用信号量技术来同步活动。
在信号量上定义了wait和signal。进入临界区由等待操作控制,而离开临界区则由信号操作来控制。等待信号操作也称为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,另外0上的P(S)将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提供
这个问题的测验