>> >> >> Reference << << << <<<<<<Ref>>>>>>
Computer Hardware
Modified: 2025-12-31 | Author:ljf12825

依据冯·诺依曼体系结构,主要包含五大基本单元

  1. 运算器
  2. 控制器
  3. 存储器
  4. 输入设备
  5. 输出设备

其中,运算器和控制器通常被集成在一起,就是中央处理器

CPU

CPU是计算机的核心,负责执行程序中的指令和处理数据。它内部主要由两大单元构成

CPU的逻辑架构

CPU的根本任务是执行指令。这个工作可以分解为一个循环往复的过程,即指令周期

CPU核心部件

控制单元(CU)

CU是CPU的神经中枢,它自己不执行计算,而是负责协调和管理整个CPU的工作

算术逻辑单元(ALU)

ALU是CPU中真正进行”计算“的地方,所有数学和逻辑运算都在这里完成- 功能:

寄存器文件

寄存器是CPU内部速度最快、延迟最低的存储单元,由触发器构成,用于临时存放即刻需要使用的数据、地址或指令

缓存

虽然缓存通常被视为一个独立的层级,但在现代CPU设计中,它已被集成在每个核心内部,是其高效运作不可或缺的一部分

核心工作流程:指令周期

指令周期通常包含四个主要步骤:

  1. 取指
    • 控制器根据程序计数器(一个特殊的寄存器,存放下一条指令的地址)的值,从内存中读取下一条指令
    • 取出的指令被放入指令寄存器中
  2. 译码
    • 控制器分析指令寄存器中的指令,弄清楚这条指令要求CPU做什么(是加法?是从内存加载数据?还是跳转到另一个地址?)
    • 这个过程就是把二进制机器码翻译成CPU内部能理解的控制信号
  3. 执行
    • 控制器根据译码结果,向相关的部件发出控制信号
    • 如果指令是计算类的(如加法),控制器会命令运算器工作,从寄存器或内存中取出操作数,完成计算
    • 如果指令是数据传送类的(如从内存读取数据),控制器会命令内存总线和寄存器进行数据传输
  4. 写回
    • 将执行阶段得到的结果存入指定的位置,比如一个寄存器或者内存中
    • 完成后,程序计数器的值会自动更新,指向下一条要执行的指令地址,然后循环重新开始

CPU的物理实现

存储器

存储器用于存放程序和数据。根据其速度、容量和与CPU的距离,可分为多个层次

输入/输出设备

##总线 以上所有部件并非孤立存在,它们需要通过系统总线链接起来。总线负责在部件之间传输数据、地址和控制信号

存储层次

总结工作流程

以计算“1+2”的例子\

  1. 输入:通过键盘输入“1+2”这个指令
  2. 存储与传输:指令通过总线被送入内存中暂存
  3. 控制与执行:
    • 控制器从内存中读取“1+2”这个指令,并进行解码
    • 控制器指挥运算器进行加法运算
    • 控制器从内存中将数据“1”和“2”取出来,送入运算器
    • 运算器执行1+2的运算,得到结果“3”
  4. 输出:运算结果“3”被送回内存,然后通过总线传送给显示器,最终看到屏幕上显示3

局部性原理

局部性原理描述了程序在执行时访问数据(数据访问)和指令(指令访问)的一种可预测的模式。它指出,在短时间内,程序更倾向于重复访问它最近使用过的数据或指令,或者访问这些数据/指令附近的数据

这个原理是计算机体系结构中几乎所有缓存层次(CPU缓存、内存、磁盘缓存等)得以有效工作的理论基础。正是因为存在局部性,我们提前将”可能要用到的数据“拿到更快的存储设备中才是有意义的

局部性原理主要分为两类:

时间局部性

for (int i = 0; i < 1000; i++) 
{
    sum += i; // 变量 sum 和 i 在每次循环中都被重复访问 -> 强时间局部性
}

缓存的作用:基于时间局部性,缓存会将最近访问过的数据保留起来,但CPU再次需要时,直接可以从高速缓存中获取,而无需访问更慢的内存

空间局部性

int array[100];
for (int i = 0; i < 100; i++)
{
    array[i] = i; // 访问 array[i] 后, 接下来很可能会访问 array[i+1] -> 强空间局部性
}

缓存的作用:基于空间局部性,当CPU从内存中读取一个数据时,缓存不会只读取这一个数据,而是会读取一个连续的数据块(称为缓存行),并将其存入缓存。这样,当CPU需要下一个相邻的数据时,它已经存在于高速缓存中了

局部性原理的实际应用与重要性

  1. CPU缓存:这是最直接的应用。L1, L2, L3缓存的存在就是为了利用局部性原理。缓存行(通常是64字节)的设计就是空间局部性的完美体现
  2. 内存分页与虚拟内存:操作系统将程序的内存划分为”页“。当程序访问一个不在物理内存中的页时,操作系统会从磁盘调入该页。它不会只调入一个字节,而是调入整个页面(如4KB),这利用了空间局部性。同时,”工作集“概念就是指程序在某段时间内频繁访问的页面集合,这利用了时间局部性
  3. 磁盘缓存:操作系统会将最近访问的磁盘扇区内容缓存在内存中,以加速后续的读取。
  4. 数据库优化:数据库会缓存频繁执行的查询结果(时间局部性),并且在从磁盘读取数据时,会预读相邻的数据页到缓冲池中(空间局部性)
  5. 编程指导原则:理解局部性原理可以帮助程序员写出更高效的代码
    • 高效示例:遍历一个多维数组时,应遵循”行优先“的顺序(在C/C++、Python等语言中),因为内存是线性分布的,行中的元素在内存中是连续的
// 好的写法:空间局部性好
for (int i = 0; i < N; i++)
{
    for (int j = 0;  j < M; j++) 
    {
        array[i][j] = ... // 按行访问
    }
}
- 低效示例:”列优先“遍历会导致频繁跳跃内存访问,破坏空间局部性,造成大量缓存未命中,性能急剧下降
// 差的写法:空间局部性差
for (int j = 0; j < M; j++)
{
    for (int i = 0; i < N; i++)
    {
        array[i][j] = ... // 按列访问,每次访问都跳很远
    }
}

总结

局部性原理是一个简单而强大的观察结果:程序的行为在时间和空阿金上往往是可预测和集中的

正是基于这个原理,计算机系统通过构建多层次的存储结构(寄存器 -> 缓存 -> 内存 -> 磁盘),并配合预取、缓存等策略,成功地掩盖了不同存储介质之间巨大的速度差异,从而实现了今天所见的高性能计算