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

    TSO模型的抽象机架构如下图所示:

    企业微信截图_5b5c91fe-92a1-4db9-b70f-18bd4a3a5a94.png
    其中,Global Lock用于保证线程写入共享内存的互斥。每一个线程到共享内存之间都有一个Write Buffer。同时TSO抽象机提供了MFENCE指令,还有LOCK指令。TSO抽象机的行为如下:

    1. Global Lock某个时间只能被一个线程持有,被持有时,其他线程不能发起读取请求,也不能将Write Buffer中的数据写入共享内存。
    2. Write Buffer中数据是FIFO的,线程读取数据时,优先读取先前写入Write Buffer的数据,如果不存在,则读取共享内存中的数据。
    3. MFENCE的作用是将Write Buffer中缓冲的数据写入共享内存。
    4. LOCK指令的执行流程是,线程首先获取Global Lock,接着执行指令,然后将Write Buffer中缓冲的数据写入共享内存,最后释放Global Lock。
    5. 线程在没有MFENCE/LOCK指令驱使的情况下,将Write Buffer中的数据写入共享内存的时机不受控。

    现在我们将TSO架构和x86架构中的组件对应起来:

    TSO世界 X86世界
    线程 虚拟核心
    MFENCE指令 mfence和sfence
    LOCK指令 原子指令-lock前缀指令,原子交换指令XCHG
    Shared Memory L1/L2/L3 Cache, MEMORY

    这样,后续x86指令的行为,都可以用TSO模型去思考和分析。这个分析工具很重要,后面一些基础组件(比如锁)实现的正确性都会基于TSO模型去分析。

    [1] https://www.cl.cam.ac.uk/~pes20/weakmemory/cacm.pdf