当代的信息文明是建立在沙子之上的文明。人们从沙子中提纯出高纯度硅,再把它加工成晶圆,无数复杂的电路设计被刻蚀到指甲盖大小的cpu上。cpu的架构是复杂的,但是我们不打算从复杂的硬件开始分析多核架构,而是通过一种合理的抽象去理解这个复杂的cpu世界。这个合理的抽象就是TSO模型[1]。TSO模型可以适用于所有最新的X86架构cpu。
TSO模型的抽象机架构如下图所示:

其中,Global Lock用于保证线程写入共享内存的互斥。每一个线程到共享内存之间都有一个Write Buffer。同时TSO抽象机提供了MFENCE指令,还有LOCK指令。TSO抽象机的行为如下:
- Global Lock某个时间只能被一个线程持有,被持有时,其他线程不能发起读取请求,也不能将Write Buffer中的数据写入共享内存。
- Write Buffer中数据是FIFO的,线程读取数据时,优先读取先前写入Write Buffer的数据,如果不存在,则读取共享内存中的数据。
- MFENCE的作用是将Write Buffer中缓冲的数据写入共享内存。
- LOCK指令的执行流程是,线程首先获取Global Lock,接着执行指令,然后将Write Buffer中缓冲的数据写入共享内存,最后释放Global Lock。
- 线程在没有MFENCE/LOCK指令驱使的情况下,将Write Buffer中的数据写入共享内存的时机不受控。
现在我们将TSO架构和x86架构中的组件对应起来:
| TSO世界 | X86世界 |
|---|---|
| 线程 | 虚拟核心 |
| MFENCE指令 | mfence和sfence |
| LOCK指令 | 原子指令-lock前缀指令,原子交换指令XCHG |
| Shared Memory | L1/L2/L3 Cache, MEMORY |
这样,后续x86指令的行为,都可以用TSO模型去思考和分析。这个分析工具很重要,后面一些基础组件(比如锁)实现的正确性都会基于TSO模型去分析。
