如果MESI协议(protocol)仍然阻止其他内核写入“专有”拥有的数据,则x86 LOCK前缀的目的是什么?
我对LOCK提供的功能与MESI提供的功能之间有些困惑。
我了解MESI协议(protocol)是关于确保所有内核都看到一致的内存状态,但是据我了解,它还防止内核将内存写入另一个内核已经在写入的内存?
最佳答案
MESI协议(protocol)使内存缓存有效地不可见。这意味着多线程程序不必担心一个内核从它们中读取过时的数据,也不必担心两个内核向高速缓存行的不同部分进行写操作,而将一次写操作的一半和另一半写操作的一半发送到主存储器。
但是,这对读-修改-写操作(例如增量,比较和交换等)没有帮助。 MESI协议(protocol)不会停止两个内核,每个内核读取相同的内存块,每个内核加一个,然后每个内核写回相同的值,将两个增量变成一个。
在现代CPU上,LOCK前缀锁定高速缓存行,因此读-修改-写操作在逻辑上是原子的。这些过分简化,但希望它们能给您带来启发。
解锁增量:
锁定增量:
注意区别吗?以解锁的增量,就像所有写操作一样,高速缓存行仅在写存储器操作期间被锁定。在锁定的增量中,高速缓存行将保留在整个指令中,从读取操作到写入操作,一直到增量本身为止。
另外,某些CPU的内存缓存以外的其他东西也会影响内存可见性。例如,某些CPU具有读取预取程序或发布的写入缓冲区,这可能导致内存操作无法按顺序执行。在需要时,LOCK前缀(或其他CPU上的等效功能)也将执行处理内存操作排序问题所需的任何操作。
关于multithreading - LOCK前缀与MESI协议(protocol)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29880015/