cache(五)Write-through,Write-back,Write-allocate,No-write-allocate
这张图总结了缓存系统中写操作策略的不同方法,主要讨论了在**写命中(write-hit)和写未命中(write-miss)**情况下应该采取的操作策略。
1. 多个数据副本的存在
缓存系统通常有多个级别,例如 L1 缓存、L2 缓存、主存 和 硬盘,每一层可能保存相同数据的副本。如何在不同级别之间保持数据一致性,尤其是写操作时,成为了一个重要问题。
2. 写命中时的策略(What to do on a write-hit?)
当写操作命中缓存中的数据时,有两种常见策略:
-
写直达(Write-through):
- 写操作直接更新缓存和内存中的数据。
- 这种方法确保缓存和主存始终保持同步,数据一致性较好。
- 但是,因为每次写操作都需要更新内存,可能会增加写操作的开销。
-
写回(Write-back):
- 写操作只更新缓存中的数据,推迟对内存的更新,直到该缓存行被替换时才写回内存。
- 这种方法减少了内存写操作的次数,提高了性能。
- 为了跟踪缓存数据是否被修改过,需要使用脏位(dirty bit),如果脏位为1,则表示缓存行中的数据和内存中的数据不一致,待替换时需要写回内存。
3. 写未命中时的策略(What to do on a write-miss?)
当写操作未命中缓存中的数据时,有两种常见策略:
-
写分配(Write-allocate):
- 发生写未命中时,将数据块从内存加载到缓存,并更新缓存中的数据。
- 适用于未来对同一位置的多次写操作,因为在首次写入后,后续的写操作可以直接命中缓存。
- 这种策略通常与写回策略配合使用。
-
非写分配(No-write-allocate):
- 写未命中时,直接写入内存,不加载数据块到缓存中。
- 适用于不会频繁写入的场景,可以避免不必要的数据加载。
- 这种策略通常与写直达策略配合使用。
4. 常见组合(Typical)
常见的写策略组合有以下两种:
-
写直达 + 非写分配(Write-through + No-write-allocate):
- 这种组合在写操作时直接更新内存,但不将未命中的数据块加载到缓存中。
- 适合少量写操作的场景,减少不必要的缓存加载。
-
写回 + 写分配(Write-back + Write-allocate):
- 这种组合在写操作时先更新缓存,延迟内存更新,未命中时将数据块加载到缓存。
- 适合频繁写操作的场景,提升缓存利用率,减少内存写操作。
总结
该图解释了在缓存系统中,针对写命中和写未命中不同的处理策略。选择合适的策略组合(如写直达 + 非写分配或写回 + 写分配)可以在保证数据一致性的同时优化缓存性能。