对于回写式缓存策略,为什么数据应该先从内存中读取,然后再写入缓存?

问题描述 投票:0回答:3

具有Write Back Cache的缓存,对缓存存储器执行写操作并立即返回。仅当数据已存在于缓存中时才会出现这种情况。如果缓存中没有数据,则先从低位内存中取出数据,然后写入缓存中。

我不明白为什么在写入数据之前首先从内存中获取数据很重要。如果要写入数据,无论如何都会失效。

我确实知道基本概念,但想知道在写入地址之前必须读取数据的原因。

我有以下猜测,

这是为了在多处理器环境中实现缓存一致性。其他处理器监听总线以维持高速缓存一致性。在该地址上写入的处理器需要获得独占访问权,其他处理器必须了解这一点。 但是,这是否意味着单处理器计算机不需要这样做?

caching cpu-architecture cpu-cache
3个回答
6
投票

简短回答

缓存中未命中的写入可能会或可能不会获取正在写入的块,具体取决于缓存的写入未命中策略(写未命中时获取写入未命中时不获取 )。 它不依赖于写命中策略(回写直写)。

说明

为了简化,我们假设我们有一个一级缓存层次结构:

-----     ------     -------------
|CPU| <-> | L1 | <-> |main memory|
-----     ------     -------------

L1 写入策略是 fetch-on-write-miss。

缓存存储数据块。典型的 L1 块的宽度为 32 字节,即包含多个字(例如 8 x 4 字节的字)。

高速缓存和主存之间的传输单位是块,但CPU和高速缓存之间的传输可以具有不同的大小(1、2、4或8字节)。

我们假设 CPU 执行 4 字节字写入

  1. 如果包含该单词的块未存储在缓存中,则说明缓存未命中。整个块(32字节)从主存传输到缓存,然后将相应的字(4字节)存储在缓存中。

    1. 回写式缓存会将块标记为(不是无效的,正如您所说)。
    2. 直写式缓存会将更新后的字发送到主存。
  2. 如果包含该单词的块存储在缓存中,则我们有缓存命中。对应的单词已更新。

更多信息: 缓存写入策略和性能。诺曼·P·朱皮。
http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-91-12.pdf


1
投票

你的猜测几乎是正确的。然而,这种行为也必须在多核单处理器系统中完成。

您的处理器可以有多个核心,因此在写入缓存行(在 WB 缓存中)时,发出写入的核心需要获得对该行的独占访问权限。如果要写入的行被标记为脏,那么在写入新信息之前,它将被“刷新”到较低的内存。

在多核 CPU 中,每个核心都有自己的 L1 缓存,并且每个核心都可能存储共享 L2 行的副本。因此,您需要这种行为来实现缓存一致性。

您应该通过阅读MESI协议及其派生来了解更多信息。


0
投票

当目标内存块不在缓存中时,直写策略直接将数据写入内存。相比之下,回写策略首先将数据加载到缓存中,然后对其进行修改,这可能看起来多余。然而,这种方法旨在减少写入内存的次数。虽然在缓存未命中期间添加了读操作,但后续的写入都可以命中缓存。否则,如果数据从未被读取,则回写策略下的每个写操作仍然需要访问内存。

翻译自:https://juejin.cn/post/7158395475362578462.

我的理解是基于局部性原理的应用,来减少对内存的写入次数。

:))

© www.soinside.com 2019 - 2024. All rights reserved.