我从来没有完全理解信号量 . 每一次,我冒昧地理解它们,弹出一些东西,我不明白 .
这是我现在的问题:
我在"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 回答
wait 的示例代码只是说明性的,它不太可能以这种方式实现 . 如果计数器不大于零,大多数操作系统将暂停试图获取信号量的踏板 .
但是,从技术上讲,这个例子可以起作用 . 如果S被标记为volatile,那么wait()将看到任何其他进程或线程的更改 . wait()会在一个紧密的循环中旋转,直到条件满足并且会咀嚼CPU,但它会起作用 . 注意,这个CPU咀嚼是OS为什么会挂起调用线程的条件是不能满足的 . 您需要以原子方式进行测试和递减,这通常通过使用OS原子函数来完成,例如Windows上的InterlockedCompareExchange .
这是否意味着此操作将一次执行?
基本上,是的 .
这个例子不是一个实际的实现,(我希望!),只是一个C风格的功能表示 . 实际的实现是特定于OS / CPU的,因为需要内核/硬件支持来消除繁忙等待并确保在多核处理器上正确操作 .
Rgds,马丁