【问题标题】:What happens when process call signal on a semaphore?当信号量上的进程调用信号时会发生什么?
【发布时间】:2019-06-05 14:55:33
【问题描述】:

如果信号量上的进程调用信号会发生什么。

假设信号量计数为 3。进程 P1、P2、P3 调用等待信号量并进入临界区。 P4、P5、P6 也称为等待,但由于信号量计数已经为 0,它们将在信号量的等待队列中等待。 现在 P7 来了并调用了 signal(),等待信号量的进程(P4、P5 或 P6)会被唤醒吗?它被唤醒然后它是一个错误,因为信号量计数为 2,但 p1、p2 和 p3 还没有离开临界区。

【问题讨论】:

    标签: operating-system mutex semaphore critical-section


    【解决方案1】:

    只有一个正在休眠的线程(P4、P5 和 P6 之一)会被唤醒。你说信号量是 2,其实是 1,对吧?

    这种行为是正确的,因为 P7 调用了signal。任何线程都可以在信号量上调用signal,即使它最初没有在信号量上调用wait。这与互斥锁不同,后者确实具有所有权概念(例如,如果线程从未在互斥锁上调用 lock,则线程无法在互斥锁上调用 unlock)。

    【讨论】:

    • 你说信号量是2,但实际上是1,对吧? -- 是的,没错,谢谢指正。
    • 如果 P7 调用信号,那么将有 4 个进程处于活动状态或在 CS 右侧。但声明的信号量计数为 3,这意味着只有 3 个可以处于活动状态。这个概念被打败了对吧?
    • @user2231999 创建信号量时指定的数字是它的初始计数。 不是可以在临界区中的最大线程数或最大线程数,因为正如您所指出的,您可以在信号量上调用 signal 以超过初始计数或允许更多线程进入临界区。所以你是对的——在这种情况下,4 个不同的线程可以进入关键部分。这不被认为是不正确的行为,因为 P7 确实调用了signal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2012-07-27
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多