回写与直写式缓存?


93

我的理解是,这两种方法之间的主要区别在于,在“直写”方法中,数据会立即通过高速缓存写入主内存,而在“写回”中,数据是在“较后的时间”内写入的。

我们仍然需要在“延迟时间内”等待内存,因此“直写”的好处是什么?


@EricWang我想你的意思是write back表现更好?
wlnirvana

@wlnirvana是的,您是对的,这是我的笔误。我将其删除,并在此处添加新注释以避免将来产生误导。
Eric Wang

6
简而言之,它write back具有更好的性能,因为写入主内存的速度比写入cpu缓存的速度慢得多,并且数据在写入过程中可能很短(意味着可以更快地再次更改,而无需将旧版本放入内存中)。它很复杂,但是更为复杂,现代cpu中的大多数内存都使用此策略。
Eric Wang

我看到已经给出了解释性的答案。我建议您在介绍回写算法后再查看Write-Allocate,Write-NoAllocate标签。
恰拉扬DÖKME

您的问题的答案是通过直写缓存,当在同一块中进行写入时,只需要对主存储器进行一次写入。有关详细信息,请参见我的答案。
qwr

Answers:


110

直写到主内存的好处是它简化了计算机系统的设计。通过直写,主存储器始终具有该行的最新副本。因此,读取完成后,主存储器始终可以使用请求的数据进行回复。

如果使用回写,则最新数据有时在处理器缓存中,有时在主内存中。如果数据在处理器缓存中,则该处理器必须停止主内存回复读请求,因为主内存可能具有该数据的陈旧副本。这比直写更为复杂。

同样,直写可以简化缓存一致性协议,因为它不需要Modify状态。在修改状态记录,它无效或驱逐前行的高速缓存必须写回的高速缓存行。在直写中,由于内存已经具有该行的最新副本,因此始终可以使高速缓存行无效而无需回写。

还有一件事-在写回内存映射的I / O寄存器的写回体系结构软件上,必须采取额外的步骤来确保立即将写操作发送出缓存。否则,直到内核被另一处理器读取或驱逐该行之前,在内核外部看不到写入。


7
对于内存映射的I / O,这些地址通常映射为未缓存的。直写也可以用于提高可靠性(例如,如果L1仅具有奇偶校验保护,而L2具有ECC)。对于大多数不使用写分配的高速缓存,直写也更受欢迎(即,写未命中不会将块分配给高速缓存,这可能会降低对L1容量和L2读/ L1填充带宽的需求)对于这种写操作已经存在直写的要求。
保罗·克莱顿

1
是否可以检查我核心中的缓存方法是回写还是直写?
人工智能

4
说回写更为复杂可能是一种误导,因为处理器必须停止主存储器来回复读请求。此外,通过使用“脏位”,缓存可以跟踪哪些数据是数据(不与主内存对齐)和什么不是数据,因此有可能根本不检查主内存。
steviejay

@Shaowu“ lshw”命令显示诸如“异步内部回写”之类的缓存功能
mug896

我仍然不了解回写中使用的真正步骤是什么,但是只知道它很复杂...您能提供更多的资源/细节吗?
Combinatorics Guy

10

让我们借助一个示例来看看。假设我们有一个直接映射的缓存,并且使用了回写策略。因此,我们在缓存行中有一个有效位,一个脏位,一个标记和一个数据字段。假设我们有一个操作:写A(其中A映射到缓存的第一行)。

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

脏位只是表明自从上次将其放入高速缓存以来,是否曾经写入过高速缓存行!

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

由于我们具有直接映射的缓存,因此第一行可以简单地由将从内存中带出的E块替换。但是由于最后写入该行的块(块A)尚未写入内存(由脏位指示),因此缓存控制器将首先发出回写操作向存储器以将块A传输到内存,通过向存储器发出读取操作,它将用块E替换该行。脏位现在设置为0。

因此,回写策略不能保证该块在内存及其关联的高速缓存行中是相同的。但是,每当要替换该行时,都会首先执行回写操作。

直写策略正好相反。据此,存储器将始终具有最新数据。即,如果写入了高速缓存块,则存储器也将被相应地写入。(不使用脏位)


7

也许这篇文章可以帮助您链接到这里

直写:向缓存和后备存储同步写入。

回写(或后写):仅写到高速缓存。修改后的缓存块将在替换之前写回到存储中。

直写:更新数据时,会将其同时写入高速缓存和后端存储。此模式易于操作,但数据写入速度较慢,因为必须同时将数据写入高速缓存和存储器。

回写:更新数据时,仅将其写入高速缓存。仅当从缓存中删除数据时,修改后的数据才会写入后端存储。此模式具有快速的数据写入速度,但是如果在将更新的数据写入存储设备之前发生电源故障,数据将丢失。


3

回写和直写描述写命中时的策略发生时(即,缓存具有请求的信息时)的策略。在这些示例中,我们假设单个处理器正在使用高速缓存写入主内存。

直写:信息被写入高速缓存和内存,并且写完后两者都写完。这具有易于实现的优势,并且主内存始终与缓存保持一致(同步)(对于单处理器情况-如果某些其他设备修改了主内存,则该策略是不够的),并且读取未命中永远不会导致对主存储器的写入。明显的缺点是每个写入命中都必须执行两次写入,其中之一访问速度较慢的主内存。

回写:将信息写到缓存中的块中。修改后的缓存块仅在被替换时才写入内存(实际上是惰性写入)。每个高速缓存块的特殊位,即脏位,用于标记高速缓存块在高速缓存中时是否已被修改。如果未设置脏位,则高速缓存块为“干净”,并且写入未必不必将块写入内存。

优点是写操作可以高速缓存的速度进行,并且如果在同一块中进行写操作,则只需要对主存储器进行一次写操作(当替换前一个块时)。缺点是该协议难以实施,主内存可能与高速缓存不一致(不同步),导致替换的读取操作可能导致将脏块写入主内存。

我的第一个链接中详细介绍了写丢失的策略。

这些协议无法像现代处理器那样处理具有多个处理器和多个缓存的情况。为此,需要更复杂的缓存一致性机制。直写式缓存具有更简单的协议,因为对缓存的写入会立即反映在内存中。

好的资源:


0

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

直写的唯一好处是,它使实现极其简单,并且不需要复杂的缓存一致性协议。


1
WT仍需要一个一致性协议。来自一个核心的存储仍然需要使其他缓存中的副本无效,因此它们不会继续无限期地读取陈旧的数据。原子RMW需要一些特殊的支持。我认为,使用WT可以轻松完成所有这些工作,但是所需的一致性仍然有些复杂。
彼得·科德斯

也许您正在谈论的是具有L1 / L2(甚至更多)的缓存层次结构的单核系统。在那种情况下,除非您要支持可以访问最外部缓存方向的缓存一致性DMA,否则您实际上不必对通过外部缓存获取的内部缓存使用MESI / MOESI。但是,对于DMA写入,您仍然需要一致性,以使内部缓存无效。
彼得·科德斯

1
仅当需要支持多个缓存/处理器或某些影响内存(如DMA)的内容时才需要缓存一致性协议。即使对于单处理器系统,直写也有其优势,即写速度。
qwr

对于DMA,操作系统可以在I / O之后显式刷新缓存。作为软件,效率较低。
qwr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.