我的理解是,这两种方法之间的主要区别在于,在“直写”方法中,数据会立即通过高速缓存写入主内存,而在“写回”中,数据是在“较后的时间”内写入的。
我们仍然需要在“延迟时间内”等待内存,因此“直写”的好处是什么?
我的理解是,这两种方法之间的主要区别在于,在“直写”方法中,数据会立即通过高速缓存写入主内存,而在“写回”中,数据是在“较后的时间”内写入的。
我们仍然需要在“延迟时间内”等待内存,因此“直写”的好处是什么?
write back
具有更好的性能,因为写入主内存的速度比写入cpu缓存的速度慢得多,并且数据在写入过程中可能很短(意味着可以更快地再次更改,而无需将旧版本放入内存中)。它很复杂,但是更为复杂,现代cpu中的大多数内存都使用此策略。
Answers:
直写到主内存的好处是它简化了计算机系统的设计。通过直写,主存储器始终具有该行的最新副本。因此,读取完成后,主存储器始终可以使用请求的数据进行回复。
如果使用回写,则最新数据有时在处理器缓存中,有时在主内存中。如果数据在处理器缓存中,则该处理器必须停止主内存回复读请求,因为主内存可能具有该数据的陈旧副本。这比直写更为复杂。
同样,直写可以简化缓存一致性协议,因为它不需要Modify状态。在修改状态记录,它无效或驱逐前行的高速缓存必须写回的高速缓存行。在直写中,由于内存已经具有该行的最新副本,因此始终可以使高速缓存行无效而无需回写。
还有一件事-在写回内存映射的I / O寄存器的写回体系结构软件上,必须采取额外的步骤来确保立即将写操作发送出缓存。否则,直到内核被另一处理器读取或驱逐该行之前,在内核外部看不到写入。
让我们借助一个示例来看看。假设我们有一个直接映射的缓存,并且使用了回写策略。因此,我们在缓存行中有一个有效位,一个脏位,一个标记和一个数据字段。假设我们有一个操作:写A(其中A映射到缓存的第一行)。
发生的是来自处理器的数据(A)被写入高速缓存的第一行。有效位和标签位被置位。脏位设置为1。
脏位只是表明自从上次将其放入高速缓存以来,是否曾经写入过高速缓存行!
现在假设执行了另一个操作:读取E(其中E也映射到第一条高速缓存行)
由于我们具有直接映射的缓存,因此第一行可以简单地由将从内存中带出的E块替换。但是由于最后写入该行的块(块A)尚未写入内存(由脏位指示),因此缓存控制器将首先发出回写操作向存储器以将块A传输到内存,通过向存储器发出读取操作,它将用块E替换该行。脏位现在设置为0。
因此,回写策略不能保证该块在内存及其关联的高速缓存行中是相同的。但是,每当要替换该行时,都会首先执行回写操作。
直写策略正好相反。据此,存储器将始终具有最新数据。即,如果写入了高速缓存块,则存储器也将被相应地写入。(不使用脏位)
回写和直写描述写命中时的策略发生时(即,缓存具有请求的信息时)的策略。在这些示例中,我们假设单个处理器正在使用高速缓存写入主内存。
直写:信息被写入高速缓存和内存,并且写完后两者都写完。这具有易于实现的优势,并且主内存始终与缓存保持一致(同步)(对于单处理器情况-如果某些其他设备修改了主内存,则该策略是不够的),并且读取未命中永远不会导致对主存储器的写入。明显的缺点是每个写入命中都必须执行两次写入,其中之一访问速度较慢的主内存。
回写:将信息写到缓存中的块中。修改后的缓存块仅在被替换时才写入内存(实际上是惰性写入)。每个高速缓存块的特殊位,即脏位,用于标记高速缓存块在高速缓存中时是否已被修改。如果未设置脏位,则高速缓存块为“干净”,并且写入未必不必将块写入内存。
优点是写操作可以高速缓存的速度进行,并且如果在同一块中进行写操作,则只需要对主存储器进行一次写操作(当替换前一个块时)。缺点是该协议难以实施,主内存可能与高速缓存不一致(不同步),导致替换的读取操作可能导致将脏块写入主内存。
我的第一个链接中详细介绍了写丢失的策略。
这些协议无法像现代处理器那样处理具有多个处理器和多个缓存的情况。为此,需要更复杂的缓存一致性机制。直写式缓存具有更简单的协议,因为对缓存的写入会立即反映在内存中。
好的资源:
回写是一种更复杂的方法,需要复杂的缓存一致性协议(MOESI),但值得这样做,因为它可以使系统快速高效。
直写的唯一好处是,它使实现极其简单,并且不需要复杂的缓存一致性协议。
write back
表现更好?