文章目录
- 实验3 多cache一致性算法
- 一、实验目的
- 二、实验说明
- 三 实验内容
- 1、cache一致性算法-监听法模拟
- 2、cache一致性算法-目录法模拟
- 四、思考题
- 五、实验总结
实验3 多cache一致性算法
一、实验目的
熟悉cache一致性模拟器(监听法和目录法)的使用,并且理解监听法和目录法的基本思想,加深对多cache一致性的理解。
做到给出指定的读写序列,可以模拟出读写过程中发生的替换、换出等操作,同时模拟出cache块的无效、共享和独占态的相互切换。
二、实验说明
学习cache一致性监听法和目录法,并且进行一致性算法的模拟实验,同时熟悉相关知识。
三 实验内容
1、cache一致性算法-监听法模拟
1) 利用监听法模拟器进行下述操作,并填写下表
以下 I 表示无效, S表示共享, E表示独占。模拟器采用不优化设置.
所进行的访问 | 是否发生了替换? | 是否发生了写回? | 监听协议进行的操作与块状态改变 |
---|---|---|---|
CPU A 读第5块 | 替换 Cache A的块1 | 否 | CPU A读不命中, Cache A发出BusRd信号, 存储器第5块经Bus传送到Cache A第1块, Cache A第1块状态从I变成S |
CPU B 读第5块 | 替换Cache B的块1 | 否 | CPU B读不命中, Cache B发出BusRd信号, 存储器第5块经Bus传送到Cache B第1块, Cache B第1块状态从I变成S |
CPU C 读第5块 | 替换Cache C的块1 | 否 | CPU C读不命中, Cache C发出BusRd信号, 存储器第5块经Bus传送到Cache C第1块, Cache C第1块状态从I变成S |
CPU B 写第5块 | 否 | 否 | CPU B写命中, Cache B向Bus发出写作废信号, Cache A第1块和Cache C第1块状态都从S变成I, Cache B第1块状态从S变成E |
CPU D 读第5块 | 替换 Cache D的块1 | Cache B的块1写回 | CPU D读不命中, Cache D发出BusRd信号, Cache B监听到后把它的第1块写回到存储器第5块, 然后状态从E变成I。之后该块又从存储器传送到Cache D第1块, 状态设为E |
CPU B 写第21块 | 替换CacheB 的块1 | 否 | CPU B写不命中, Cache B发出BusRdx信号, 存储器第21块经Bus传送到Cache B第1块, 将原本的第1块替换出去, 状态设为E |
CPU A 写第23块 | 替换CacheA的块3 | 否 | CPU A读不命中, Cache A发出BusRdx信号, 存储器第23块经Bus传送到Cache A第3块, 状态设为E |
CPU C 写第23块 | 替换CacheC的块3 | CacheA的块3写回 | CPU C写不命中, Cache C发出BusRdx信号, Cache A监听到该信号, 将其第3块写回到存储器第23块, 同时Cache A中该块状态改为I。之后存储器第23块传送到Cache C第3块, 状态设为E |
CPU B 读第29块 | 替换CacheB的块1 | CacheB的块1写回 | CPU B读不命中, Cache B发出BusRd信号, 存储器第29块经Bus传送到Cache B第1块, 将原来的块替换出去, 将状态设为S |
CPU B 写第5块 | 替换CacheB的块1 | 否 | CPU B写不命中, Cache B发出BusRdx信号, Cache D监听到该信号后将其第1块作废, 存储器第5块传送到Cache B第1块, 替换原来的块, 状态设为E |
2) 请截图,展示执行完以上操作后整个cache系统的状态
监听法的基本原理是,每个处理器核心的缓存都可以监视(监听)其他核心对共享数据的读写操作。当一个处理器核心对共享数据进行写入时,它会发送一个写入操作的通知(invalidate、update等)给其他核心的缓存,告知它们更新或无效化相应的缓存行。其他核心的缓存会在收到通知后,根据通知的类型进行相应的操作。
以下是监听法模拟的基本步骤:
- 每个处理器核心的缓存行都包含一个有效位(valid bit)用于表示缓存行是否有效,以及一个标签(tag)用于唯一标识该缓存行所存储的内存地址。
- 当一个处理器核心对共享数据进行写入操作时,它首先检查自己的缓存中是否存在该数据的缓存行。如果存在,它将更新缓存行中的数据,并将该缓存行标记为“已修改(modified)”。
- 同时,该核心会发送一个写入操作的通知给其他核心的缓存,通知它们该缓存行已经被修改。这个通知可以是无效化(invalidate)操作或更新(update)操作,具体的实现方式取决于具体的监听法协议。
- 其他核心的缓存在接收到通知后,根据通知的类型进行相应的操作:
- 如果接收到无效化操作,则将自己的缓存行标记为无效(invalid),以后再访问该数据时需要从主内存或其他核心的缓存中重新获取。
- 如果接收到更新操作,则将自己的缓存行中的数据更新为最新的数据。
- 当一个处理器核心需要读取共享数据时,它首先检查自己的缓存中是否存在有效的缓存行。如果存在有效的缓存行,则直接读取缓存中的数据。如果缓存行无效,则需要从主内存或其他核心的缓存中获取最新的数据。
通过监听法模拟,每个核心都能感知到其他核心对共享数据的操作,并及时进行相应的缓存行更新或无效化,从而保持多核系统中缓存中的数据一致性。这种方式能够有效解决多核处理器中共享数据的一致性问题,提高系统的可靠性和性能。
2、cache一致性算法-目录法模拟
1)利用目录法模拟器进行下述操作,并填写下表
所进行的访问 | 监听协议进行的操作与块状态改变 |
---|---|
CPU A 读第6块 | Cache A读不命中 从本地存储器中传送第6块到Cache A第2块, Cache A该块状态设为S, 存储器中第6块状态也设为S, 将对应A的presence bit置1 |
CPU B 读第6块 | Cache B读不命中, 通过互联网络从宿主存储器中传送第6块到Cache B第2块, Cache B该块状态设为S, 存储器中将对应B的presence bit置1 |
CPU D 读第6块 | Cache D读不命中, 通过互联网络从宿主存储器中传送第6块到Cache D第2块, Cache D该块状态设为S, 存储器中将对应D的presence bit置1 |
CPU B 写第6块 | Cache B写命中, 向宿主存储器发送写命中信号, 宿主存储器向A, D发送作废信号, 将第6块的A, D对应的presence bit复位, 将块状态设为E。 Cache B写第2块, 将块状态设为E |
CPU C 读第6块 | Cache C读不命中, 向宿主存储器发送读缺失信号, 宿主存储器向Cache B发送Fetch信号, Cache B将其第2块状态设为S, 向宿主存储器写回该块。宿主存储器收到该块后将状态设为S, 将C对应的presence bit置1, 将该块传送给Cache C, Cache C将该块状态设为S |
CPU D 写第20块 | Cache D写不命中, Memory C通过互联网络从宿主存储器中传送第20块到Cache D第0块, Cache D该块状态设为E, 存储器中将对应D的presence bit置1, 块状态设为E |
CPU A 写第20块 | Cache A写不命中, 向宿主存储器中发送Write miss, 宿主存储器向Cache D发送Fectch信号, Cache D将其第0块写回宿主存储器, 将块状态设为I。 存储器中将对应D的presence bit复位, 将A对应的presence bit置1, 块状态设为E, 将该块传送给Cache A。 Cache A中该块状态设为E |
CPU D 写第6块 | Cache D写不命中, 向宿主存储器发送Write miss, 宿主存储器向Cache D传送该块, 将对应B, C的presence bit复位, 将D对应的presence bit置1, 块状态设为E, 向Cache B, C发出作废信号。Cache D中该块状态设为E。 Cache B, C均将该块状态设为I |
CPU A 读第12块 | Cache A读不命中, 第12块要替换出Cache A中的第0块, 先将原本的第0块写回到宿主存储器第20块, 存储器中第20块状态变成未缓冲。宿主存储器将第12块的状态设为S, 将A对应的presence bit置1, 将该块传送给Cache A。 然后换入, 块状态设为S |
2)请截图,展示执行完以上操作后整个cache系统的状态
目录法的基本原理是,每个缓存块都有一个对应的目录项。目录项中记录了该缓存块在哪些核心的缓存中被缓存,以及该缓存块的共享状态。
以下是目录法模拟的基本步骤:
- 每个处理器核心的缓存块都包含一个有效位(valid bit)用于表示缓存块是否有效,以及一个标签(tag)用于唯一标识该缓存块所存储的内存地址。
- 每个缓存块的目录项记录了哪些核心的缓存中包含该缓存块的副本,并记录了每个核心对该缓存块的共享状态,例如“独占(exclusive)”、“共享(shared)”、“无效(invalid)”等。
- 当一个处理器核心需要读取共享数据时,它首先检查自己的缓存中是否存在该数据的缓存块。如果存在有效的缓存块,它会从该缓存块中读取数据。如果缓存块无效,则需要从主内存或其他核心的缓存中获取最新的数据。
- 当一个处理器核心对共享数据进行写入操作时,它首先检查自己的缓存中是否存在该数据的缓存块。如果存在有效的缓存块,并且该缓存块的共享状态为“独占”,表示该核心是唯一一个拥有该数据副本的核心,那么该核心可以直接在缓存块中更新数据。
- 如果存在有效的缓存块,但其共享状态为“共享”,表示其他核心也拥有该数据的副本,那么该核心需要向目录发送一个请求,请求将该缓存块的共享状态变为“独占”。同时,目录会向其他包含该数据副本的核心发送无效化操作,让它们将缓存块标记为无效。
- 当其他核心的缓存接收到无效化操作时,它们将对应的缓存块标记为无效。如果其他核心的缓存块在之后的访问中需要读取或写入该数据,它们需要从主内存或其他核心的缓存中重新获取最新的数据。
通过目录法的模拟,每个核心都可以通过目录来获取共享数据的最新状态,同时协调共享数据的访问。目录维护了所有共享数据的副本信息和共享状态,通过协调缓存之间的通信和状态转换,确保多核处理器系统中缓存的一致性。
四、思考题
目录法和监听法分别是集中式和基于总线,两者优劣是什么?
答:
监听法
-
优点:核数较少时,总线压力较小,成本低,效果好.
-
缺点:需要通过总线广播一致性相关信息. 总线上能够连接的处理器数目有限。当核数增多时,总线冲突增加, 监听带宽成为瓶颈
目录法
-
优点:使用集中目录来记录每个cache块的状态,不需要总线广播一致性信息, 总线压力小。
-
缺点:需要维护目录数据结构, 随着核数增加时目录的开销变大。
五、实验总结
在我进行对cache一致性模拟器的实验过程中,我深入研究了监听法和目录法这两种常见的cache一致性协议。通过实际的模拟器操作,我对这两种协议的原理和工作机制有了更深入的理解。
首先,我发现监听法是一种基于总线的cache一致性协议。在这个协议中,所有的缓存控制器都通过总线来监听其他缓存控制器的操作。当一个缓存控制器修改了共享数据时,它会通过总线发送一个信号,让其他缓存控制器将对应的缓存行置为无效。这样,其他缓存控制器在需要访问这个缓存行时,就会重新从内存中读取最新的数据,保证了数据的一致性。通过实验,我清晰地观察到了监听法的特点:简单、易于实现,但是总线的带宽成为性能瓶颈,并且在大规模系统中会导致严重的总线竞争问题。
其次,我研究了目录法,这是一种基于目录的cache一致性协议。在这个协议中,每个缓存控制器都维护了一个目录表,用于记录共享数据的状态和位置。当一个缓存控制器修改了共享数据时,它会向目录表发送一个更新请求,将对应的缓存行置为无效或者共享状态。其他缓存控制器在需要访问这个缓存行时,需要先向目录表发出请求,获取该数据的状态和位置信息,然后根据相应的状态进行操作。通过实验,我发现目录法相对于监听法来说,减轻了总线的压力,提高了并发度和扩展性。然而,目录的维护和更新会带来一定的开销,特别是在多处理器系统中。
其他缓存控制器在需要访问这个缓存行时,需要先向目录表发出请求,获取该数据的状态和位置信息,然后根据相应的状态进行操作。通过实验,我发现目录法相对于监听法来说,减轻了总线的压力,提高了并发度和扩展性。然而,目录的维护和更新会带来一定的开销,特别是在多处理器系统中。
通过这次实验,我不仅对cache一致性的概念和原理有了更深入的理解,还通过实际模拟操作加深了对监听法和目录法的理解。我认识到在设计和选择cache一致性协议时,需要综合考虑系统规模、性能需求、开销以及硬件限制等方面的因素。不同的协议适用于不同的场景,了解它们的特点和优缺点有助于我们做出合适的选择。同时,我也意识到cache一致性对于多处理器系统的正确性和性能具有重要影响,因此在实际应用中需要仔细权衡