我正在阅读“操作系统概念”以了解信号量。 摘录自本书:
“信号量的关键方面是它们以原子方式执行 - 我们 必须保证没有两个进程可以执行waitO和signal() 同时对同一个信号量进行操作。这是一个关键部分 问题;并且在单处理器环境中(即只有一个CPU的地方) 我们可以通过简单地抑制中断期间的中断来解决它 wait()和signal()操作正在执行。这个计划单一工作 - 处理器环境因为,一旦中断被禁止,指令 来自不同的进程不能交错。只有当前正在运行 进程执行,直到重新启用中断并且调度程序可以重新获得 控制。
在多处理器环境中,必须禁用每个中断 处理器;否则,来自不同进程的指令(以不同的方式运行) ent处理器)可以以某种任意方式交织。禁用中断 在每个处理器上都可能是一项艰巨的任务,而且可能会严重减少 是的表现。因此,SMP系统必须提供替代锁定 技术 - 例如自旋锁 - 以确保waitO和signal0为 原子地执行。“
我的问题是:
这个 spinlock 是如何实现的?使用TestAndSet()
等硬件说明?因为,在某些时候需要来自硬件的一些支持(用户获取该支持或内核获得该支持),因为我们需要一条指令在一条指令中进行测试和设置(不能在两者之间中断)。
虽然在书中,我找不到任何这样的陈述,在某些时候,需要一些硬件支持。它将信号量解释为实现同步的软件技术。这会产生误导吗?
答案 0 :(得分:2)
如果没有某种硬件支持,你就无法实现SMP自旋锁,在这种情况下是原子测试和设置和原子增量操作。有关如何在不同体系结构上完成的讨论,请参阅here。
请参阅arch / x86 / include / asm / spinlock.h以了解它的Linux / x86实现。
答案 1 :(得分:0)
理论上,对于共享内存,您不需要原子操作来实现互斥。参见例如Dekker's algorithm。 然而,尽管这有效,但性能几乎不会受到影响。这就是大多数处理器架构支持原子指令(例如测试和设置/比较和交换)的原因。另一个原因可能是缓存会使事情变得更加复杂 - 多个处理器可以拥有不同的内存视图。完全原子指令会导致更少的问题。