基于共享内存的原子变量如何在进程间上下文中工作?

How do atomic variables based on shared memory work in inter-process contexts?

假设一个进程创建了一块大小为 2 个整数 (64-bit/8bytes) 的共享内存。

共享内存不仅可供进程的线程使用,还可供系统上有权访问该共享内存的其他进程使用。

大概共享内存将在第一个进程中通过虚拟地址寻址space,因此当对 1 整数执行原子操作(cmp 交换)时,虚拟地址在上下文​​中使用第一个处理的。

如果另一个进程同时对第一个整数执行某种原子操作,它也会使用自己的虚拟地址 space。

那么什么系统实际执行到实际物理地址的转换,并且从非常一般的 POV 来看,CPU 在这种情况下如何提供原子性保证?

  1. 现代 CPU 缓存在物理地址上运行(通常缓存被虚拟标记为物理索引)。基本上这意味着两个不同进程中的两个虚拟地址转换为相同的物理地址将只缓存一次 CPU.

  2. 现代 CPU 缓存是一致的:缓存在系统中的所有 CPU 之间同步,因此所有 CPU 的数据都相同缓存。在 Intel CPUs 上通常使用 MESI protocol

  3. 现代 CPUs 有写入缓冲区,因此内存存储需要一些时间才能到达缓存。

因此,从非常一般的角度来看,现代 CPU 上的原子操作基本上读取并锁定缓存行以独占使用 CPU 直到原子操作完成并且将更改直接传播到缓存,避免在 CPU.

中进行缓冲