1. ARM内存模型基础与多核同步挑战
在现代计算机体系结构中,内存一致性模型决定了处理器对内存访问的顺序保证。ARM架构采用弱内存一致性模型(Weakly Ordered Memory Model),这种设计为处理器提供了更高的性能潜力,但也带来了复杂的内存同步挑战。
1.1 弱内存顺序的本质特性
弱内存顺序模型的核心特征是允许处理器对内存操作进行重排序,只要这种重排序不会影响单线程程序的正确性。这种灵活性主要来自三个方面:
- 写缓冲(Write Buffering):处理器可以将写入操作暂存在缓冲区中,不必等待写入实际完成
2.乱序执行(Out-of-Order Execution):指令可以不按程序顺序执行,只要最终结果一致
3.缓存一致性协议(Cache Coherence Protocol):多核间的缓存同步可能导致内存访问顺序的变化
在单核环境下,这些优化对程序员完全透明。但在多核系统中,当核间通过共享内存通信时,这种重排序可能导致违反直觉的结果。例如:
assembly复制; 处理器P1
STR R5, [R1] ; 存储数据到地址R1
STR R0, [R2] ; 设置标志位到地址R2
; 处理器P2
WAIT([R2]==1) ; 等待标志位
LDR R5, [R1] ; 读取数据
在弱内存模型下,P2可能读到R1的旧值(0),尽管从程序顺序看P1是先写数据后写标志位。这是因为两个存储操作可能被乱序提交到内存系统。
1.2 ARM的内存屏障指令
ARMv7架构提供了两条关键的内存屏障指令:
-
DMB(Data Memory Barrier):
- 确保屏障前的所有内存访问先于屏障后的内存访问被观察到
- 不会阻止指令流水线继续执行,只约束内存访问顺序
- 可以指定作用域(如全系统、仅本核等)和访问类型(如仅存储操作)
-
DSB(Data Synchronization Barrier):
- 比DMB更强的同步保证
- 确保屏障前的所有内存访问、缓存维护和TLB操作都完成
- 会暂停流水线直到所有操作完成
典型使用模式:
assembly复制STR R0, [R1] ; 存储数据
DMB
