首页 文章

用于进程同步的信号量

提问于
浏览
1

我从来没有完全理解信号量 . 每一次,我冒昧地理解它们,弹出一些东西,我不明白 .

这是我现在的问题:

我在"Operating System Concepts"中读到: "A semaphore S is an integer variable that, apart from initialization, is accessed only through two standard atomic operations: wait() and signal().

原子在这里意味着什么?这是否意味着此操作将一次执行?

但随后本书继续给出wait()的一个示例实现:

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

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

请解释,

2 回答

  • 1

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

    但是,从技术上讲,这个例子可以起作用 . 如果S被标记为volatile,那么wait()将看到任何其他进程或线程的更改 . wait()会在一个紧密的循环中旋转,直到条件满足并且会咀嚼CPU,但它会起作用 . 注意,这个CPU咀嚼是OS为什么会挂起调用线程的条件是不能满足的 . 您需要以原子方式进行测试和递减,这通常通过使用OS原子函数来完成,例如Windows上的InterlockedCompareExchange .

  • 0

    这是否意味着此操作将一次执行?

    基本上,是的 .

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

    Rgds,马丁

相关问题