# 计算机体系架构概述
经典的计算机体系结构基于冯·诺依曼架构,其核心组成部分包括:输入设备、输出设备、以及由控制器、运算器和存储器构成的核心处理单元。
# 存储器的基本分类与参数
存储器可根据其特性分为两大类:
- 半导体存储器:
- 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
为了优化访问延时,现代计算机系统采用层次化存储器设计。
- 设计理论:该设计基于局部性原理,即程序在运行时倾向于访问近期或临近位置的数据。
- 时间局部性:近期访问过的数据很可能再次被访问。
- 空间局部性:如果访问了某个位置,其附近的数据也很可能被访问。
- 结构:典型的层次化存储器结构由缓存、主存和外部存储构成,速度从快到慢,容量从小到大。
- 性能分析:
- 缓存命中:请求的数据在缓存中找到。
- 缓存缺失:请求的数据不在缓存中。
- 命中率 ():命中次数占总访问次数的比例。
- 平均访问时间 ():
- 访问时间比 ():
- 访问效率 ():
- 其中, 是缓存访问时间, 是下一层存储器访问时间。
# 缓存(Cache)
缓存是位于处理器和主存之间的高速存储器,具有以下特点:
- 容量小,速度快。
- 主要用于临时存放一部分主存数据,并对程序员透明。
- 通常与处理器集成在同一芯片上(就近集成)。
- 通常分为数据缓存和指令缓存。
# 缓存的基本结构与地址映像
# 存储格式
- 主存:以块为单位进行组织。主存地址由主存块号和块内地址组成。
- 缓存:以缓存行为单位进行组织。缓存地址由缓存行号和行内地址组成。
- 数据:缓存行用于存放主存块的数据。
- 标签(Tag):用于标识该行数据来自主存的哪个块。
- 有效位(Valid Bit):指示该行数据是否有效。
# 地址映像方式
缓存地址映像是将主存地址映射到缓存地址的方式,主要有三种:
-
直接映像(Direct Mapped)
- 地址格式:标签 + 行索引 + 行内地址。
- 优点:硬件实现简单。
- 缺点:命中率和空间利用率较低,特别容易因地址冲突导致频繁的缓存缺失。
-
全相联映像(Fully Associative)
- 地址格式:标签 + 行内地址。
- 优点:命中率和空间利用率高。
- 缺点:需要并行比较所有标签,硬件实现最复杂。
-
组相联映像(Set Associative)
- 地址格式:标签 + 组号 + 行内地址。
- 原理:是直接映像和全相联映像的折中方案。全相联可以看作是所有行在同一组,而直接映像可以看作是每一行为一个组。
- 地址计算:
- 设主存容量为 ,缓存容量为 ,缓存行大小/主存块大小为 ,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 缓存的容量限制。这种分层策略结合了两种缓存的优势,平衡了命中时间与缺失率。