根据 Intel 64 和 IA-32 架构软件开发人员手册,LOCK 信号前缀“确保处理器在信号置位时独占使用任何共享内存”。这可以是总线或高速缓存锁的形式。
但是 - 这就是我问这个问题的原因 - 我不清楚这个前缀是否也提供任何内存障碍。
我正在多处理器环境中使用 NASM 进行开发,需要使用可选的获取和/或释放语义来实现原子操作。
那么,我是否需要使用 MFENCE、SFENCE 和 LFENCE 指令,还是多余的?
不,不需要使用说明MFENCE, SFENCE and LFENCE
与...有关系LOCK
prefix.
MFENCE, SFENCE and LFENCE
指令保证所有CPU内核中内存的可见性。就实例而言MOV
指令不能与LOCK
前缀,因此为了确保内存移动的结果对所有 CPU 核心都可见,我们必须确保 CPU 缓存已刷新到 RAM,并且我们可以通过栅栏指令到达。
EDIT:有关锁定原子操作的更多信息,请参阅英特尔手册:
锁定原子操作
32 位
IA-32 处理器支持锁定原子
对系统中位置的操作
记忆。这些操作通常是
用于管理共享数据结构
(如信号量、段
描述符、系统段或页
表)其中两个或多个
处理器可能会同时尝试
修改相同的字段或标志。这
处理器使用三个相互依赖的
执行锁定的机制
原子操作:
• 有保证的原子操作
• 总线锁定,使用LOCK#信号和LOCK指令前缀
• 缓存一致性协议,确保可以对缓存数据结构执行原子操作(缓存锁);此机制存在于 Pentium 4、Intel Xeon 和 P6 系列处理器中
这些机制是相互依存的
有以下几种方式。一定基础的
内存事务(例如读取
或在系统内存中写入一个字节)
始终保证得到处理
原子地。也就是说,一旦开始,
处理器保证
操作将在之前完成
另一个处理器或总线代理是
允许访问内存位置。
该处理器还支持总线
锁定以执行选定的内存
操作(例如
读-修改-写操作
共享内存区域)通常
需要原子处理,但是
不会自动以这种方式处理。
因为经常使用内存
位置通常缓存在
处理器的 L1 或 L2 缓存,原子
经常可以进行操作
在处理器的缓存内,无需
断言总线锁定。这里的
处理器的缓存一致性协议
确保其他处理器
缓存相同的内存位置是
原子性的同时管理得当
操作是在缓存上执行的
记忆位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)