写(store)的路径:一次写怎么让别的核看见 1 2 3 4 4 5 6 // 开始时:data = 0,ready = false // 核 0(写) data = 42; ready = true; // 核 1(读) while (!ready) {} use(data); // 期望 42 核 0 · 写方 执行 data = 42; ready = true; invalidate queue store buffer 这次没用上 data = 42 1 等 ACK,还不能写进 L1D 收齐 ACK,已写进 L1D L1D(本核私有) data 0 S data 42 M ready 0 E ready 1 M ready 1 S 4 L2(本核私有) 核 1 · 读方 执行 while (!ready); use(data); invalidate queue store buffer invalidate:data 3 已回 ACK,还没处理 这次没用上 L1D(本核私有) data 0 S data 0 S invalidate 还没处理 ready 无 I ready 1 S L2(本核私有) 5 ready 的行转给核 1 2 3 6 核 1 在这里读到旧值 0 片上互连(环或网格):Read、RFO、invalidate 请求、ACK、缓存间转发的整条行,都走这里 L3(全核共享)+ snoop filter snoop filter 记着每一行在哪些核里,失效只发给有副本的核(②)。 它不会把新值推进别的核:核 1 要用 ready,得自己来取(⑤)。

M已修改E独占S共享I无效