根据Intel 64和IA-32体系结构软件开发人员手册,锁定信号前缀“确保处理器在断言信号时独占使用任何共享内存”。它可以是总线或高速缓存锁的形式。
但是-这就是我问这个问题的原因-我不清楚这个前缀是否也提供了任何内存障碍。
我在多处理器环境中使用NASM进行开发,需要使用可选的获取和/或释放语义实现原子操作。
那么,我是否需要使用MFENCE、SFENCE和LFENCE指令,或者这是否是多余的?
发布于 2011-01-27 18:08:36
不需要,不需要使用与LOCK前缀相关的指令MFENCE, SFENCE and LFENCE。
MFENCE, SFENCE and LFENCE指令保证了所有CPU核心中内存的可见性。在实例中,MOV指令不能与LOCK前缀一起使用,因此,为了确保内存移动的结果对所有的CPU核心都可见,我们必须确保CPU cache被刷新到内存中,并且我们使用隔离指令到达。
EDIT:有关锁定原子操作的更多信息,请参阅英特尔手册:
锁定的原子操作
32位IA-32处理器支持对系统内存中的位置执行锁定的原子操作。这些操作通常用于管理共享数据结构(例如信号量、段描述符、系统段或页表),其中两个或更多处理器可以同时尝试修改相同的字段或标志。处理器使用三种相互依赖的机制来执行锁定的原子操作:
·有保证的原子操作
·总线锁定,使用LOCK#信号和LOCK指令前缀
·高速缓存一致性协议,确保可以在高速缓存数据结构(高速缓存锁定)上执行原子操作;此机制存在于奔腾4、英特尔至强和P6系列处理器中
这些机制在以下方面是相互依赖的。某些基本内存事务(例如在系统内存中读取或写入一个字节)总是保证以原子方式处理。也就是说,一旦启动,处理器保证操作将在另一个处理器或总线代理被允许访问存储器位置之前完成。处理器还支持总线锁定,用于执行所选的存储器操作(例如,在存储器的共享区域中的读-修改-写操作),这些操作通常需要原子地处理,但不会以这种方式自动处理。因为经常使用的内存位置通常缓存在处理器的L1或L2缓存中,所以原子操作通常可以在处理器的缓存中执行,而无需断言总线锁。在这里,处理器的高速缓存一致性协议确保高速缓存相同内存位置的其他处理器得到正确管理,同时对高速缓存的内存位置执行原子操作。
发布于 2013-05-31 12:25:01
手册中的号IA32 (第3A卷,第8.2章:内存排序):
不能使用I/O指令、锁定指令或序列化指令对
读取或写入进行重新排序。
因此,对于锁定指令,不需要围栏指令。
发布于 2018-06-02 23:33:12
在没有参数'-D_ with _CLFLUSH_‘或'-D_WITH_ HLE _’的情况下(因此既没有使用CLFLUSH*也没有使用HLE),intel_lock1.c (在上面的网址中提供)在使用linux 5或7的linux上编译时仍然会出现问题- mutex_lock汇编程序现在看起来像这样:
# 74 "intel_lock1.c" 1
LFENCE
lock subl $1, lck(%rip)
rep nop
SFENCE因此,我正在尝试用MFENCE替换{L,S}栅栏。
我仍然不太理解两个线程如何以相同的-1 *lck值结束。
https://stackoverflow.com/questions/4813297
复制相似问题