LOCK前缀vs MESI协议?

时间:2015-04-26 16:05:20

标签: multithreading x86 locking cpu mesi

x86 LOCK前缀的目的是什么,如果MESI协议阻止其他内核写入"独立拥有的数据呢?

我对LOCK提供的内容和MESI提供的内容感到有些困惑?

我理解MESI协议是关于确保内核都看到一致的内存状态,但据我所知,它还会阻止内核写入另一个内核已经写入的内存?

2 个答案:

答案 0 :(得分:4)

MESI协议使内存缓存有效地不可见。这意味着多线程程序不必担心来自它们的核心读取陈旧数据,或者两个内核写入高速缓存行的不同部分并且一半写入而另一半写入另一个写入。

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

在现代CPU上,LOCK前缀锁定高速缓存行,以便读取 - 修改 - 写入操作在逻辑上是原子的。这些都是过于简单的,但希望他们能给你这个想法。

解锁增量:

  1. 获取缓存行,可分享很好。阅读价值。
  2. 在读取值中添加一个。
  3. 获取高速缓存行独占(如果不是E或M)并将其锁定。
  4. 将新值写入缓存行。
  5. 将缓存行更改为已修改并解锁。
  6. 锁定增量:

    1. 获取高速缓存行独占(如果不是E或M)并将其锁定。
    2. 读取值。
    3. 添加一个。
    4. 将新值写入缓存行。
    5. 将缓存行更改为已修改并解锁。
    6. 注意区别?在解锁的增量中,高速缓存行仅在写入存储器操作期间被锁定,就像所有写入一样。在锁定的增量中,高速缓存行保持在整个指令中,从读操作到写操作,包括在增量本身期间。

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

答案 1 :(得分:-1)

是的,你混淆了两件不同的事情。 MESI协议是一种缓存一致性协议,可确保每个核心/处理器从其他处理器获取最新数据。请求时缓存(或mem)。如果一个高速缓存行在E' E' state,告诉请求处理器一个(并且只有一个)其他处理器具有此行的副本。这就是它的全部; ' E'状态不会阻止请求处理器访问数据;它只是陈述了这样一个事实:只有一个处理器拥有数据副本(并且该副本也与内存中的副本一致)。 因此,如果核心请求E' E'状态,核心将获得它的副本。另一个副本是在' E'将根据核心是否要求复制“#”写入'或者'阅读'。如果要求书面形式,则旧副本将失效('我状态),如果用于阅读旧副本将被放入共享' S' ;州。