找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2646

积分

0

好友

342

主题
发表于 7 天前 | 查看: 28| 回复: 0

1. 写直达(Write Through)

图示说明

写直达策略数据流向示意图

工作流程

当CPU需要写入数据时,这种策略会同时更新Cache和内存,确保两者数据始终保持一致。它的核心流程可以概括为以下几个固定步骤:

  1. CPU发送写请求到Cache,请求中包含了目标地址和要写入的数据。
  2. Cache接收请求,并立即更新其内部对应地址的数据(至此,Cache端的写入完成)。
  3. Cache会同步地向内存发起一个写请求,传递相同的地址和数据。
  4. 内存接收请求并更新对应地址的数据,整个写操作才宣告完成。

具体例子

假设一个Cache块的大小为4字节,CPU要向地址0x1000写入数值5。整个过程可以拆解如下:

  • 步骤1:CPU向Cache发出写入指令,目标地址是0x1000,值为5
  • 步骤2:Cache立刻将自身0x1000位置的数据更新为5(Cache写入完成)。
  • 步骤3:Cache同步向内存发起写入,目标地址同样是0x1000,值也是5
  • 步骤4:内存将0x1000位置更新为5,整个写操作结束。

优缺点

  • 优点:数据一致性极高,内存中的数据永远是最新的;实现逻辑简单,不需要管理额外的状态位(比如脏位)。
  • 缺点:每一次写操作都必须访问一次相对缓慢的内存,这会严重拖累CPU的写入性能。这里有一个常见误区:写直达的核心瓶颈并不只是“写内存”,而是“双重写入”——先写Cache,再写内存,导致延迟累积。

2. 写回(Write Back)

图示说明

写回策略数据流向示意图

工作流程

与写直达不同,写回策略在CPU写入数据时,只更新Cache,并不立即更新内存。数据何时写回内存呢?答案是:只有当这个Cache块因为空间不足需要被替换出去时,系统才会检查是否需要将它写回。这需要配合一个叫做“脏位(dirty bit)”的机制来管理:

  1. CPU发送写请求到Cache,写入目标地址和数据。
  2. Cache更新对应地址的数据,同时将这个Cache块的“脏位”设置为1
    • 脏位 = 1:表示Cache中的数据已经被修改,与内存中的版本不一致,未来需要写回。
    • 脏位 = 0:表示Cache数据与内存一致,是“干净”的,无需写回。
  3. 当这个Cache块需要被新的主存块替换时,系统会检查其脏位:
    • 如果脏位为1:先将这个Cache块里所有的数据写回对应的内存地址,然后再用新块替换它,并将新块的脏位置为0
    • 如果脏位为0:直接使用新块替换旧块,无需任何内存访问。

具体例子

同样假设Cache块大小为4字节,我们观察CPU多次写入同一块数据时脏位的变化:

  • 初始状态:Cache块0是干净的(脏位=0,Cache与内存数据一致)。
  • 步骤1:CPU写入地址0x1000,值为5
    • Cache更新0x1000位置为5
    • 将该块的脏位设为1(标记为已修改)。
  • 步骤2:CPU写入同一块内的另一个地址0x1004,值为10
    • Cache更新0x1004位置为10
    • 脏位仍然保持为1(只要这个块被修改过一次,它就是脏的,无需重复设置)。
  • 步骤3:系统需要装入新数据,必须替换这个Cache块。
    • 检查发现脏位=1,于是先将该块的所有有效数据(0x1000=50x1004=10)一次性写回内存。
    • 写回完成后,再用新块替换它,并将新块的脏位初始化为0

优缺点

  • 优点:能大幅减少对内存的访问次数。对于频繁写入同一Cache块的操作,只在最后替换时访问一次内存,写性能远高于写直达。因此,它成为现代CPU Cache的主流写策略。
  • 缺点:需要额外管理“脏位”,实现复杂度中等;内存中的数据可能不是最新的(在Cache块被替换前,两者不一致),在多核处理器等场景下需要配合缓存一致性协议来保证数据正确性。

3. 标记法(Tagging Method)

图示说明

标记法有效位管理示意图

工作流程

这种方法通过一个“有效位(valid bit)”来标记Cache数据的有效性。写入操作会优先保证内存数据最新,然后使Cache数据失效;读取时则根据有效位决定数据来源:

  1. 当数据首次被加载进Cache时,该块的“有效位”被设置为1(表示Cache中的数据是有效的,可以读取)。
  2. CPU需要修改数据时:
    • 先将修改后的数据写入内存(确保内存拥有最新版本)。
    • 然后将Cache中对应块的有效位设置为0(标记该Cache数据已失效,不可读取)。
  3. CPU读取数据时,会检查有效位:
    • 如果有效位为1:直接从Cache读取(快速命中)。
    • 如果有效位为0:则从内存读取最新数据,同时将内存数据重新加载到Cache中,并将该块的有效位重置为1

具体例子

假设Cache块大小为4字节,我们关注有效位的变化:

  • 初始状态:数据已存在于Cache中,有效位=1(Cache数据有效)。
  • 步骤1:CPU读取地址0x1000
    • 检查有效位=1,于是直接从Cache读取到值5(快速命中)。
  • 步骤2:CPU写入地址0x1000,值为10
    • 将数据10写入内存的0x1000位置(优先更新内存)。
    • 将Cache中该块的有效位置为0(标记其失效)。
  • 步骤3:CPU再次读取地址0x1000
    • 检查有效位=0,于是转向内存读取,得到最新值10
    • 同时,将内存中的这个值10重新加载到Cache,并将有效位重置为1

优缺点

  • 优点:实现相对简单,不需要管理脏位,仅通过有效位控制;能确保数据的一致性(因为写入时总是优先更新内存)。
  • 缺点:每次修改数据都必须访问内存,写性能属于中等水平;当读取发现Cache失效时,需要重新从内存加载数据到Cache,会引入额外的延迟。

三种写策略对比表

特性 写直达 写回 标记法
写入速度 慢(每次写都需访问内存) 快(通常只写Cache) 中等(需写内存+标记失效)
数据一致性 高(始终一致) 中等(依赖脏位管理,替换时才同步) 高(内存始终最新)
实现复杂度 简单 中等 简单
典型适用场景 对一致性要求极高的小型系统或特定硬件 追求高性能的通用处理器、服务器 对一致性有要求且实现受限的通用系统



上一篇:从ERP到本体论:为什么Palantir的决策系统在中国水土不服?
下一篇:千万QPS下的流量镜像演进:从全量到分层、一致性智能抽样
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:43 , Processed in 0.725006 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表