linux内存管理 (二) 4.1 硬件 SMP-Consistency之内存操作的原子化

  • 原子化操作是什么
原子化这个问题要看每个体系结构的定义。每种体系结构都会说明自己哪些内存操作是原子的。更复杂的问题是进行通讯的时候需要做“读-判断-写”这样一个组合原子操作。早期CPU比较简单,比如早期的x86会用LOCK这样的信号来保证一段处理完全独占总线,让内存被原子化地更新。用一个非事实但说明问题的比喻,在上面这个处理过程,如果我在修改的时候把总线锁住,把data的每个域都更新了,然后其他CPU才能进来,这肯定是Consistent的,但这样效率就低了,这段时间其他CPU全都闲着(stall),等你让出总线。考虑到一个内存操作可能几十ns,而一条指令不用一个ns,这个等待没法忍。所以这种方法现在基本上就不用了,现在大部分时候使用LL/SC或者CAS等方案来保证多个动作的原子性。但我们这里不是讨论原子性问题,这个问题我们点到为止,我们就认为我们的CPU有一组针对内存的原子操作,以这个为基础讨论问题。

  • ARMv6的原子化操作指令
	B2.2.3 SMP的Consistency之内存操作的原子化:内存同步原语
		同步原语,以确保在内存顺序模型中正确操作系统信号量。
		内存同步原语指令定义为用于确保内存同步的指令:
		
		在ARMv6之前
			支持由SWP和SWPB指令组成。// 在ARMv6中不推荐使用)。
		ARMv6引入了新的LDREX和STREX(Load and Store Exclusive)指令。
			•LDREX、STREX
		
			LDREX和STREX支持共享和非共享内存。
				当要同步的进程在同一个处理器上运行时,可以使用非共享内存。
				当要同步的进程在不同的处理器上运行时,必须使用共享内存。

  • 如何正确使用ARMv6的原子化操作指令
	B2.7.4同步原语和内存顺序模型
	==============================
		对同步原语建模,SWP/SWPB和LDREX/STREX遵循这些指令访问的内存类型的内存顺序模型。
		因此:
			•用于声明spinlock的可移植代码在声明spinlock和进行使用spinlock的访问之间应该包含DMB指令。
			•用于释放spinlock的可移植代码在写入清除spinlock之前应包含DMB指令。

你可能感兴趣的:(Linux内存管理)