【问题标题】:Understanding semaphores了解信号量
【发布时间】:2012-05-13 07:48:11
【问题描述】:

我正在阅读“操作系统概念”中有关信号量的内容(对于那些了解它的人),并且我认为我完全理解了信号量,直到我阅读了这段话:

信号量的关键方面是它们被执行 原子地。我们必须保证没有两个进程可以执行等待 同时对同一个信号量进行信号操作。

还有:

如果硬件不提供任何特殊的原子指令,我们 可以为关键部分使用任何软件解决方案 问题,其中关键部分由等待和信号组成 程序。

这段话是指面对SignalWait 操作必须是原子的。 我认为信号量的全部目的是在任何给定时间只让一个进程进入关键部分 - 如果我必须使用另一种算法(如面包店算法),为什么我还需要信号量?

我意识到我的问题可能令人困惑。如果是,那只是因为主题对我来说还很模糊,所以即使问一个问题也有点困难。

希望阅读任何说明...

【问题讨论】:

    标签: semaphore critical-section


    【解决方案1】:

    信号量想象成夜总会中的保镖。有一定数量的人可以同时进入俱乐部。如果俱乐部已满,则不允许任何人进入,但一旦一个人离开,另一个人可能会进入。

    这只是一种限制特定资源的消费者数量的方法。例如,限制应用程序中同时调用数据库的次数。

    Source:

    【讨论】:

      【解决方案2】:

      我在课堂上向教授提出了同样的问题,他的回答是“把信号量想象成一把锤子,一旦你有了一把锤子,你就可以用它做很多事情,而在硬件的原子支持下或相互排斥的软件解决方案,例如 Peterson 或 Bakery 是有限的”。

      【讨论】:

        【解决方案3】:

        我认为您在区分信号量和互斥量时遇到了麻烦。二进制信号量可以以与互斥锁相同的方式实现,但它们实际上用于不同的目的。信号量保护资源,而互斥锁严格保护代码块。区别往往是微妙的。

        使用信号量,您会遇到各种变化,例如计算信号量,因此只有一个进程可以访问资源的想法并不总是正确的。您可能希望阻止对一个进程或线程的写入,但允许从多个(读取器/写入器锁)读取。

        我建议您查看有关该主题的维基百科文章。其实挺好的。
        http://en.wikipedia.org/wiki/Semaphore_(programming)

        【讨论】:

          【解决方案4】:

          这里讨论的是信号量的实现,而不是它们的使用。如果硬件支持信号量之类的原子操作,当用户调用Signal/Wait时会用到它们。如果硬件不支持,信号量实现本身会寻找其他方法来确保相同的功能。

          这对用户来说是透明的,除了没有这种支持的系统在调用SignalWait 时会花费更长的时间。 (此外,大多数(如果不是全部)现代硬件平台都支持信号量的原子操作。)

          如果你想要互斥,你用来获取它的机制必须是原子的。

          【讨论】:

            【解决方案5】:

            原子性是实现互斥的方式。假设您一次只希望一个线程进入代码的关键部分。你是怎样做的?好吧,您有一个“锁定/解锁”指示器。并且您强制线程在进入代码的关键部分之前将指示器从“解锁”更改为“锁定”。

            但是是什么阻止了两个线程都看到指示器“解锁”,同时将其切换为“锁定”,然后同时执行代码的关键部分?而答案是,从“解锁”切换到“锁定”的操作必须是原子的。也就是说,它必须同时发生,所以两个线程不可能都成功地将指示器更改为“锁定”。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-21
              • 2020-11-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多