写回缓存 VS 写入式缓存?

我的理解是,这两种方法的主要区别在于,在“ write-through”方法中,数据是通过缓存立即写入主存的,而在“ write-back”方法中,数据是在“稍后时间”写入的。

我们仍然需要在“稍后时间”中等待内存,那么“ write-through”的好处是什么?

254833 次浏览

对主存写入的好处是它简化了计算机系统的设计。通过 write-through,主内存总是有该行的最新副本。因此,当读取完成时,主存始终可以用请求的数据进行响应。

如果使用写回,有时最新数据在处理器缓存中,有时在主存中。如果数据在处理器缓存中,那么该处理器必须停止主存对读请求的响应,因为主存可能有数据的过期副本。这比直写要复杂得多。

另外,写入可以简化缓存一致性协议,因为它不需要 修改状态。修改状态记录缓存必须回写缓存行,然后才能使该行无效或驱逐该行。在 write-through 缓存中,由于内存中已经有该行的最新副本,因此总是可以在不进行回写的情况下使该行失效。

还有一件事——对于写入内存映射 I/O 寄存器的写回体系结构软件,必须采取额外的步骤来确保写入操作立即从缓存中发送出去。否则,在另一个处理器读取该行或驱逐该行之前,写操作在核心外不可见。

写回是一个更复杂的协议,需要一个复杂的缓存一致性协议(MOESI) ,但它是值得的,因为它使系统快速有效。

Write-Through 的唯一好处是它使实现极其简单,不需要复杂的缓存一致性协议。

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

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

脏位仅仅表示自从最后一次将其带入缓存以来写入的缓存行!

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

由于我们有直接映射的缓存,第一行可以简单地替换为从内存中提取的 E 块。但是由于上一次写入行(块 A)的块还没有写入内存(由脏位表示) ,所以缓存控制器将首先向内存发出 回信,将块 A 转移到内存,然后通过对内存发出读操作,将行替换为块 E。脏位现在设置为0。

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

写通策略恰恰相反。根据这一点,内存将始终有一个最新的数据。也就是说,如果写入了缓存块,也将相应地写入内存。(不要使用脏东西)

希望这篇文章能对你有所帮助

通写(Write-through) : 对缓存和后台存储同步执行写操作。

Write-back (或 Write-behind) : 只对缓存执行写操作。修改后的缓存块在被替换之前被写回存储区。

直写(Write-through) : 更新数据时,将数据写入缓存和后端存储。这种模式操作简单,但数据写入速度较慢,因为数据必须写入缓存和存储。

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

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

Write-through: 信息被写入缓存和内存,写入完成时两者都已完成。这样做的好处是实现起来更简单,而且主存总是与缓存保持一致(同步)(对于单处理器情况——如果其他设备修改了主存,那么这个策略是不够的) ,而且读取错误从不会导致写入主存。显而易见的缺点是,每次写操作都必须执行两次写操作,其中一次需要访问较慢的主存。

回写: 信息被写入缓存中的一个块。修改后的缓存块只有在被替换时才写入内存(实际上是一个 懒惰的写作)。每个缓存块的特殊位 肮脏的勾当标记缓存块在缓存中是否已被修改。如果没有设置脏位,则缓存块是“干净的”,并且写错时不必将该块写入内存。

这样做的好处是可以以高速缓存的速度进行写操作,而且如果在同一块内进行写操作,那么只需要对主内存进行一次写操作(当前一块被替换时)。缺点是这个协议更难实现,主内存可能与缓存不一致(不同步) ,导致替换的读操作可能导致脏块写入主内存。

写小姐的政策详见我的第一个链接。

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

良好的资源: