写回与写直通缓存?

172

我的理解是两种方法的主要区别在于,在“写透”方法中,数据立即通过缓存写入主存储器,而在“写回”方法中,数据在“稍后的时间”写入。

虽然在“写透”中仍需要等待内存在“稍后的时间”,但是它有什么好处呢?


@EricWang 我想你的意思是“写回”有更好的性能? - wlnirvana
@wlnirvana 是的,你说得对,这是我的笔误。我会将其删除,并在此处添加新评论以避免未来的误导。 - Eric
9
简单来说,write back 策略性能更好,因为向主存写入数据比向 CPU 缓存写入数据要慢得多,并且在使用过程中数据可能会变短(意味着数据可能很快再次被更改,因此不需要把旧版本存入内存)。虽然较为复杂,但这是一种更加精细的策略,现代 CPU 中的大部分内存都采用该策略。 - Eric
我看到已经给出了解释性答案。我建议你在覆盖写回算法后查看Write-Allocate、Write-NoAllocate标签。 - Caglayan DOKME
你的问题的答案是使用写通模式时,在同一块内进行写操作,只需要写入一次主存储器。详情请参见我的回答。 - qwr
5个回答

170
写穿到主存的好处在于,它简化了计算机系统的设计。使用写穿技术时,主存始终具有该行的最新副本。因此,在进行读取时,主存总是能够回复请求的数据。
如果使用写回技术,则有时最新数据位于处理器缓存中,有时则位于主存中。如果数据位于处理器缓存中,则该处理器必须阻止主存响应读取请求,因为主存可能具有过期的数据副本。这比写穿更加复杂。
此外,写穿可以简化高速缓存一致性协议,因为它不需要"Modify"状态。"Modify"状态记录了高速缓存必须在使该行失效或清除该行之前将缓存行写回内存的情况。在写穿中,缓存行始终可以无需写回而被使失效,因为内存已经具有该行的最新副本。
还有一件事 - 在写回体系结构上,写入内存映射I/O寄存器的软件必须采取额外步骤,以确保写入立即从高速缓存发送出去。否则,直到该行被另一个处理器读取或该行被清除之前,写入对核外不可见。

12
对于内存映射 I/O,这些地址通常被映射为不缓存。写穿透也可以用于提高可靠性(例如,如果 L1 只有奇偶校验保护而 L2 具有 ECC)。对于使用非写分配(即,写未命中不将块分配给缓存,可能会降低对 L1 容量和 L2 读取/L1 填充带宽的需求)的较小缓存,写穿透也更受欢迎,因为对于这种写绕路,写穿透的大部分硬件要求已经存在。 - user2467198
1
我的核心缓存方法是写回还是写直通,有没有可能进行检查? - ArtificiallyIntelligence
4
说写回内存比直接读取更复杂,因为处理器必须阻止主存响应读请求,可能会误导。更确切的说,缓存通过使用“脏位”来跟踪数据是否与主存对齐,从而可以完全不检查主存。 - steviesh
@Shaowu "lshw" 命令可以显示缓存功能,比如 "异步内部写回"。 - mug896
@Craig:MESI用于非分层缓存之间,例如当两个核心各自拥有私有缓存时。当您拥有单个层次结构(例如仅与其L2缓存通信而从不直接访问内存的单个核心)时,您不需要那种复杂性。(您只需要通过强制刷新或者如果您想要实现一致的DMA,则需要外部缓存知道内部缓存是否可能具有缓存行。)但是在最基本的情况下,单个核心需要MESI。如果L1具有线路的脏副本,则无论L2是否也具有较旧的脏副本,它都永远不会被L1读取。 - Peter Cordes
显示剩余3条评论

60

希望这篇文章能帮助您了解磁盘Cache写穿透和写回的区别

写穿透: 写入同步进行,同时写入Cache和后端存储。

写回(或写延迟): 只有Cache被写入。修改过的Cache块在被替换前会被写回到存储中。

写穿透: 当数据更新时,数据被写入Cache和后端存储。这种模式易于操作,但数据写入速度较慢,因为要将数据写入Cache和存储。

写回: 当数据更新时,数据只被写入Cache。只有当数据从Cache中被移除时,修改过的数据才会被写回到后端存储。这种模式具有快速的数据写入速度,但如果在更新的数据被写入存储之前出现电力故障,则数据将会丢失。


2
我不理解最后一句的解释。在停电情况下,DRAM将会失去数据,无论是写回还是写直通,因此这不应该是一个写回特定的问题。 - gustafbstrom
2
@gustafbstrom 并非所有的内存都是DRAM。 - Tripp Kinetics
11
我认为这个解释是从内存/磁盘的角度来看而不是缓存/内存的角度。但是,概念是相同的。 - onlycparra
3
如果缓存没有电池备份,断电时回写(write-back)会更加危险。但是,即使使用写直通(write-through)也可能会丢失数据。我认为最安全的方法是关闭所有写缓存,仅使用读缓存。 - Shengmin Zhao
“只有当数据从缓存中移除时”并不一定是真的 - 这可能会在以后的某个日期,也许基于LRU优先级。 - Tom Hale
谢谢提供信息。从文章中看来,这个洞见是针对CPU缓存的,那么其他组件(例如硬盘)中安装的缓存也适用吗? - torez233

13

通过一个例子来看这个问题。假设我们有一个直接映射的缓存,并使用写回策略。因此在缓存行中有一个有效位、脏位、标记和数据字段。

假设我们有一个操作:写入 A(其中 A 映射到缓存的第一行)。

发生的情况是,来自处理器的数据(A)被写入到缓存的第一行。有效位和标记位被设置。脏位被设置为1。

脏位简单地指示自从上次将缓存行带入缓存以来,缓存行是否被写入过!

现在假设执行另一个操作:读取 E(其中 E 也映射到第一缓存行)。

由于我们有直接映射的缓存,第一行可以被从内存中带来的 E 块替换。但由于上次写入行中的块(块 A)还没有被写入内存(由脏位表示),所以缓存控制器将首先向内存发出 写回请求 以将块 A 转移到内存中,然后通过向内存发出读操作将该行替换为块 E。此时脏位被设置为0。

因此写回策略不保证内存中的块和其关联的缓存行是相同的。但每当要替换该行时,首先进行写回。

写透策略与写回策略相反。根据该策略,内存始终具有最新数据。也就是说,如果写入缓存块,则内存也会相应地进行写入(不使用dirty bits)。


10
写回和写直通是在发生写命中时,即缓存具有所需信息时采用的策略。在这些示例中,我们假设单个处理器正在使用缓存写入主存储器。
写直通:信息被写入缓存和内存,并且当两者都完成时,写操作才完成。这种方法的优点是实现更简单,对于单处理器情况下,主存储器始终与缓存一致(同步),读失效不会导致对主存储器的写入。显然的缺点是每次写命中都要进行两次写操作,其中一次访问较慢的主存储器。
写回:信息被写入缓存块。修改后的缓存块仅在替换时写入内存(实际上是一种延迟写入)。每个缓存块都有一个特殊位,即“脏位”,用于标记缓存块是否在缓存中被修改。如果脏位未设置,则缓存块为“干净的”,写失效不必将块写入内存。
优点是写入速度可以达到缓存的速度,如果在同一块内进行写操作,则只需要向主内存写入一次(当替换前一个块时)。缺点是该协议难以实现,主内存可能与缓存不一致(未同步),读取导致替换的情况可能会导致脏块写入主内存。
关于“写失效”的策略详见我的第一个链接。
这些协议并不考虑多处理器和多缓存的情况,而这在现代处理器中很常见。为此,需要更复杂的“缓存一致性”机制。写穿透缓存具有更简单的协议,因为对缓存的写操作会立即反映在内存中。
好的资源:

2

写回(Write-Back)是一种更复杂的方式,需要使用复杂的缓存一致性协议(MOESI),但它值得这样做,因为它使系统更快速和高效。

写直通(Write-Through)的唯一好处是它使实现非常简单,并且不需要复杂的缓存一致性协议。


3
WT仍然需要一个相关性协议。来自一个核心的存储仍然需要使其他缓存中的副本失效,以便它们不会无限期地读取陈旧的数据。原子RMW需要一些特殊的支持。我认为使用WT所有这些都更容易,但所需的协同性仍然有些复杂。 - Peter Cordes
或许你在谈论一个单核系统,它具有L1/L2(或者更多)的缓存层次结构。在这种情况下,你不需要为通过外部缓存获取的内部缓存使用MESI/MOESI,除非你想支持可以访问最外层缓存方向的高速缓存一致性DMA。但是,你仍然需要一致性来使DMA写入失效内部缓存。 - Peter Cordes
1
只有在需要支持多个缓存/处理器或像DMA这样影响内存的情况下,才需要缓存一致性协议。即使对于单处理器系统,写入速度也是写穿的优点。 - qwr
对于DMA,操作系统可以在I/O之后显式地刷新缓存。作为软件,它的效率较低。 - qwr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接