Synchronization 信号量在内核中的实现。。?

Synchronization 信号量在内核中的实现。。?,synchronization,operating-system,kernel,semaphore,interrupt,Synchronization,Operating System,Kernel,Semaphore,Interrupt,我正在阅读“操作系统概念”来理解信号量。 这本书的摘录: “信号量的关键方面是它们可以原子化执行——我们 必须保证没有两个进程可以执行waitO和signal() 同时对同一信号量执行操作。这是一个关键部分 问题;并且在单处理器环境中(即,只有一个CPU 存在),我们可以通过简单地在 正在执行wait()和signal()操作- 处理器环境,因为一旦中断被禁止,指令 来自不同进程的数据不能交错。只有当前正在运行的 进程一直执行,直到中断被重新启用,并且调度程序可以恢复 控制 在多处理器环境中,必

我正在阅读“操作系统概念”来理解信号量。 这本书的摘录:

“信号量的关键方面是它们可以原子化执行——我们 必须保证没有两个进程可以执行waitO和signal() 同时对同一信号量执行操作。这是一个关键部分 问题;并且在单处理器环境中(即,只有一个CPU 存在),我们可以通过简单地在 正在执行wait()和signal()操作- 处理器环境,因为一旦中断被禁止,指令 来自不同进程的数据不能交错。只有当前正在运行的 进程一直执行,直到中断被重新启用,并且调度程序可以恢复 控制

在多处理器环境中,必须在每个处理器上禁用中断 处理器;否则,来自不同进程的指令(在不同的处理器上运行)- (ent处理器)可以以某种任意方式交错。禁用中断 在每个处理器上都可能是一项困难的任务,而且可能会严重降低- ish性能。因此,SMP系统必须提供替代锁定 旋转锁等技术-确保waitO和signal0 以原子方式执行。”

我的问题是:

这个自旋锁是如何实现的?使用诸如
TestAndSet()
之类的硬件指令?因为,在某一点上,需要硬件的支持(要么用户接受支持,要么内核接受支持),因为我们需要一条在一条指令中进行测试和设置的指令(这条指令之间不能中断)


尽管在这本书中,我找不到任何这样的说法,即在某一点上,需要一些硬件支持。它将信号量解释为实现同步的软件技术。这是否有误导性?

如果没有某种硬件支持,就无法实现SMP自旋锁,在本例中,是原子测试和设置以及原子增量操作。有关如何在不同体系结构上实现此功能的讨论,请参阅


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

从理论上讲,使用共享内存,实现互斥不需要原子操作。见例。
然而,尽管这样做有效,但性能几乎不会受到影响。这就是为什么大多数处理器架构支持原子指令(如测试、设置/比较和交换)。另一个原因可能是缓存会让事情变得更加复杂——多个处理器可以有不同的内存视图。总的来说,原子指令造成的问题更少。

现代CPU可能会对指令进行重新排序,包括内存访问,Dekker的算法比信号量或自旋锁(只有两个进程;信号量也可以用于在关键部分最多允许N个进程,对于N>1)。关于指令重新排序,您是对的,然而,尽管Dekker算法通常用于两个过程,但也可以用于N个过程。说到指令重新排序,我相信通过在正确的位置放置内存屏障,Dekker算法也可以用于新的CPU。然而,选择这些点肯定很复杂,信号量的性能可能非常糟糕。