gpt4 book ai didi

multithreading - LOCK 前缀与 MESI 协议(protocol)?

转载 作者:行者123 更新时间:2023-12-04 08:43:16 26 4
gpt4 key购买 nike

如果 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com