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

时间:2017-05-15 23:03:51

标签: c++ c multithreading shared-memory atomic

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

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

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

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

那么什么系统实际上将翻译表现为实际物理地址,并且从非常普遍的POV中,CPU如何在这种情况下提供原子性保证?

1 个答案:

答案 0 :(得分:4)

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

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

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

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