用于进程同步的信号量

时间:2011-06-13 09:32:09

标签: synchronization operating-system kernel semaphore interrupt

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

这是我现在的问题:

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

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

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

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

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

请解释,

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

基本上,是的。

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

RGDS, 马丁

相关问题