关于x86内存屏障的疑问:sfence、lfence、mfence功能及重排序问题
x86内存屏障常见疑问解答
sfence、lfence、mfence的功能说明
- sfence:不会阻止刷新store buffer,反而会强制把之前所有store操作刷入缓存,同时保证后续的store不会提前执行。x86普通内存本身就保证store-store操作有序,所以sfence大多用在写WC(Write-Combine)内存的场景里。
- lfence:不会阻止处理invalidate queue。它主要是用来序列化load-load操作,确保前面的load都完成后,后面的load才能启动。另外,lfence还能挡住后面所有指令(包括store)提前越过它执行,这也是Java里用它实现load-store屏障的原因。
- mfence:属于全内存屏障,既要强制刷新store buffer里的所有store到缓存,也要等前面所有load操作完成,还会处理invalidate queue里的无效请求,保证所有内存操作的全局可见性。它能对所有类型的内存操作(load-store、store-load、load-load、store-store)做序列化。
lfence能否防止load-store重排序?
x86的TSO内存模型默认允许load提前于之前的store执行(也就是load-store重排,只要操作的是不同地址)。但插入lfence可以阻止这种情况:在load和store之间加lfence后,必须等lfence之前的load完全完成,后面的store才能执行,从而禁止了load-store重排序。这就是Java内存模型里用lfence实现load-store屏障的底层逻辑。
内容的提问来源于stack exchange,提问作者qwee
相关产品推荐
相关产品推荐

