我的理解是这两种方法的主要区别在于"直写"方法数据立即通过缓存写入主存储器,而在"回写"数据写在"后来的时间"。
我们仍然需要等待#34;后期"那么"直写"?
的好处是什么?答案 0 :(得分:72)
直写到主存储器的好处是它简化了计算机系统的设计。通过直写,主存储器始终具有该行的最新副本。因此,当读取完成后,主存储器始终可以使用请求的数据进行回复。
如果使用回写,有时最新数据位于处理器高速缓存中,有时它位于主存储器中。如果数据在处理器高速缓存中,则该处理器必须停止主存储器回复读取请求,因为主存储器可能具有数据的陈旧副本。这比直写更复杂。
此外,直写可以简化缓存一致性协议,因为它不需要修改状态。 修改状态记录缓存必须在缓存行无效或驱逐行之前写回缓存行。在直写中,无需回写就可以使高速缓存行无效,因为内存已经有了该行的最新副本。
还有一件事 - 在写回内存映射I / O寄存器的回写体系结构软件上,必须采取额外步骤以确保立即从缓存中发送写入。否则写入在核心外部不可见,直到另一个处理器读取该行或该行被驱逐为止。
答案 1 :(得分:4)
让我们借助一个例子来看看这个。 假设我们有一个直接映射的缓存,并使用了回写策略。因此,我们在高速缓存行中有一个有效位,一个脏位,一个标记和一个数据字段。 假设我们有一个操作:写A(其中A映射到缓存的第一行)。
发生的事情是来自处理器的数据(A)被写入缓存的第一行。有效位和标记位已设置。脏位设置为1.
脏位只表示自上次进入缓存以来是否写入了缓存行!
现在假设执行另一个操作:读取E(其中E也映射到第一个缓存行)
由于我们有直接映射的缓存,因此第一行可以简单地替换为将从内存中获取的E块。但由于最后写入行的块(块A)尚未写入内存(由脏位指示),因此缓存控制器将首先向内存发出回写以进行传输块A到存储器,然后它将通过对存储器发出读操作来替换块E的行。脏位现在设置为0.
因此,回写策略不保证块在内存及其关联的缓存行中是相同的。然而,每当要更换线路时,首先执行回写。
直写政策恰恰相反。据此,内存将始终具有最新数据。也就是说,如果写入高速缓存块,则也将相应地写入存储器。 (不使用脏位)
答案 2 :(得分:2)
也许本文可以为您link here
提供帮助直写:同时写入缓存和后备存储。
回写(或后写):仅写到高速缓存。修改后的缓存块将在替换之前写回到存储中。
直写式:更新数据时,会将其写入高速缓存和后端存储。此模式易于操作,但数据写入速度较慢,因为必须同时将数据写入缓存和存储。
回写:更新数据时,仅将其写入高速缓存。仅当从缓存中删除数据时,修改后的数据才写入后端存储。此模式具有较高的数据写入速度,但是如果在将更新的数据写入存储设备之前发生电源故障,数据将丢失。
答案 3 :(得分:2)
回写和直写描述发生写命中时(即,缓存具有请求的信息时)的策略。在这些示例中,我们假设单个处理器正在使用高速缓存写入主内存。
直写:信息将被写入高速缓存和内存,并且当两者都完成时,写入将完成。这具有易于实现的优势,并且主内存始终与缓存保持一致(同步)(对于单处理器情况-如果某些其他设备修改了主内存,则该策略是不够的),并且读取未命中永远不会导致对主存储器的写入。明显的缺点是每个写入命中都必须执行两次写入,其中之一访问速度较慢的主内存。
回写:该信息被写入高速缓存中的块。修改后的缓存块仅在被替换时才写入内存(实际上是 lazy write )。每个缓存块的一个特殊位,<脏污位,用于标记在缓存中是否已修改了缓存块。如果未设置脏位,则高速缓存块为“干净”,并且写入未命中不必将其写入内存。
优点是写操作可以高速缓存的速度进行,并且如果在同一块中进行写操作,则只需要对主存储器进行一次写操作(替换前一个块时)。缺点是该协议难以实现,主内存可能与缓存不一致(不同步),导致替换的读取操作可能导致将脏块写入主内存。
在我的第一个链接中详细介绍了写丢失的策略。
这些协议无法解决现代处理器中常见的具有多个处理器和多个缓存的情况。为此,需要更复杂的缓存一致性机制。直写式缓存具有更简单的协议,因为对缓存的写入会立即反映在内存中。
良好的资源:
答案 4 :(得分:1)
回写是一个更复杂的回写需要复杂的高速缓存一致性协议(MOESI),但它值得,因为它使系统快速有效。
Write-Through的唯一好处是它使得实现非常简单,并且不需要复杂的高速缓存一致性协议。