如果MESI协议(protocol)仍然阻止其他内核写入“专有”拥有的数据,则x86 LOCK前缀的目的是什么?

我对LOCK提供的功能与MESI提供的功能之间有些困惑。

我了解MESI协议(protocol)是关于确保所有内核都看到一致的内存状态,但是据我了解,它还防止内核将内存写入另一个内核已经在写入的内存?

最佳答案

MESI协议(protocol)使内存缓存有效地不可见。这意味着多线程程序不必担心一个内​​核从它们中读取过时的数据,也不必担心两个内核向高速缓存行的不同部分进行写操作,而将一次写操作的一半和另一半写操作的一半发送到主存储器。

但是,这对读-修改-写操作(例如增量,比较和交换等)没有帮助。 MESI协议(protocol)不会停止两个内核,每个内核读取相同的内存块,每个内核加一个,然后每个内核写回相同的值,将两个增量变成一个。

在现代CPU上,LOCK前缀锁定高速缓存行,因此读-修改-写操作在逻辑上是原子的。这些过分简化,但希望它们能给您带来启发。

解锁增量:

  • 获取缓存行,可以共享。读取值。
  • 将一加到读取的值。
  • 获取独占的高速缓存行(如果尚未为E或M)并将其锁定。
  • 将新值写入高速缓存行。
  • 将缓存行更改为已修改并解锁。

  • 锁定增量:
  • 获取独占的高速缓存行(如果尚未为E或M)并将其锁定。
  • 读取值。
  • 添加一个。
  • 将新值写入高速缓存行。
  • 将缓存行更改为已修改并解锁。

  • 注意区别吗?以解锁的增量,就像所有写操作一样,高速缓存行仅在写存储器操作期间被锁定。在锁定的增量中,高速缓存行将保留在整个指令中,从读取操作到写入操作,一直到增量本身为止。

    另外,某些CPU的内存缓存以外的其他东西也会影响内存可见性。例如,某些CPU具有读取预取程序或发布的写入缓冲区,这可能导致内存操作无法按顺序执行。在需要时,LOCK前缀(或其他CPU上的等效功能)也将执行处理内存操作排序问题所需的任何操作。

    关于multithreading - LOCK前缀与MESI协议(protocol)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29880015/

    10-11 15:30