Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 为什么缓存中的错误共享不会导致错误的结果?_Multithreading_Caching_Concurrency - Fatal编程技术网

Multithreading 为什么缓存中的错误共享不会导致错误的结果?

Multithreading 为什么缓存中的错误共享不会导致错误的结果?,multithreading,caching,concurrency,Multithreading,Caching,Concurrency,有点像是这个的延伸。计算机体系结构是如何围绕两个线程同时写入物理内存中非常接近的缓存线工作的?看起来可能存在一种竞争条件,即两个线程以完全相同的时钟周期向同一缓存线发出写操作。在将另一个缓存的行标记为过时之前,两个缓存是否都能成功写入?这在功能上是如何解决的?您应该研究缓存一致性协议,如MESI及其扩展MOESI和MESIF 在这些协议中,每个缓存线本质上是一个状态机,根据自己的处理器正在做什么以及它在总线上嗅探什么消息,从一个状态转换到下一个状态。缓存控制器监控内存总线事务,并相应地更新缓存线

有点像是这个的延伸。计算机体系结构是如何围绕两个线程同时写入物理内存中非常接近的缓存线工作的?看起来可能存在一种竞争条件,即两个线程以完全相同的时钟周期向同一缓存线发出写操作。在将另一个缓存的行标记为过时之前,两个缓存是否都能成功写入?这在功能上是如何解决的?

您应该研究缓存一致性协议,如MESI及其扩展MOESI和MESIF

在这些协议中,每个缓存线本质上是一个状态机,根据自己的处理器正在做什么以及它在总线上嗅探什么消息,从一个状态转换到下一个状态。缓存控制器监控内存总线事务,并相应地更新缓存线的状态,因此命名为“snoopy缓存”

在MESI中,缓存线可以有四种状态:修改独占共享无效

我们可以浏览您的示例,其中两个内核希望写入同一缓存线,并从非常高的层次上了解为什么该协议不会导致错误的结果

假设两个内核都没有缓存线,并且在修改缓存线之前先读取缓存线

1) Core 1希望读取缓存线,因此它会广播一条BusRd,从内存接收缓存线,并转换为独占的

2) Core2还希望读取缓存线,以便广播BusRd。Core 1以FlushOpt中的缓存线进行响应,并且两个Core都转换为共享

3) Core1希望写入缓存线,因此它会广播一个BusUpgr并转换到修改的。核心2看到BusUpgr并转换为无效

4) Core 2希望写入缓存线,但它无效,因此它发出BusRdX并转换到修改的。Core 1嗅探BusRdX并在转换为无效之前广播刷新。刷新由内核2和将值写回内存的内存控制器观察


由于一个内核上的写入操作会使其他内核上的缓存线副本无效,因此必须使用最新值重新获取缓存线。因此,没有竞争条件。:)

您想了解的是
MESI
缓存一致性协议是如何工作的