为什么它被称为读-修改-写而不是读写?
Why it's termed read-modify-write but not read-write?
在我看来,术语读取-修改-写入没有多大意义,因为修改只是另一种方式说写。引自 wikipedia(强调我的):
In computer science, read-modify-write is a class of atomic operations
[...] that both read a memory location and write a new value into
it simultaneously [...]
那么为什么不简单地读写呢?两者之间有什么微妙的语义差异吗?
Why it's termed read-modify-write but not read-write?
因为这正是 X86
.
等典型架构上的事件顺序
- 读取:值从内存位置(缓存)读取到CPU寄存器
- 修改:值在CPU寄存器
内部递增
- write:将更新的寄存器值写回内存(缓存)。
为了创建原子性感知,缓存行在read
和write
操作之间被锁定。
例如,递增 C++ 原子变量:
g.fetch_add(1);
被gcc
编译成:
0x00000000004006c0 <+0>: lock addl [=11=]x1,0x200978(%rip) # 0x601040 <g>
尽管是一条指令,addl
本身并不是原子的。
lock
前缀是必要的,以保证更新后的寄存器值在被其他内核访问之前被写回缓存行
(存储缓冲区已刷新,但绕过 RMW 操作)。
MESI
缓存一致性协议确保所有内核在缓存行上的锁被释放后观察更新的内存值。
这保证了所有线程都遵守 C++ 标准对 RMW 操作所需的修改顺序中的最新值。
在我看来,术语读取-修改-写入没有多大意义,因为修改只是另一种方式说写。引自 wikipedia(强调我的):
In computer science, read-modify-write is a class of atomic operations [...] that both read a memory location and write a new value into it simultaneously [...]
那么为什么不简单地读写呢?两者之间有什么微妙的语义差异吗?
Why it's termed read-modify-write but not read-write?
因为这正是 X86
.
- 读取:值从内存位置(缓存)读取到CPU寄存器
- 修改:值在CPU寄存器 内部递增
- write:将更新的寄存器值写回内存(缓存)。
为了创建原子性感知,缓存行在read
和write
操作之间被锁定。
例如,递增 C++ 原子变量:
g.fetch_add(1);
被gcc
编译成:
0x00000000004006c0 <+0>: lock addl [=11=]x1,0x200978(%rip) # 0x601040 <g>
尽管是一条指令,addl
本身并不是原子的。
lock
前缀是必要的,以保证更新后的寄存器值在被其他内核访问之前被写回缓存行
(存储缓冲区已刷新,但绕过 RMW 操作)。
MESI
缓存一致性协议确保所有内核在缓存行上的锁被释放后观察更新的内存值。
这保证了所有线程都遵守 C++ 标准对 RMW 操作所需的修改顺序中的最新值。