assembly LOCK前缀与MESI协议?

xmjla07d  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(159)

如果MESI协议阻止其他内核写入“独占”所有的数据,那么x86 LOCK前缀的用途是什么?
我有点搞不清楚LOCK提供了什么和MESI提供了什么?
据我所知,MESI协议旨在确保所有内核都能看到一致的内存状态,但据我所知,它还可以防止内核写入其他内核已经写入的内存。

fkaflof6

fkaflof61#

MESI协议使内存缓存变得不可见,这意味着多线程程序不必担心一个内核从缓存中阅读陈旧数据,也不必担心两个内核向缓存线的不同部分写入数据时,一个内核的一半写入数据,另一个内核的一半写入主内存。
然而,这对读-修改-写操作(如增量、比较和交换等)没有帮助。MESI协议不会阻止两个内核分别阅读相同的内存块,每个内核向其中添加一个,然后每个内核写回相同的值,将两个增量变为一个。
在现代的CPU上,LOCK前缀锁定该高速缓存行,这样读-修改-写操作在逻辑上是原子的。这些都过于简单了,但希望它们能给你带来一些启发。
未锁定增量:
1.获取高速缓存行,可共享即可。读取值。
1.将读取值加1。
1.以独占方式获取缓存线(如果尚未获取E或M)并锁定它。
1.将新值写入该高速缓存线。
1.该高速缓存行更改为已修改并解除锁定。
锁定增量:
1.以独占方式获取缓存线(如果尚未获取E或M)并锁定它。
1.读取值。
1.再加一个。
1.将新值写入该高速缓存线。
1.该高速缓存行更改为已修改并解除锁定。
注意到区别了吗?在未锁定增量中,该高速缓存线只在写内存操作期间锁定,就像所有写操作一样。在锁定增量中,缓存线在整个指令中保持不变,从读操作到写操作,包括增量本身。
此外,有些CPU除了内存缓存之外,还有其他东西会影响内存可见性。例如,有些CPU有读预取器或后写缓冲区,这会导致内存操作无序执行。如果需要,LOCK前缀(或其他CPU上的等效功能)也会执行处理内存操作顺序问题所需的任何操作。

6uxekuva

6uxekuva2#

是的,你混淆了两件不同的事情。MESI协议是一个缓存一致性协议,它确保每个内核/处理器在被请求时从其他处理器的缓存(或内存)中获得最新的数据。如果一个缓存行处于“E”状态,它告诉请求的处理器有一个(且只有一个)其他处理器有这一行的副本。这就是它所做的一切;“E”状态不会以任何方式阻止请求处理器访问数据;因此,如果一个核请求处于“E”状态的数据,则该核将获得该数据的副本。处于“E”状态的另一副本将基于该核是请求用于“写入”还是“读取”的副本而改变。如果该核正被请求用于写入,旧拷贝将被无效(“I”状态),并且如果其用于阅读,则旧拷贝将被置于共享的“S”状态。

相关问题