x86 LOCK前缀的目的是什么,如果MESI协议阻止其他内核写入"独立拥有的数据呢?
我对LOCK提供的内容和MESI提供的内容感到有些困惑?
我理解MESI协议是关于确保内核都看到一致的内存状态,但据我所知,它还会阻止内核写入另一个内核已经写入的内存?
答案 0 :(得分:4)
MESI协议使内存缓存有效地不可见。这意味着多线程程序不必担心来自它们的核心读取陈旧数据,或者两个内核写入高速缓存行的不同部分并且一半写入而另一半写入另一个写入。
但是,这对读取 - 修改 - 写入操作(如增量,比较和交换等)没有帮助。 MESI协议不会停止每个读取同一块内存的两个内核,每个内核都添加一个内核,然后每个内核写回相同的值,将两个增量转换为一个。
在现代CPU上,LOCK前缀锁定高速缓存行,以便读取 - 修改 - 写入操作在逻辑上是原子的。这些都是过于简单的,但希望他们能给你这个想法。
解锁增量:
锁定增量:
注意区别?在解锁的增量中,高速缓存行仅在写入存储器操作期间被锁定,就像所有写入一样。在锁定的增量中,高速缓存行保持在整个指令中,从读操作到写操作,包括在增量本身期间。
此外,某些CPU还有内存缓存以外的内容可能会影响内存可见性。例如,某些CPU具有读取预取器或发布的写入缓冲区,这可能导致内存操作无序执行。如果需要,LOCK前缀(或其他CPU上的等效功能)也将执行处理内存操作排序问题所需的任何操作。
答案 1 :(得分:-1)