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

Mar*_*Txz 2 c c++ multithreading atomic shared-memory

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

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

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

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

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

And*_*kyy 5

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

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

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

因此,从非常普遍的角度来看,现代 CPU 上的原子操作基本上会读取并锁定高速缓存行以独占 CPU,直到原子操作完成并将更改直接传播到高速缓存,从而避免在 CPU 内进行缓冲。

  • @MarteinTxz,它取决于实际的 CPU 模型,但通常现代 CPU 都被虚拟标记为物理索引,因此缓存查找和 TLB 查找是同时并行发生的。 (3认同)
  • 那么您的意思是,存储在缓存中的地址是物理的 - 真实的地址,并且 TLB 提供了一种从进程使用的虚拟地址到物理地址的方法? (2认同)