1 计算机系统的组成与体系结构
1.1 计算机体系结构分类
计算机体系结构,简单说就是CPU 怎么设计、指令怎么执行、数据怎么流动的整体方案。
常见分类方式:
1)按指令与数据流分类(最常考)
- SISD :单指令单数据流
一个指令一次处理一个数据。老式单核CPU基本都是这样。 - SIMD :单指令多数据流
一条指令同时处理一批数据。比如图片、视频、AI计算常用。 - MISD :多指令单数据流
理论模型,实际几乎不用。 - MIMD :多指令多数据流
多核CPU、服务器、超级计算机都是这种,多个核心同时干不同的事。
2)按存储程序方式
- 冯·诺依曼结构
指令和数据放在同一片内存里。现在电脑、手机都用这个。 - 哈佛结构
指令和数据分开存储,速度更快。单片机、DSP、嵌入式常用。
3)按指令集复杂程度
- CISC:复杂指令集(Intel/AMD)
- RISC:精简指令集(ARM、RISC‑V)
这部分后面 1.4 节详细讲。
1.2 计算机的硬件组成
经典 冯·诺依曼计算机 5 大部件,所有计算机都离不开这 5 样:
1)运算器(ALU)
负责算数运算 (加减乘除)和逻辑运算 (与或非、异或)。
相当于计算机的"计算器"。
2)控制器
负责取指令 → 翻译指令 → 指挥各部件干活 。
相当于计算机的"大脑总指挥"。
运算器 + 控制器 = CPU(中央处理器)
3)存储器
存放数据和指令。
- 内存(主存):速度快、断电丢失
- 外存(硬盘/U盘):速度慢、永久保存
4)输入设备
向计算机输入信息。
例:键盘、鼠标、扫描仪、麦克风、触摸屏。
5)输出设备
计算机向外输出结果。
例:显示器、打印机、音箱、投影仪。
1.3 指令系统基础
指令 = 操作码 + 地址码
- 操作码:做什么(加、减、读、写)
- 地址码:数据在哪
寻址方式 = 找数据位置的方法
下面一个一个讲,全部零基础可懂。
1.3.1 隐含寻址方式
指令里不写地址,地址默认藏在某个地方。
例子:
有一条指令叫"加1",它默认就是对**累加器(ACC)**里的数加1。
指令里根本不写地址,因为大家都知道操作谁。
特点:
- 指令短、快
- 只能操作固定位置
1.3.2 立即寻址方式
数据直接写在指令里,不用去别的地方找。
格式:
指令 = 操作 + 立即数
例子:
MOV AX, #5
意思:把 5 直接放到 AX 寄存器。
5 就在指令里,当场就能用。
特点:
- 最快
- 只能放小数字
1.3.3 直接寻址方式
指令里直接写内存地址,去这个地址取数。
例子:
MOV AX, [1000H]
意思:去内存地址 1000H 里拿数据。
特点:
- 简单直观
- 地址范围有限
1.3.4 间接寻址方式
指令里给的地址不是数据,而是"放真实地址"的地址。
比喻:
指令给你一个抽屉A,抽屉A里有张纸条写着"去抽屉B拿数据"。
例子:
MOV AX, (1000H)
- 去地址 1000H 拿到一个地址,比如 2000H
- 再去 2000H 拿真正数据
特点:
- 灵活
- 慢,要访问两次内存
1.3.5 寄存器寻址 & 寄存器间接寻址
(1)寄存器寻址
数据在寄存器里,指令直接用寄存器。
例子:
MOV AX, BX
把 BX 里的数据给 AX。
特点:
- 极快(寄存器在CPU内部)
(2)寄存器间接寻址
寄存器里存的不是数据,是内存地址。
例子:
MOV AX, [BX]
- 看 BX 里的值,假设是 1000H
- 去内存 1000H 取数据
特点:
- 灵活、比间接寻址快
1.3.6 相对寻址方式
以程序计数器(PC 当前位置)为基准,偏移一段距离。
公式:
有效地址 = PC 值 + 偏移量
比喻:
"从我现在站的位置,往前走 5 步。"
常用于:跳转指令、循环、分支。
1.3.7 基址寻址方式
以基址寄存器为基准,加上偏移。
公式:
有效地址 = 基址寄存器 + 偏移
基址寄存器一般由操作系统设置 ,用户程序不能随便改,用来做内存管理、多任务隔离。
1.3.8 变址寻址方式
以变址寄存器为基准,加上偏移。
公式:
有效地址 = 变址寄存器 + 偏移
变址寄存器由用户程序自己改,适合遍历数组、字符串。
对比记忆:
- 基址寻址:面向系统、内存管理
- 变址寻址:面向用户、数组循环
1.4 CISC 与 RISC
CISC:复杂指令集计算机
代表:Intel x86(台式机、笔记本、服务器)
特点:
- 指令数量多、功能强、长度不固定
- 一条指令能干很复杂的事
- 电路复杂、功耗高
- 兼容性极强
RISC:精简指令集计算机
代表:ARM(手机)、RISC‑V(嵌入式)
特点:
- 指令少、简单、长度固定
- 只保留最常用指令
- 电路简单、功耗极低
- 执行速度均匀、适合流水线
一句话区别:
- CISC:指令多而强,像多功能工具箱
- RISC:指令少而快,像专用高效工具
1.5 流水线
把一条指令的执行拆成好几步,像工厂流水线一样,多条指令重叠执行,从而提高速度。
典型 5 级流水线:
取指 → 译码 → 执行 → 访存 → 写回
1.5.1 计算流水线执行时间
1)单个指令执行时间
设流水线每段时间为 Δt
一条指令总时间:k × Δt
k = 流水线级数(比如 5 级)
2)n 条指令总执行时间
公式(最常考):
总时间 = 第一条指令时间 + (n−1) × 每段时间
= k·Δt + (n − 1)·Δt
例子:
5级流水线,Δt=1ns,执行 10 条指令
总时间 = 5×1 + (10−1)×1 = 5 + 9 = 14ns
3)吞吐率
单位时间完成指令数。
流水线越稳定,吞吐率越高。
1.5.2 影响流水线性能的主要因素
流水线最怕"停顿",一停顿效率暴跌。
1)结构冒险(资源冲突)
同一时间两个指令抢同一个硬件。
比如同时要访问内存。
解决:
- 增加硬件
- 分时使用
2)数据冒险(数据依赖)
后面指令要用前面指令还没算完的数据。
例:
A 指令算 R1=R2+R3
B 指令用 R1 做加法
B 必须等 A 写完才能执行。
解决:
- 阻塞等待
- 数据转发(直通)
- 指令重排
3)控制冒险(分支跳转)
遇到 if/else、循环、跳转时,流水线不知道下一步该取哪条指令,只能暂停。
解决:
- 分支预测
- 延迟槽
- 预取目标指令