【问题标题】:Semaphores for process synchronization进程同步的信号量
【发布时间】:2011-06-13 09:32:08
【问题描述】:

我对信号量的理解还不够透彻。每次我冒险去理解它们,就会弹出一些我不理解的东西。

这是我此刻的问题:

我在“操作系统概念”中读到:"*信号量 S 是一个整数变量,除了初始化之外,它只能通过两个标准原子操作访问:wait() 和 signal() ."*

原子在这里是什么意思?是不是意味着这个操作会一次性执行?

但是这本书接着给出了一个 wait() 的示例实现:

wait(S) {
while S <= 0
; // no-op
S--;
}

其中有一个 while 循环(这取决于其他进程),它怎么能一次运行(即没有任何其他进程执行发出信号,这将打破 while 循环)

请解释,

【问题讨论】:

    标签: synchronization operating-system kernel semaphore interrupt


    【解决方案1】:

    wait 的示例代码只是说明性的,不太可能以这种方式实现。如果计数器不大于零,大多数操作系统会暂停尝试获取信号量的线程。

    但是,从技术上讲,该示例可以运行。如果 S 被标记为 volatile,则 wait() 将看到任何其他进程或线程的更改。 wait() 将在一个紧密的循环中旋转,直到满足条件并且会占用 CPU,但它会工作。请注意,这种 CPU 咀嚼是操作系统在无法满足条件时暂停调用线程的原因。您需要以原子方式进行测试和递减,这通常通过使用 OS 原子函数来完成,例如 Windows 上的 InterlockedCompareExchange。

    【讨论】:

    • 你说如果 S 被标记为 volatile,那么 wait() 会看到任何其他进程或线程的更改。但我不明白,如果等待是原子的,它会将 CPU 留给自己,那么其他进程根本没有机会修改 S
    • 从调用者的角度来看它是原子的,它取决于 wait() 的实现来决定如何最好地工作。重要的是,当有人调用 wait() 时,它具有可观察到的原子行为。
    • 感谢从调用者的角度指出。此外,我了解到内核会使用锁定技术(例如自旋锁)来确保 wait() 和 signal() 以原子方式执行,即没有两个进程可以同时在同一个信号量上执行 wait 和 signal。
    【解决方案2】:

    是说这个操作会一次性执行吗?

    基本上,是的。

    这个例子不是一个实际的实现,(我希望!),只是一个 C 风格的功能表示。实际实现是特定于操作系统/CPU 的,因为需要内核/硬件支持来消除忙等待并确保在多核处理器上正确运行。

    Rgds, 马丁

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-13
      • 2016-08-04
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多