如何解决用于进程同步的信号灯
| 我从来没有足够了解信号量。每当我冒险去了解它们时,都会弹出一些我不理解的东西。 现在这是我的问题: 我在《操作系统概念》中读到:\“ *信号量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,
马丁
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。