参考:
芜湖韩金轮_HNU计算机体系结构-实验3:多cache一致性算法
A橙_计算机体系结构实验三-缓存一致性
一、实验目的
- 熟悉cache一致性模拟器(监听法和目录法)的使用,并且理解监听法和目录法的基本思想,加深对多cache一致性的理解。
- 做到给出指定的读写序列,可以模拟出读写过程中发生的替换、换出等操作,同时模拟出cache块的无效、共享和独占态的相互切换。
二、实验说明
学习cache一致性监听法和目录法,并且进行一致性算法的模拟实验,熟悉相关知识。
- 缓存一致性:不同CPU共享存储器中的某一数据,如何在各自的缓存Cache保证该数据的一致性;
- 监听法:每个CPU的Cache,都可以通过总线监听其他CPU对共享数据的读写操作;
- 以下图为例,当前CPU A对共享数据块x进行读/写操作
- 此时其他CPU(这里是CPU B)会通过总线监听CPU A的操作,并做出写回、不变等操作;
没有其他CPU的Cache中有块x | CPU B共享块x | CPU B独占块x | Cache A需要替换块y(CPU A共享) | Cache A需要替换块y(CPU A独占) | |
---|---|---|---|---|---|
当前CPU A读块x | 主存–>Cache A(读不命中)【A-共享】 | 主存–>Cache A(读不命中)【A、B-共享】 | Cache B–>主存,主存–>Cache A【A、B-共享】 | x:主存–>Cache A【A-共享】 | y:Cache A–>主存; x:主存–>Cache A【A-共享】 |
当前CPU A写块x | 主存–>Cache A(写不命中)【A-独占】 | 主存–>Cache A(写不命中);Cache A作废Cache B的x【A-独占、B-无效】 | Cache B–>主存,主存–>Cache A【A-独占、B-失效】 | x:主存–>Cache A【A-独占】 | y:Cache A–>主存;x:主存–>Cache A【A-独占】 |
- 目录法:主存中每个块维护一个目录的共享集合;集中式地发送指令,以保证Cache的一致性;
- CPU的Cache对块的读/写都请求主存中的该目录
- 然后目录根据该块的共享集合发送写回、取值、作废、返回值等指令
- 主存发送给CPU的Cache请求的块
三、实验内容
1、cache一致性算法-监听法模拟
1)利用监听法模拟器进行下述操作,并填写下表
步骤 | 所进行的访问 | 是否发生了替换? | 是否发生了写回? | 监听协议进行的操作 | 块状态改变 |
---|---|---|---|---|---|
1 | CPU A 读第5块 | 否 | 否 | CPU A读不命中;Cache A发送读不命中信号, 将块5从主存读入Cache A 1 | Cache A 1由无效变为共享 |
2 | CPU B 读第5块 | 否 | 否 | CPU B读不命中;Cache B发送读不命中信号, 将块5从主存读入Cache B 1 | Cache B 1由无效变为共享 |
3 | CPU C 读第5块 | 否 | 否 | CPU C读不命中;Cache C发送读不命中信号, 将块5从主存读入Cache C 1 | Cache C 1由无效变为共享 |
4 | CPU B 写第5块 | 否 | 否 | CPU B写命中; CacheB发送作废信号,使其他CPU的块5失效 | Cache B 1由共享变为独占; Cache A 1、C 1由共享变为无效 |
5 | CPU D 读第5块 | 否 | 是(4-Cache B 1中的块5写回) | CPU D读不命中;Cache D发送读不命中信号,CPU B将块5写入主存,然后CPU D将块5从主存读入Cache D 1;【【如果优化的话】:Cache D发送读不命中信号,CPU B将块5写到总线,然后CPU D将块5从总线读入Cache D 1;然后CPU B将块5写入主存】; | Cache B 1由独占变为共享;Cache D 1由无效变为共享 |
6 | CPU B 写第21块 | 是(Cache B 1中块5换成块21) | 否 | CPU B写不命中;Cache B发送写不命中信号,从主存中加载块21到缓存B 1中,替换块5 | Cache B 1由共享变为独占; |
7 | CPU A 写第23块 | 否 | 否 | CPU A写不命中; Cache A发送写不命中信号,从主存中加载块23到缓存A 3中; | Cache A 1由无效变为独占; |
8 | CPU C 写第23块 | 否 | 是(7-Cache A 3中的块23写回) | CPU C写不命中;Cache C发送写不命中信号,CPU A将块23写入主存(写回),然后CPU C将块23从主存读入Cache C 3,然后CPU C写Cache C 3中的块23(这里不写回);【【如果优化的话】:Cache C发送写不命中信号,CPU A将块23写到总线,然后CPU C将块23从总线读入Cache C 3;然后CPU A将块23写入主存;然后CPU C写Cache C 3中的块23; | Cache A 3由独占变为无效;Cache C 3由无效变为独占 |
9 | CPU B 读第29块 | 是(Cache B 1中块21换成块29) | 是(6-Cache B 1中的块21写回) | CPU B读不命中;Cache B发送读不命中信号,换出Cache B 1中找第21块,写回到主存; 将块29从主存读入Cache B 1 | Cache B 1由独占变为共享; |
10 | CPU B 写第5块 | 是(Cache B 1中块29换成块5) | 否 | CPU B写不命中;Cache B发送写不命中信号,访存并加载块5到Cache B 1中,替换块29;同时Cache D 1中的块5失效;Cache B写入Cache B 1的块5; | Cache B 1由共享变为独占; Cache D 1由共享变为无效 |
- 替换部分,两篇文章有些出入:
- 如1中CPU A 读第5块,韩金轮写的“替换 Cache A的块1”,A橙_写的“否”;
- 这里采用后者-冷不命中:一开始高速缓存里是空的,那么也就不用替换已有的块。
- 写回部分,考虑两篇文章在9/10的出入
- 9.Cache B 1的块21会写回:因为6的时候写块21,这里块21换出去;
- 10.Cache B 1的块29不会写回:因为9的时候Cache B 1的块29只是读,没有脏,不用写回;
(a1)CPU A 读第5块
- 未替换:5%4=1,CPU A到缓存A 1中找第5块,冷不命中,访存并加载到缓存A 1中。
- 未写回:这里是“读”。
- 监听协议进行的操作与块状态改变:
- CPU A读不命中;
- Cache A发送读不命中信号, 将块5从主存读入Cache A1
- Cache A 1由无效变为共享;
(b2)CPU B 读第5块
- 未替换:5%4=1,CPU B到缓存B 1中找第5块,冷不命中,访存并加载到缓存B 1中。
- 未写回:这里是“读”。
- 监听协议进行的操作与块状态改变:
- CPU B读不命中;
- CacheB发送读不命中信号, 将块5从主存读入CacheB1
- Cache B 1由无效变为共享;
(c3)CPU C 读第5块
- 未替换:5%4=1,CPU C到缓存C 1中找第5块,冷不命中,访存并加载到缓存C 1中。
- 未写回:这里是“读”。
- 监听协议进行的操作与块状态改变:
- CPU C读不命中;
- Cache C发送读不命中信号, 将块5从主存读入Cache C1
- Cache C 1由无效变为共享;
(d4)CPU B 写第5块
- 未替换:5%4=1,CPU A到缓存B 1中找第5块,命中
- 未写回:这里采用的“写回”
- 直写:在CPU写Cache的时候就写回主存;
- 写回:等其他CPU再次访问该数据的时候,才写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU B写命中;
- CacheB发送作废信号,使其他CPU的块5失效
- Cache B 1由共享变为独占; Cache A 1、C 1由共享变为无效
(e5)CPU D 读第5块
- 未替换:5%4=1,CPU D到缓存D 1中找第5块,冷不命中。
- 写回:CPU B等到其他CPU再次访问该数据,此时写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU D读不命中;
- Cache D发送读不命中信号,CPU B将块5写入主存,然后CPU D将块5从主存读入Cache D 1
- 【如果优化的话】:Cache D发送读不命中信号,CPU B将块5写到总线,然后CPU D将块5从总线读入Cache D 1;然后CPU B将块5写入主存
- Cache B 1由独占变为共享;Cache D 1由无效变为共享
(f6)CPU B 写第21块
- 替换:5%4=1,CPU B到缓存B 1中找第21块,这里已经有了第5块,冲突不命中,访存并加载块21到缓存D 1中,替换块5。
- 未写回:采用“写回”,会等其他CPU再次访问该数据的时候,才写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU B写不命中;
- Cache B发送写不命中信号,从主存中加载块21到缓存B 1中,替换块5
- Cache B 1由共享变为独占;
(g7)CPU A 写第23块
- 未替换:23%4=3,写不命中
- 未写回:采用“写回”,会等其他CPU再次访问块23的时候,才写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU A写不命中;
- Cache A发送写不命中信号,从主存中加载块23到缓存A 3中
- Cache A 1由无效变为独占;
(h8)CPU C 写第23块
- 未替换:23%4=3,写不命中
- 写回:CPU A等到其他CPU再次访问该数据块23,此时写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU C写不命中;
- Cache C发送写不命中信号,CPU A将块23写入主存,然后CPU C将块23从主存读入Cache C 3,然后CPU C写Cache C 3中的块23
- 【如果优化的话】:Cache C发送写不命中信号,CPU A将块23写到总线,然后CPU C将块23从总线读入Cache C 3;然后CPU A将块23写入主存;然后CPU C写Cache C 3中的块23
- Cache A 3由独占变为无效;Cache C 3由无效变为独占
(i9)CPU B 读第29块
- 替换:29%4=1,CPU B到缓存B 1中找第29块,冲突不命中
- 写回:CPU B需要换出CacheB 1中找第21块,此时写回到主存;
- 监听协议进行的操作与块状态改变:
- CPU B读不命中;
- CacheB发送读不命中信号,换出CacheB 1中找第21块,写回到主存; 将块29从主存读入CacheB 1
- Cache B 1由独占变为共享;
(j10)CPU B 写第5块
- 替换:5%4=1,CPU A到缓存B 1中找第5块,但这里是块29,冲突/写不命中
- 未写回:换出的块29仅读,不需要写回;
- 监听协议进行的操作与块状态改变:
- CPU B写不命中;
- Cache B发送写不命中信号,访存并加载块5到Cache B 1中,替换块29;同时Cache D 1中的块5失效;Cache B写入Cache B 1的块5
- Cache B 1由共享变为独占; Cache D 1由共享变为无效
2) 请截图,展示执行完以上操作后整个cache系统的状态
2、cache一致性算法-目录法模拟
1)利用目录法模拟器进行下述操作,并填写下表
步骤 | 所进行的访问 | 监听协议进行的操作 | 共享集合变化 | 块状态改变 |
---|---|---|---|---|
1 | CPU A 读第6块 | CPU A读不命中; Cache A发送读不命中信号给主存,主存向本地结点A发块6 | 块6:{A} | Cache A 2由无效变为共享 |
2 | CPU B 读第6块 | CPU B读不命中;Cache B发送读不命中信号给主存,主存向本地结点B发块6 | 块6:{A,B} | Cache B 2由无效变为共享; |
3 | CPU D 读第6块 | CPU D读不命中;Cache D发送读不命中信号给主存,主存向本地结点D发块6 | 块6:{A,B,D} | Cache D 2由无效变为共享; |
4 | CPU B 写第6块 | CPU B写命中;Cache B发送作废信号给主存,主存向远程结点A、D发作废消息 | 块6:{B} | Cache A 2由共享变为无效;Cache D 2由共享变为无效;Cache B 2由共享变为独占 |
5 | CPU C 读第6块 | CPU C读不命中;Cache C发送读不命中信号给主存,主存取Cache B 2的块6,再发给Cache C 2 | 块6:{B,C} | Cache B 2由独占变为共享;Cache C 2由无效变为共享 |
6 | CPU D 写第20块 | CPU D写不命中;Cache D发送写不命中信号给主存,主存向本地结点D发块20 | 块20:{D}; | Cache D 0由无效变为独占 |
7 | CPU A 写第20块 | CPU A写不命中;Cache A发送写不命中信号给主存,主存从远程结点D取并作废块20,然后主存向本地结点A发块20 | 块20:{A} | Cache A 0由无效变为独占;Cache D 0由独占变为无效 |
8 | CPU D 写第6块 | CPU D写不命中;Cache D发送写不命中信号给主存,主存向远程结点B、C发作废信号块,然后主存向本地结点D发块6; | 块6:{D} | Cache B 2、C 2由共享变为无效;Cache D 2由无效变为独占 |
9 | CPU A 读第12块 | CPU A读不命中;Cache A写回块20给主存,然后发送读不命中信号给主存,主存向本地结点A写块12 | 块20:{ };块12:{A} | Cache A 0由独占变为共享; |
注:下面的截图中,为了保留左上角的步骤,可能截图过早使得共享集合未及时改变,可以以文字版的说明为准;
(a1)CPU A 读第6块
- 监听协议进行的操作与块状态改变:
- CPU A读不命中;
- Cache A发送读不命中信号给主存,主存向本地结点A发块6;
- 存储器中块6的共享集合为{A}
- Cache A 2由无效变为共享;
(b2)CPU B 读第6块
- 监听协议进行的操作与块状态改变:
- CPU B读不命中;
- Cache B发送读不命中信号给主存,主存向本地结点B发块6
- 存储器中块6的共享集合为{A,B}
- Cache B 2由无效变为共享;
(c3)CPU D 读第6块
- 监听协议进行的操作与块状态改变:
- CPU D读不命中;
- Cache D发送读不命中信号给主存,主存向本地结点D发块6;
- 存储器中块6的共享集合为{A,B ,D}
- Cache D 2由无效变为共享;
(d4)CPU B 写第6块
- 监听协议进行的操作与块状态改变:
- CPU B写命中;
- Cache B发送作废信号给主存,主存向远程结点A、D发作废消息;
- 存储器中块6的共享集合为{B}
- Cache A 2由共享变为无效;Cache D 2由共享变为无效;Cache B 2由共享变为独占
(e5)CPU C 读第6块
- 监听协议进行的操作与块状态改变:
- CPU C读不命中;
- Cache C发送读不命中信号给主存,主存取Cache B 2的块6,再发给Cache C 2
- 存储器中块6的共享集合为{B,C}
- Cache B 2由独占变为共享;Cache C 2由无效变为共享
(f6)CPU D 写第20块
- 监听协议进行的操作与块状态改变:
- CPU D写不命中;
- Cache D发送写不命中信号给主存,主存向本地结点D发块20;
- 存储器中块20的共享集合为{D}
- Cache D 0由无效变为独占
(g7)CPU A 写第20块
- 监听协议进行的操作与块状态改变:
- CPU A写不命中;
- Cache A发送写不命中信号给主存,主存从远程结点D取并作废块20,然后主存向本地结点A发块20;
- 存储器中块20的共享集合为{A}
- Cache A 0由无效变为独占;Cache D 0由独占变为无效
(h8)CPU D 写第6块
- 监听协议进行的操作与块状态改变:
- CPU D写不命中;
- Cache D发送写不命中信号给主存,主存向远程结点B、C发作废信号块,然后主存向本地结点D发块6;
- 存储器中块6的共享集合为{D}
- Cache B 2、C 2由共享变为无效;Cache D 2由无效变为独占
(i9)CPU A 读第12块
- 监听协议进行的操作与块状态改变:
- CPU A读不命中;
- Cache A写回块20给主存,然后发送读不命中信号给主存,主存向本地结点A写块12;
- 存储器中块20的共享集合为{ },块12的共享集合为{A}
- Cache A 0由独占变为共享;
2) 请截图,展示执行完以上操作后整个cache系统的状态
3、思考题
1)目录法和监听法分别是集中式和基于总线,两者优劣是什么?
监听法-基于总线:通过广播信号来实现写失效
- 优:
- 不需要额外的存储空间;
- 核数较少时,总线压力较小,成本低,效果好。
- 劣:
- 可扩展性差,能够连接的处理器数目有限
- 处理器数量越多,总线通信的压力大:总线冲突增加, 监听带宽成为瓶颈
目录法-集中式:使用目录维护一致性信息
- 优:
- 可以实现在分布式的系统中;
- 不需要总线广播一致性信息, 总线压力小
- 劣:
- 目录增加了存储开销,随着核数增加时目录的开销变大;