首页 文章

对于回写高速缓存策略,为什么在写入高速缓存之前应首先从内存中读取数据?

提问于
浏览
4

具有回写高速缓存的高速缓存,对高速缓冲存储器执行写操作并立即返回 . 仅当数据已存在于缓存中时才会这样 . 如果数据不存在于高速缓存中,则首先从较低存储器中取出数据,然后将其写入高速缓存中 .

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

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

我有以下猜测,

这是针对多处理器环境中的Cache Coherency完成的 . 其他处理器窥探总线以保持Cache Coherency . 写入地址的处理器需要获得独占访问权限,其他处理器必须找到这一点 . 但是,这是否意味着,单处理器计算机不需要这样做?

谢谢

2 回答

  • 5

    简答

    高速缓存中未命中的写入可能会也可能不会获取正在写入的块,具体取决于高速缓存的写入未命中策略( fetch-on-write-missno-fetch-on-write-miss ) . 它不依赖于写入命中策略( write-backwrite-through ) .

    解释

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

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

    L1写策略是fetch-on-write-miss .

    缓存存储 blocks 数据 . 典型的L1块是32字节宽度,也就是说,它包含几个字(例如,8×4字节字) .

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

    我们假设CPU执行4字节 word write .

    • 如果包含该单词的块未存储在缓存中,则表示缓存未命中 . 整个块(32字节)从主存储器传输到高速缓存,然后相应的字(4字节)存储在高速缓存中 .

    • 回写缓存会将块标记为 dirty (如您所述,无效) .

    • 直写高速缓存会将更新后的字发送到主存储器 .

    • 如果包含该单词的块存储在缓存中,我们会有缓存命中 . 相应的单词已更新 .

    更多信息:缓存写入策略和性能 . Norman P. Jouppi .
    http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-91-12.pdf

  • 1

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

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

    在多核CPU中,每个核心都有自己的L1缓存,每个核心都有可能存储共享L2线路的副本 . 因此,您需要缓存一致性的此行为 .

    您应该通过阅读 MESI 协议以及它的派生来了解更多信息 .

相关问题