回写与直写

Naf*_*aly 77 caching cpu-architecture cpu-cache

我的理解是两种方法的主要区别在于,在"直写"方法中,数据立即通过高速缓存写入主存,而在"回写"数据则是在"后期"写入.

我们还需要在"后期"等待内存,那么"直写"的好处是什么?

Cra*_*son 89

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

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

此外,直写可以简化缓存一致性协议,因为它不需要修改状态." 修改"状态记录缓存必须在缓存行无效或逐出之前写回缓存行.在直写中,由于内存已经具有该行的最新副本,因此无需回写就可以使高速缓存行无效.

还有一件事 - 在写回内存映射I/O寄存器的回写体系结构软件上,必须采取额外步骤以确保立即从缓存中发送写入.否则写入在核心外部不可见,直到另一个处理器读取该行或该行被驱逐.

  • 对于内存映射I/O,这些地址通常映射为未缓存.直写也可用于提高可靠性(例如,如果L1仅具有奇偶校验保护且L2具有ECC).对于使用无写分配的较小缓存(即,写入未命中不会将块分配给缓存,可能减少对L1容量和L2读取/ L1填充带宽的需求),写入也更受欢迎,因为大部分硬件写入的要求已经存在于此类写入中. (7认同)
  • 回写更复杂可能会产生误导,因为处理器必须阻止主存储器回复读取请求.此外,缓存通过使用"脏位"跟踪数据是什么数据(未与主存储器对齐)以及什么不是,因此可以根本不检查主存储器. (4认同)

She*_*hao 24

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

直写:对缓存和后备存储同步进行写入。

回写(或写后):仅对缓存进行写入。修改后的缓存块在被替换之前被写回存储。

直写:数据更新时,会同时写入缓存和后端存储。这种方式操作方便,但写入数据较慢,因为数据必须同时写入缓存和存储。

回写:数据更新时,只写入缓存。只有当数据从缓存中移除时,修改后的数据才会写入后端存储。这种模式的数据写入速度快,但如果在更新的数据写入存储之前发生断电,数据将丢失。

  • @gustafbstrom 如果你断电并且缓存上没有备用电池,回写是一种更危险的方法。问题是直写也可能会丢失数据。我认为最安全的方法是关闭所有写入缓存并仅使用读取缓存。 (3认同)
  • 我不明白最后一句话的解释。在电源故障时,无论是直写还是回写,DRAM 也会丢失数据,因此这不应该是回写特有的问题。 (2认同)
  • @gustafbstrom 并非所有内存都是 DRAM。 (2认同)
  • @gustafbstrom我认为这个解释是从内存/磁盘而不是缓存/内存的角度来看的。然而,概念是相同的。 (2认同)

qwr*_*qwr 7

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

Write-through:将信息写入缓存和内存,当两者都写完时,写完成。这样做的优点是实现更简单,并且主内存始终与缓存一致(同步)(对于单处理器情况 - 如果其他设备修改主内存,则此策略是不够的),以及读取未命中永远不会导致写入主内存。明显的缺点是每次写入命中都必须进行两次写入,其中一次访问较慢的主内存。

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

优点是写入可以以缓存的速度发生,如果在同一块内写入,则只需要向主内存写入一次(当前一个块被替换时)。缺点是该协议更难实现,主存可能与缓存不一致(不同步),导致替换的读取可能会导致向主存写入脏块。

我的第一个链接中详细介绍了写入未命中的策略。

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

好资源:


小智 6

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

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

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

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

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

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

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