下面是一段带有两个线程(生产者和消费者)的代码,它们可以并行运行。此外,S和Q是配备有标准P和V操作的二进制信号量。 semaphore S = 1, Q = 0; integer x;
生产者:消费者: while(真的)做while(真的)做 P(S);P(Q); x=产品();消耗(x); V(Q);五(S); 完成
关于上述计划,以下哪项是正确的? (A) 这个过程可能会死锁 (B) 其中一根线可能会饿死 (C) 生产商生产的一些物品可能会丢失 (D) 生产者生成并存储在“x”中的值将始终在生产者生成新值之前被消耗 答复: (D) 说明: 信号量是硬件或软件标记变量,其值指示公共资源的状态。其目的是锁定正在使用的资源。需要资源的进程将检查信号量,以确定资源的状态,然后决定继续。在多任务操作系统中,活动通过使用信号量技术进行同步。 等待和信号在信号量上定义。进入临界区由等待操作控制,退出临界区由信号操作控制。等待、信号操作也称为P和V操作。信号量的操作如下所示:
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,然后消耗该物品。 V(S)在S上, 现在,消费者不再将S的值更改为1,而是唤醒Q队列上被阻塞的进程。因此,进程P被唤醒。P从st2恢复,因为它在语句1被阻塞。P现在生成下一项。所以消费者在生产者生产下一个产品之前就消费了一个产品。 正确的选项是(D)。
选择这个问题:
A) 死锁无法发生,因为生产者和消费者都在不同的信号量上操作(无等待) B) 没有饥饿发生,因为P和消费者之间存在变化,这也使得他们有有限的等待。 (C) 生产商生产的一些物品可能会丢失,但不会。 参考: https://www.geeksforgeeks.org/mutex-vs-semaphore/
这个解决方案是由 尼蒂卡·班萨尔 这个问题的小测验