Intel 64和IA-32 | 原子操作包括获取/释放语义

0xb*_*00d 6 x86 assembly locking intel memory-fences

根据英特尔64和IA-32架构软件开发人员手册,LOCK信号前缀"确保处理器在声明信号时独占使用任何共享内存".这可以是总线或缓存锁的形式.

但是 - 这就是我问这个问题的原因 - 我不清楚,如果这个前缀也提供了任何内存屏障.

我正在多处理器环境中使用NASM进行开发,并且需要使用可选的获取和/或发布语义来实现原子操作.

那么,我是否需要使用MFENCE,SFENCE和LFENCE指令或者这是多余的?

GJ.*_*GJ. 7

不,不需要使用MFENCE, SFENCE and LFENCELOCK前缀相关的指令.

MFENCE, SFENCE and LFENCE指令保证所有CPU内核的内存可见性.例如,MOV指令不能与LOCK前缀一起使用,因此为了确保所有CPU内核都可以看到内存移动的结果,我们必须确保将CPU缓存刷新到RAM并且我们可以使用fence指令.

编辑:更多关于从英特尔手册锁定原子操作:

锁定的原子操作

32位IA-32处理器支持对系统内存中的位置进行锁定原子操作.这些操作通常用于管理共享数据结构(例如信号量,段描述符,系统段或页表),其中两个或多个处理器可以同时尝试修改相同的字段或标志.处理器使用三个相互依赖的机制来执行锁定的原子操作:

•保证原子操作

•总线锁定,使用LOCK#信号和LOCK指令前缀

•高速缓存一致性协议,确保可以在缓存的数据结构上执行原子操作(缓存锁定); 这种机制存在于Pentium 4,Intel Xeon和P6系列处理器中

这些机制在以下方面是相互依赖的.某些基本的内存事务(例如在系统内存中读取或写入一个字节)始终保证以原子方式处理.也就是说,一旦启动,处理器保证在允许另一个处理器或总线代理访问存储器位置之前完成操作.处理器还支持总线锁定,用于执行选定的存储器操作(例如,在存储器的共享区域中的读取 - 修改 - 写入操作),这些操作通常需要以原子方式处理,但不会以这种方式自动处理.由于经常使用的内存位置通常缓存在处理器的L1或L2高速缓存中,因此通常可以在处理器的高速缓存内执行原子操作,而无需断言总线锁定.这里处理器的高速缓存一致性协议确保正在缓存相同内存位置的其他处理器被正确管理,同时在高速缓存的内存位置上执行原子操作.


eth*_*ice 5

不。来自 IA32 手册(第 3A 卷,第 8.2 章:内存排序):

读取或写入不能使用 I/O 指令、锁定指令或序列化指令重新排序。

因此,锁定指令不需要围栏指令。