首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定前缀与MESI协议?

锁定前缀与MESI协议?
EN

Stack Overflow用户
提问于 2015-04-26 16:05:19
回答 2查看 1.4K关注 0票数 12

x86锁前缀的目的是什么,如果MESI协议阻止其他内核写入“独占”-ly拥有的数据?

我有点搞不懂什么锁提供和什么MESI提供?

我理解MESI协议是关于确保核心都能看到一致的内存状态,但正如我所理解的,它也阻止内核写入另一个核心已经写入的内存?

EN

回答 2

Stack Overflow用户

发布于 2016-01-08 21:22:10

MESI协议使内存缓存有效地不可见。这意味着多线程程序不必担心从它们读取陈旧数据的核心,也不必担心将两个内核写入缓存行的不同部分,并将一半的写入和另一半的写入发送到主内存。

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

在现代CPU上,锁前缀锁定缓存行,因此读-修改-写操作在逻辑上是原子的。这些都是过于简化,但希望他们能给你的想法。

解锁增量:

  1. 获取缓存线,可共享就可以了。读价值。
  2. 在读取值中添加一个。
  3. 获取缓存行独占(如果不是E或M)并锁定它。
  4. 将新值写入缓存行。
  5. 将缓存行更改为修改并解锁它。

锁定增量:

  1. 获取缓存行独占(如果不是E或M)并锁定它。
  2. 读取值。
  3. 再加一个。
  4. 将新值写入缓存行。
  5. 将缓存行更改为修改并解锁它。

注意到区别了吗?在解锁增量中,缓存行仅在写内存操作期间被锁定,就像所有写操作一样。在锁定增量中,高速缓存线贯穿整个指令,从读操作一直到写操作,包括在增量本身期间。

另外,一些CPU除了内存缓存之外还有可能影响内存可见性的东西。例如,一些CPU具有读取预取器或已发布的写缓冲区,这些缓冲区可能导致内存操作无序执行。在需要时,锁前缀(或其他CPU上的等效功能)也将执行任何需要处理内存操作排序问题的操作。

票数 11
EN

Stack Overflow用户

发布于 2016-01-08 20:51:11

是啊,你把两件事搞混了。MESI协议是一种缓存一致性协议,它确保每个核心/处理器在请求时从其他处理器的缓存(或mem)中获得最最新的数据。如果记录线处于“E”状态,则通知请求处理器,另一个(且只有一个)另一个处理器有此行的副本。这就是它所做的一切; 'E‘状态无论如何不会阻止请求处理器访问数据;它只是声明只有一个处理器拥有数据的副本(并且该副本与内存中的数据副本也是一致的)。因此,如果一个核心请求处于'E‘状态的数据,核心将得到它的副本。在“E”中的另一个副本将根据核心是要求“写作”还是“阅读”而更改。如果它被要求写入,旧副本将失效('I‘状态),如果它是用于读取旧副本将被放入共享'S’状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29880015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档