Postgresql中的pg_memory_barrier_impl和C的volatile

相关:
《Postgresql中的pg_memory_barrier_impl和C的volatile》
《X86函数调用模型分析》

PG中的pg_memory_barrier_impl

arch-x86.h中对内存屏障的定义:

#define pg_memory_barrier_impl()		\
	__asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")
#endif

lock;addl是什么含义?

  • lock后的所有写操作,会造成总线同步,也就是cpu store buffer会flush出,通过修改过的地址,使其他CPU对应的cacheline失效。
  • 那么这个addl给rsp寄存器加0的操作(rsp堆栈指针指向函数堆栈,去内存中取变量需要用rsp去找)虽然不会改变rsp的值,但会触发store buffer的flush动作,进而同步所有核心的cacheline数据。
  • 最终的效果就是cacheline全部同步一遍,不会读到旧的值。

C的volatile

volatile修饰的值修改时,不会被编译器把变量装到寄存器中(这样说不准确,应该是读的时候一定会从内存重新拉一遍值到寄存器,不会直接读寄存器的值);如果不修饰,CPU可能会从寄存器中读取,也可能从内存中读取,两边并发读的结果可能会不一致。

(java的volatile可能自带asm(lock;addr)的功能,和C的有差异)

区别

volatile阻止编译器把变量塞到寄存器里面,如果到寄存器里面,读的时候直接拿寄存器的值完全不走stroe buffer和缓存了,再做memory_barrier同步cacheline的数据也没效果了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高铭杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值