使用单核处理器,所有线程都从一个CPU运行,在内存中的某些互斥(或信号量等)上使用原子测试和设置操作实现关键部分的想法似乎很简单; 因为你的处理器正在从程序中的一个位置执行测试和设置,所以它一定不能从程序中的另一个位置伪装成其他线程.
但是当你真的拥有多个物理处理器时会发生什么?似乎简单的指令级原子性是不够的,b/c有两个处理器可能同时执行它们的测试和设置操作,你真正需要保持原子性是访问共享内存位置的互斥.(如果共享内存位置被加载到缓存中,那么整个缓存一致性也要处理...)
这似乎比单核案例带来更多的开销,所以问题的关键在于:它有多糟糕?更糟糕吗?我们只是忍受它吗?或者通过强制执行一个策略来回避它,即进程组中的所有线程都必须位于同一个物理核心上?
多核/ SMP系统不只是几个CPU粘在一起.对并行做事有明确的支持.所有同步原语都是在原子CAS的硬件帮助下实现的.该指令锁定CPU和内存控制器(以及执行DMA的设备)共享的总线并更新内存,或者仅更新依赖缓存侦听的内存.这反过来导致缓存一致性算法强制所有相关方刷新其缓存.
免责声明 - 这是非常基本的描述,这里有更多有趣的东西,如虚拟和物理缓存,缓存回写策略,内存模型,围栏等等.
如果您想了解更多有关操作系统如何使用这些硬件设施的信息- 这是一本关于这个主题的优秀书籍.
多核cpu的供应商必须注意不同的核在执行保证原子内存访问的指令时协调自己.
例如,在intel芯片上你有'cmpxchg'指令.它将存储在存储器位置的值与预期值进行比较,如果两者匹配则将其交换为新值.如果在它之前加上'lock'指令,则保证它对所有内核都是原子的.