首页 文章

在内核中实现信号量..?

提问于
浏览
2

我正在阅读“操作系统概念”以了解信号量 . 摘录自本书:

“信号量的关键方面是它们是以原子方式执行的 - 我们必须保证没有两个进程可以同时对同一个信号量执行waitO和signal()操作 . 这是一个关键部分问题;并且在单个信号中处理器环境(也就是说,只存在一个CPU),我们可以通过在wait()和signal()操作执行期间简单地禁止中断来解决它 . 这种方案适用于单处理器环境,因为一旦中断,禁止,来自不同进程的指令不能交错 . 只有当前正在运行的进程才会执行,直到重新启用中断并且调度程序可以重新获得控制权 .

在多处理器环境中,必须在每个处理器上禁用中断;否则,来自不同进程(在不同处理器上运行)的指令可能以某种任意方式交错 . 禁用每个处理器上的中断可能是一项艰巨的任务,而且可能会严重降低性能 . 因此,SMP系统必须提供其他锁定技术 - 例如 spinlocks - 以确保waitO和signal0以原子方式执行 .

我的问题是:

这是如何实现的?_2389994?使用像 TestAndSet() 这样的硬件指令?因为,在某些时候需要来自硬件的一些支持(用户获取该支持或内核获得该支持),因为我们想要一条指令在一条指令中进行测试和设置(在两条指令之间不能中断) .

虽然在书中,我找不到任何这样的陈述,在某些时候,需要一些硬件支持 . 它将信号量解释为实现同步的软件技术 . 这会产生误导吗?

2 回答

  • 0

    理论上,对于共享内存,您不需要原子操作来实现互斥 . 参见例如Dekker's algorithm . 然而,尽管这有效,但性能几乎不会受到影响 . 这就是大多数处理器架构支持原子指令(例如测试和设置/比较和交换)的原因 . 另一个原因可能是缓存会使事情变得更加复杂 - 多个处理器可以拥有不同的内存视图 . 总而言之,原子指令会导致更少的问题 .

  • 2

    如果没有某种硬件支持,你就无法实现SMP自旋锁,在这种情况下是原子测试和设置和原子增量操作 . 有关如何在不同体系结构上完成的讨论,请参见here .

    有关它的Linux / x86实现,请参见arch / x86 / include / asm / spinlock.h .

相关问题