用于进程同步的信号灯

| 我从来没有足够了解信号量。每当我冒险去了解它们时,都会弹出一些我不理解的东西。 现在这是我的问题: 我在《操作系统概念》中读到:\“ *信号量S是一个整数变量,除了初始化外,它只能通过两个标准原子操作(wait()和signal())进行访问。\” * 原子在这里是什么意思?这是否意味着该操作将一次性执行? 但随后,本书继续给出了一个wait()的示例实现:
wait(S) {
while S <= 0
; // no-op
S--;
}
有一个while循环(取决于其他进程),如何才能一次性运行(即没有任何其他进程执行信号通知,这将打破while循环) 请解释,     
已邀请:
        等待的示例代码仅是说明性的,不太可能以这种方式实现。如果计数器不大于零,则大多数操作系统将暂停胎面以尝试获取信号量。 但是,从技术上讲,该示例可以起作用。如果将S标记为volatile,则wait()将看到任何其他进程或线程的更改。 wait()会在一个紧紧的循环中旋转,直到满足条件为止,并且会占用CPU的内存,但是它将起作用。请注意,这种CPU咀嚼是操作系统无法满足条件的原因而挂起调用线程的原因。您需要原子地进行测试和递减,这通常是通过使用OS原子函数来完成的,例如Windows上的InterlockedCompareExchange。     
        这是否意味着该操作将一次性执行? 本质上是。 该示例不是实际的实现(希望如此),只是该功能的C样式表示。实际的实现是特定于OS / CPU的,因为需要内核/硬件支持才能消除繁忙等待并确保在多核处理器上正确运行。 Rgds, 马丁     

要回复问题请先登录注册