Memory Systems_ Cache, DRAM, Disk (2010)-学习笔记4-What to Cache, Where to Put It, and How to Maintain It

What to Cache, Where to Put It, and How to Maintain It

​ What to Cache(缓存什么)、Where to Put It(缓存在哪里)、How to Maintain It(如何维护缓存)

  1. 决定缓存中放什么(What to cache)
    即选择哪些数据应该存入缓存。这一决策可以由程序员、编译器、运行中的应用程序、操作系统,或者缓存硬件本身,通过静态或动态的方法来做出。
  2. 内容管理启发式方法(Content-management heuristic)
    管理缓存数据的策略,比如什么时候加载数据、什么时候替换数据等。这个策略的执行者也可以是上述任何一方。
  3. 缓存的物理和逻辑存储方式(Logical organization)
    指缓存内部如何布局数据,包括物理空间和逻辑结构上的组织形式。
  4. 缓存一致性维护机制(Consistency management)
    保证缓存中的数据和主存储中的数据保持一致。这一机制可以由应用程序、操作系统或缓存硬件共同完成。
  5. 组合的灵活性
    缓存设计允许将任何逻辑组织与任何管理策略组合使用,设计灵活。

image

1.3.1 Logical Organization Basics: Blocks, Tags, Sets

​ 缓存会存储来自主存(backing store,例如主内存或硬盘)的一段数据,这些数据块叫做 缓存块(cache block)缓存行(cache line)。由于这种按块组织的方式,我们会把主存逻辑上划分为若干个与缓存块大小一致的部分,这样做的一个好处是,我们可以用一种简单有效的方式来标识每一个块块 ID(block ID)

​ Cache结构:

​ 整体存储结构,分为多个 Set(集合)。

Cache
├── Set[0]
│   ├── Block 0
│   │   ├── Valid bit
│   │   ├── Tag
│   │   └── Data (Cache block)
│   └── Block 1
│       ├── Valid bit
│       ├── Tag
│       └── Data (Cache block)
│       ...
├── Set[1]
│   ├── Block 0
│   ├── Block 1
│   ...
└── Set[n-1]

​ 一个缓存条目(cache entry,也叫 cache line)通常包括三个主要部分,条目的实现形式可以多种多样,比如硬件里的 SRAM 数组,也可以是软件中的二叉树,甚至是链表:

字段 作用
Tag(标签) 用来标识该条目存储的是主存的哪个块(由 block ID 提供)
Status(状态) 标记该缓存条目是否有效、是否被修改(Valid、Dirty 等)
Data(数据) 缓存的数据块内容,通常是一整块数据(比如 16B、64B)

image

cpu会生成内存地址,当我们数据时(比如内存地址为 0xABCDEF10),该地址会被拆分成两个部分:

image

image

字段名 位数(示例) 位范围(从高位到低位) 作用说明
Tag 28-n位 31 – 3-n 用于唯一标识内存块(块ID的一部分),用来和缓存块中的Tag比对,判断缓存是否命中
Index (Set ID) n 位 3+n - 3 用来确定数据块所属的缓存组(set),快速定位缓存组
Block Offset 4 位 3 – 0 块内字节偏移,用来定位缓存块中具体的字节

​ 如果缓存的大小只有一个块(block),那么它的组织结构是很明显的:新数据会直接放入这个唯一的缓存块中,替换之前存储的数据。但是,一旦缓存有多个块,其组织结构就变成了一个问题:第二个块应该放在哪里?对应特定块ID的数据只能出现在缓存中的一个条目里,但我们可以灵活选择这个条目的位置。我们用图中的纵向和横向维度来表示一组等价类;每一行就是一个等价类,称为“缓存组”(cache set)。一个特定数据块所属的唯一缓存组,通常是由块ID的一部分位来决定的,如图1.6所示。

确定了缓存组之后,这个数据块可以被放在该组内的任何一个块中。

根据这种等价类机制,缓存组织基本有三种类型:

  • 直接映射缓存(Direct-Mapped Cache):每个缓存组只有一个块,因此每个块自己就是一个等价类。
  • 全相联缓存(Fully Associative Cache):整个缓存只有一个组,所有块都属于同一个等价类(又称内容可寻址存储器)。
  • 组相联缓存(Set-Associative Cache):介于两者之间,有多个缓存组(如果只有一个组,就是全相联缓存),且每组中有多个块(如果每组只有一个块,就是直接映射缓存)。

1.3.2 Content Management: To Cache or Not to Cache

​ 从上一小节的信息可以得出cpu访问cache的流程

+---------------------+
| CPU发出内存访问请求  |
+----------+----------+
           |
           v
+----------------------------+
| 从内存地址解析出:           |
| - Block ID(块ID)          |
| - Set Index(组索引,若有) |
| - Byte Offset(块内偏移)   |
+------------+---------------+
             |
             v
+----------------------------+
| 根据 Set Index 定位缓存组   |
| (直接映射只有一个块,      |
| 组相联多个块,               |
| 全相联是整个缓存作为一个组) |
+------------+---------------+
             |
             v
+----------------------------+
| 在该组内搜索匹配的 Tag      |
| (即对应的块ID)            |
+------------+---------------+
             |
        +----+----+
        |         |
    命中(Hit)  未命中(Miss)
        |         |
        v         v
+-------------+  +--------------------+
| 取出数据    |  | 从主存读取对应块数据 |
| (根据Byte  |  | 将数据放入缓存       |
| Offset定位)|  | 替换缓存中旧块       |
+------+------+-+--------------------+
       |      |
       v      v
+-----------------+
| 返回数据给CPU    |
+-----------------+

posted @ 2025-07-26 23:02  xyh0703  阅读(33)  评论(0)    收藏  举报