# 计算机体系架构概述

经典的计算机体系结构基于冯·诺依曼架构,其核心组成部分包括:输入设备、输出设备、以及由控制器、运算器和存储器构成的核心处理单元。

# 存储器的基本分类与参数

存储器可根据其特性分为两大类:

  • 半导体存储器
    • ROM(只读存储器):仅可读取数据。
    • RAM(随机访问存储器):允许随机读写,其访问时间与数据位置无关。
  • 顺序访问存储器:访问数据时需按顺序进行。

衡量存储器性能的关键参数包括:

  • 容量:以字节(Byte)或比特(bit)为单位。
  • 速度
    • 访问时间:从发出读请求到数据输出所需的时间。
    • 存储周期:连续两次启动存储器访问所需的最小时间间隔。
    • 带宽:单位时间内读取或写入的数据量。

# 半导体 RAM 的分类与比较

特性 SRAM (静态随机访问存储器) DRAM (动态随机访问存储器)
结构 6个晶体管(6T),利用反相器正反馈保持电平。 1个晶体管和1个电容(1T1C),利用电容存储电荷。
速度 访问延时小,速度快。 访问延时大,速度相对较慢。
密度 存储密度小。 存储密度大。
成本 造价昂贵。 相对廉价。
数据保持 可稳定保持电平,无需刷新。 依赖电容电荷,需频繁刷新以防止数据丢失。
典型应用 常用作缓存(Cache) 常用作主存(Main Memory)

# 存储器开销与层次化设计

存储器访问的开销(延时)因类型不同而差异巨大,呈现明显的层级结构:

  • 寄存器:< 1ns
  • SRAM 缓存:1-10ns
  • DRAM 主存:10-100ns
  • 外部存储(固态硬盘):0.1-1ms
  • 外部存储(机械硬盘):9-10ms
  • 外部存储(光盘/磁带):80-120ms

为了优化访问延时,现代计算机系统采用层次化存储器设计

  • 设计理论:该设计基于局部性原理,即程序在运行时倾向于访问近期或临近位置的数据。
    • 时间局部性:近期访问过的数据很可能再次被访问。
    • 空间局部性:如果访问了某个位置,其附近的数据也很可能被访问。
  • 结构:典型的层次化存储器结构由缓存、主存和外部存储构成,速度从快到慢,容量从小到大。
  • 性能分析
    • 缓存命中:请求的数据在缓存中找到。
    • 缓存缺失:请求的数据不在缓存中。
    • 命中率 (HH):命中次数占总访问次数的比例。
    • 平均访问时间 (TAT_A)TA=TA1+(1H)TA2T_A = T_{A1} + (1-H)T_{A2}
    • 访问时间比 (rr)r=TA2/TA1r = T_{A2} / T_{A1}
    • 访问效率 (ee)e=TA1/TA=1/(1+(1H)r)e = T_{A1}/T_A = 1 / (1 + (1-H)r)
      • 其中,TA1T_{A1} 是缓存访问时间,TA2T_{A2} 是下一层存储器访问时间。

# 缓存(Cache)

缓存是位于处理器和主存之间的高速存储器,具有以下特点:

  • 容量小,速度快
  • 主要用于临时存放一部分主存数据,并对程序员透明
  • 通常与处理器集成在同一芯片上(就近集成)。
  • 通常分为数据缓存指令缓存

# 缓存的基本结构与地址映像

# 存储格式

  • 主存:以为单位进行组织。主存地址由主存块号块内地址组成。
  • 缓存:以缓存行为单位进行组织。缓存地址由缓存行号行内地址组成。
    • 数据:缓存行用于存放主存块的数据。
    • 标签(Tag):用于标识该行数据来自主存的哪个块。
    • 有效位(Valid Bit):指示该行数据是否有效。

# 地址映像方式

缓存地址映像是将主存地址映射到缓存地址的方式,主要有三种:

  1. 直接映像(Direct Mapped)

    • 地址格式标签 + 行索引 + 行内地址
    • 优点:硬件实现简单。
    • 缺点:命中率和空间利用率较低,特别容易因地址冲突导致频繁的缓存缺失。
  2. 全相联映像(Fully Associative)

    • 地址格式标签 + 行内地址
    • 优点:命中率和空间利用率高。
    • 缺点:需要并行比较所有标签,硬件实现最复杂
  3. 组相联映像(Set Associative)

    • 地址格式标签 + 组号 + 行内地址
    • 原理:是直接映像和全相联映像的折中方案。全相联可以看作是所有行在同一组,而直接映像可以看作是每一行为一个组。
    • 地址计算
      • 设主存容量为 MM,缓存容量为 CC,缓存行大小/主存块大小为 BBN 路组相联。
      • 组数 = C/B/NC/B/N
      • 行内地址位数log2B\log_2B
      • 组号位数log2(C/B/N)\log_2(C/B/N)
      • 标签位数log2Mlog2Blog2(C/B/N)\log_2M - \log_2B - \log_2(C/B/N)

# 缓存基本机构与数据管理

缓存由以下核心机构构成:

  • 地址映像变换机构:根据主存地址的标签和组号,判断是否命中、缓存是否已满以及应存入哪个缓存行。
  • 缓存存储体:根据缓存行号和行内地址返回数据。
  • 缓存替换机构:当缓存缺失且缓存已满时,决定替换哪一行数据。

# 数据管理策略

  • 缓存替换:主要针对组相联和全相联映像。常用的替换算法包括随机法、先进先出法(FIFO)和最近最少使用法(LRU)
  • 数据更新:当处理器写入数据时,需要决定如何同步缓存和主存。
    • 写通过(Write-Through):同时写入缓存和主存。通常使用写缓冲区来减少CPU等待时间。
    • 写回(Write-Back):先只写入缓存,并设置一个脏位(Dirty Bit) 标记该行已被修改。当该缓存行需要被替换时,才将其写回主存。

# 缓存性能评估

# CPU 性能与缓存

CPU 性能方程通常用于评估 CPU 的整体性能。它将 CPU 执行时间分解为多个组成部分,并引入了缓存的影响:

  • CPU 执行时间 = 指令数 × CPI × 时钟周期

    • CPI(每个指令的平均时钟周期数):可以进一步细分为 理想 CPI存储器阻塞周期数。这意味着除了执行指令本身所需的时间,我们还必须考虑由于等待内存访问而产生的额外延迟。
  • 平均内存访问时间(AMAT):是评估缓存性能的关键指标。它将缓存访问分为两种情况:

    • AMAT = 命中访问时间 + 缺失率 × 缺失代价

    通常,CPU 正常执行周期的一部分被认为是缓存命中时的访问开销。

# CPU 时间的计算

为了更精确地计算 CPU 时间,需要将存储器延迟单独考虑:

  • CPU 时间 = (CPU 执行时钟数 + 存储器停顿时钟周期数)× 时钟周期

    • 存储器停顿时钟周期数 是由于缓存缺失导致的等待时间,它等于 访问次数 × 缺失率 × 缺失损失。这个总的停顿时间可以进一步细分为读操作和写操作的停顿:
      • 存储器停顿时钟周期数 = 读停顿时钟周期数 + 写停顿时钟周期数
      • 读停顿时钟周期数 = 读次数 × 读缺失率 × 读缺失损失
      • 写操作的停顿周期数取决于采用的写策略:
        • 写通过策略:写次数 × 写缺失率 × 写缺失损失 + 写缓冲区停顿周期数
        • 写回策略:写次数 × 写缺失率 × 写缺失损失 + 替换操作停顿周期数

# 缓存缺失的 3C 原则

缓存缺失(Cache Miss)可以归类为三种基本类型,即著名的 3C 原则

  • 强制性缺失(Compulsory Miss)

    • 也称为冷启动缺失或首次访问失效。
    • 指程序首次访问主存储器中的某个数据块时,该数据块尚不存在于缓存中,必须从主存加载到缓存而引起的缺失。
  • 容量缺失(Capacity Miss)

    • 当工作集(程序所需的所有数据块)的大小超过缓存容量时,缓存无法容纳所有所需的数据块,导致部分数据块被逐出,当再次需要时引发的缺失。
  • 冲突缺失(Conflict Miss)

    • 也称为碰撞缺失。
    • 当多个主存块在组相联直接映射缓存中竞争同一个缓存组时,尽管缓存可能还有空余空间,但由于映射限制,部分数据块必须被逐出,再次访问时引起的缺失。这通常发生在缓存未满但数据块之间存在竞争的情况下。

# 缓存设计对缺失类型的影响

不同的地址映像方式对缓存缺失类型有不同的影响:

  • 全相联:只有强制性缺失和容量缺失。由于数据块可以映射到缓存中的任意位置,因此不存在冲突缺失。在这种设计中,容量缺失是主导因素。
  • 直接映射与组相联:这两种方式都存在强制性缺失、冲突缺失和容量缺失。在它们的缺失类型中,冲突缺失通常是主导因素,因为多个主存块会竞争有限的缓存组。

# 缓存设计参数的影响

缓存的性能受多个设计参数的影响,这些参数的变化会影响到不同类型的缓存缺失以及命中时间:

  • 缓存容量

    • 增大容量:能够容纳更多数据,因此可以减少容量缺失和冲突缺失。但强制性缺失不受影响,因为这是首次访问引起的。同时,容量增大可能导致命中时间增加。
  • 缓存行大小

    • 增大行大小:一次可以加载更多数据,因此可以减少强制性缺失。然而,这会导致每行包含更多的数据,可能会加剧主存块间的竞争,从而增加冲突缺失和容量缺失。此外,命中时间会减小,因为每次缺失可以获取更多有用数据。
  • 缓存相联度

    • 增加相联度:允许更多的块映射到同一个组中,能有效减少冲突缺失。强制性缺失和容量缺失不受影响。相联度增加意味着需要更多的比较器,会增加硬件成本,并可能导致命中时间增加。

# 提高 CPU 性能的策略

优化缓存设计是提高 CPU 性能的重要途径:

  • 增加相联度:通过降低冲突缺失率来提升性能。但需要在缺失率降低带来的收益与比较器成本增加(导致命中时间增加)之间进行权衡。
  • 多级缓存:通过分层结构来优化性能。
    • 一级缓存(L1 Cache):通常容量较小,注重极低的命中时间,以跟上 CPU 的时钟速度。
    • 二级缓存(L2 Cache)及以上:通常容量更大,主要致力于降低缺失率,弥补 L1 缓存的容量限制。这种分层策略结合了两种缓存的优势,平衡了命中时间与缺失率。