multithreading - 在 x86 cpu 中窥探内存访问
问题描述
我正在阅读有关缓存控制协议的信息,因为它记录在Intel Manual Vol.3(p11)
. 尚不清楚的是窥探内存访问。这是它的描述:
从 P6 系列处理器开始,如果一个处理器(通过监听)检测到另一个处理器正在尝试访问它在其缓存中修改但尚未写回系统内存的内存位置,则监听处理器将向另一个处理器发出信号处理器(通过
HITM#
信号)高速缓存行保持在修改状态,并将执行修改数据的隐式写回。隐式回写直接传送到初始请求处理器,并由内存控制器窥探,以确保系统内存已更新。在这里,具有有效数据的处理器可以将数据传递给其他处理器,而无需实际将其写入系统内存;然而,监听这个操作并更新内存是内存控制器的责任。
考虑以下缓存状态(根据 MESI):
CPU1 CPU2 CPU3
Line1 M I -
CPU2
写入Line1
.
这就是我看到窥探的方式:
CPU2
对缓存在 中的内存执行写入操作Line1
。CPU1
窥探并发现CPU2
.CPU1
用信号通知其他CPU
sHITM#
处于Line1
修改状态CPU1
执行Line1
数据回写或 因为CPU1
此时有有效数据,数据将被传输到两者CPU2
并CPU3
传输Line1
到共享(S)状态。CPU2
在修改 (M) 状态和无效 (I) 状态中执行实际写入传输Line1
在其缓存中。Line1
CPU1
CPU3
因此,通过窥探内存访问,系统总线访问可以避免保持高速缓存的一致性,即使在某些 CPU 写入位于缓存Invalid
队列中的内存位置的情况下也是如此。这基本上就是他们所说的窥探的意思吗?
解决方案
推荐阅读
- java - 如何使用 Hibernate 继承模型使 OnDelete CASCADE 工作
- python - Django 2:使用 google-cloud-storage 将媒体上传到 Google Cloud Storage
- javascript - Webpack 开发服务器不接受同一端点的多个请求方法 - POST、PATCH、DELETE
- java - JDBC 根据另一个 select 语句的结果执行 select 语句
- php - 我正在尝试将数据传递到我的注册视图
- c# - C# 任务独立主线程
- bootstrap-4 - justify-content-around 用于轮播指标
- powershell - 可以忽略 VS Code 调试器中的代码行吗?
- c# - 如何在特定的 div 类中动态生成 texbox 或标签?
- asp.net-mvc - 在我的 DBContext 上,我收到一个错误,表明该实例已被跟踪。使用 nottracking 时会变得更糟