计算机组成原理
第一章 计算机系统概述

冯诺依曼机的特点
| 冯诺依曼机的特点 |
|---|
| ① 采用“存储程序”的工作方式。 |
| ② 计算机由运算器、存储器、控制器、输入输出设备五大部件组成,以运算器为核心。(现代计算机改以存储器为核心) |
| ③ 指令和数据以同等地位存储在存储器中。 |
| ④ 指令和数据均以二进制形式表示。 |
| ⑤ 指令由操作码和地址码组成,操作码指出操作的类型,地址码指出操作数的地址。 |
| ⑥ 程序和功能都是通过中央处理器执行指令实现的。(“程序控制”思想) |

计算机的功能部件
- 存储器是指主存和辅存。
- 一个编址的对应一个存储单元,存储单元中存储的叫存储字,每一个bit叫存储元件。
- 运算器的核心是ALU算术逻辑单元。
其常见寄存器有:累加器ACC、乘商寄存器MQ、操作数寄存器X、变址寄存器IX、基址寄存器BR。
- 控制器由程序计数器PC、指令寄存器IR和控制单元CU组成。
- 存储器地址寄存器MAR、存储器数据寄存器MDR。
一个功能既可以由硬件实现、也可以由软件实现,这一等价性称为软硬件逻辑功能等价性。
三种翻译程序
将语言与语言进行转换的软件叫做翻译程序。
| 三种翻译程序 | 内容 |
|---|---|
| 解释程序(解释器) | 将高级语言按序逐条翻译成机器语言并立即执行。 |
| 编译程序(编译器) | 将高级语言编译成汇编语言或机器语言。 |
| 汇编程序(汇编器) | 将汇编语言汇编成机器语言。 |

三种级别的语言
- 机器语言,是计算机唯一可以直接识别和执行的语言。
- 汇编语言,汇编语言和机器语言一一对应。(汇编相当于机器语言的英语助记)
- 高级语言。
三种常见字长
| 三种字长 | 内容 |
|---|---|
| 机器字长 | 指CPU一次整数运算所能处理的位数,也叫CPU字长、计算机字长,简称字长。机器字长 = CPU总线宽度 = 运算器ALU位数 = 通用寄存器位数。 |
| 存储字长 | 指存储器中一个存储单元的位数。按字节编址,则存储字长为8。 |
| 指令字长 | 指计算机中一条指令的长度。长度为机器字长的指令叫单字长指令,还有半字长指令、双字长指令。 |
| 三种字长都必须是字节的整数倍。 | |
计算机性能指标
| 性能指标 | 内容 | 含义 |
|---|---|---|
| 时钟周期 | 一个时钟周期占多少秒 | CPU脉冲信号宽度,计算机中最小的时间单位 |
| CPU主频 | 一秒有多少个时钟周期 | CPU时钟周期的频率,时钟周期的倒数 |
| CPI | 一个指令需要多少个时钟周期 | 和IPC互为倒数 |
| IPS | 一秒能执行多少条指令 | CPU执行指令的频率,和SPI互为倒数 |
| FLOPS | 一秒能执行多少次浮点运算 |
第二章 数据的表示和运算

定点数的机器数转换
无符号数没有原反补移,原反补移只针对有符号数。

| 机器数转换 | 规则 |
|---|---|
| 移码转真值 | 移码(解读成无符号真值)= 实际真值 + 偏置值。偏置值一般为2n-1。 |
| 补码转移码 | 补码符号位取反得移码。 |
| 补码转真值 | 符号位赋负位权-2i,数值位赋正位权,参与运算。 |
定点数的表示范围
| 定点数 | 定点整数 | 定点小数 | 二进制表示 |
|---|---|---|---|
| ( | |||
| ( | |||
| ( |
| 补码规则 |
|---|
| 补码全0为0,全1为-1。 |
| 补码符号位为0,数值位全1,表示最大整数2n-1。 |
| 补码符号位为1,数值位全0,表示最小整数-2n。 |
| 补码的符号扩展:高位用符号位填充。 |
补码最大最小值
- 负值补码最小,符号位为1,数值位有1往后放。
- 负值补码最大,符号位为1,数值位有1往前放。
- 正值补码最小,符号位为0,数值位有1往后放。
- 正值补码最大,符号位为0,数值位有1往前放。
补码符号位取反就是移码,上述规则只要取反符号位就适用于移码。
补码比较大小
- 首先看符号位,正数一定比负数大。
- 其次看数值位,数值位大的就大,数值位小的就小。FFFDH > FFDFH
定点数的格式转换

| 定点数的格式转换 |
|---|
| 1. 有符号数存取要经历原反补转换。 |
| 2. 不同长度的类型赋值需要扩展和截断,有符号数扩展补符号位,无符号数扩展补0。 |
定点数的加减法


| 补码运算 | 规则 |
|---|---|
| 加法 | 两数补码直接相加。 |
| 减法 | 两数补码相减,减去一个数相当于加上这个数的补数。 |
| 补数 | 补码所有位取反,再+1。一个数+它的补数=2n。 |
补码的符号位可以参与运算,所以加减运算只使用补码。
定点数的溢出判断
| 加法器标志 | |
|---|---|
| CF (Carry Flag) 进位标志 | 无符号数运算是否溢出,CF = Cin ⊕ Cout。 |
| OF (Overflow Flag) 溢出标志 | 有符号数运算是否溢出,OF = Cn ⊕ Cn-1。 |
| ZF (Zero Flag) 为零标志 | 运算结果是否为0,为零ZF=1。 |
| SF (Sign Flag) 符号标志 | 输出运算结果符号位,为负SF=1。 |
| 加法器标志含义 |
|---|
| Cout和Cn表示最高位进位,Cn-1表示次高位进位。 |
| CF仅对无符号运算有意义,OF仅对有符号运算有意义。 |

双符号位溢出判断
双符号位法仅针对补码运算,复制一位符号位,若运算结果两符号位相异则溢出,相同不溢出。

定点数的移位乘除法
| 移位 | 规则 | 溢出 | 损失精度 |
|---|---|---|---|
| 逻辑移位 | 左移:高位移出,低位补0,右移:高位补0,低位移出 | 1被移出 | 1被移出 |
| 算术移位 | 左移:高位移出,低位补0,右移:高位补符号位,低位移出 | 符号位变化 | 1被移出 |
算术移位用于有符号数,因为有符号数专注算术运算。
一般浮点数
| 一般浮点数的格式 |
|---|
![]() |
| 一般浮点数的规格化 |
尾数的最高位必须是有效位。原码为1有效,补码须与符号位相异有效。 ![]() |
IEEE754浮点数
| IEEE754浮点数的格式 |
|---|
![]() |
| • 阶码使用移码表示,偏置值为2n-1-1。8位阶码偏置值127,11位阶码偏置值1023。阶码不能为全0或全1。 • 尾数用原码表示,采用1.Y的形式,只存储Y的内容。 |
若阶码全0或全1,应用以下规则。
| 情况 | 情况1 | 情况2 | 情况3 | 情况4 |
|---|---|---|---|---|
| 阶码 | 0 | 0 | 255 | 255 |
| 尾数 | 0 | 非0 | 0 | 非0 |
| 结果 | 非规范数 |
浮点数的表示范围

阶码无符号数范围是1~254,偏置值127,故阶码真值范围是-126~127。

非规格化数距0也有范围,绝对值最小是
。
浮点数的精度问题
| 什么样的小数能用浮点数表示? |
|---|
| 𝟏. 只有能写成 𝟐. 浮点数尾数精度有限,尾数不得多于规定位数。 |
| 浮点数完整表示整数的精度范围? |
| 浮点数可以表示整数,减小阶码,将尾数小数点后移至末尾,所得就是整数。但若超出尾数范围,再减小阶码就无法完整表示,只是乘2。 • 单精度浮点数完整表示整数的精度范围: • 单精度浮点数能表示的最大整数: |
| 阶数差距过大,“大数吃小数”现象 |
| 对单精度浮点数而言,两数阶码之差大于等于25时,小数的尾数在对阶时会直接变0,导致小数对运算无影响,二者加减结果等于大数。 |
浮点数的加减法
| 步骤 | 内容 | 示例 |
|---|---|---|
| 对阶 | 小阶向大阶对齐,小阶增大,尾数右移 | 1.2×103=0.012×105 |
| 尾数运算 | 阶码相同,尾数可直接加减 | |
| 尾数规格化 | 尾数写成1.Y的形式,阶码顺势调整 | 0.012×105=1.2×103 |
| 尾数舍入处理 | 多余位>0.5进位,<0.5舍去,=0.5向偶数舍入 | 1.10|101≈1.11 (101=0.625) |
| 溢出判断 | 规格化尾数,检查阶码是否超出范围 |
尾数舍入处理
如下四个例子,假设后三位待舍入,将多余位赋小数位权。
:因为 ,所以 舍入并进位。 :因为 ,所以 舍去不进位。 :因为 ,所以 向偶数舍入,若保留位为偶数 (末位为0),则舍去。 :因为 ,所以 向偶数舍入,若保留位为奇数 (末位为1),则进位。
浮点数的溢出判断

| 溢出规则 |
|---|
| 尾数右规、舍入可能造成阶码上溢,尾数左规可能造成阶码下溢。 |
| 尾数溢出可通过调整阶码解决,阶码溢出才是真的溢出。 |
| 下溢直接置零,上溢触发操作系统异常。 |
大小端存储
| 存储方式 | 规则 |
|---|---|
| 小端存储 | 低位字节放到低地址处,高位字节放到高地址处。 |
| 大端存储 | 低位字节放到高地址处,高位字节放到低地址处。 |
边界对齐
| 对齐规则 |
|---|
| 双字数据(8个字节)的起始地址必须为8的倍数(地址末尾为000) |
| 单字数据(4个字节)的起始地址必须为4的倍数(地址末尾为00) |
| 半字数据(2个字节)的起始地址必须为2的倍数(地址末尾为0) |
第三章 存储系统


存储器分类
三级存储系统

| 存储层次 | 调度方式 |
|---|---|
| Cache-主存层 | 由硬件自动完成,对所有程序员透明。 |
| 主存-辅存层 | 由硬件和操作系统共同完成,对应用程序员透明。 |
透明=看不见。
按存储介质分类

按存取方式分类
| 四种存取方式 | 存取逻辑 | 对应设备 |
|---|---|---|
| 顺序存取 | 读取时必须按顺序逐个读取,无法跳过 | 光盘、磁带、软盘 |
| 随机存取 | 任意时刻可以访问任意位置 | RAM、ROM、Flash |
| 直接存取 | 选取信息所在区域,然后顺序访问 | 机械硬盘 HDD |
| 相联存取 | 通过数据的内容进行存取 | Cache、TLB |
存储器性能指标
| 存取周期 / 存取时间 |
|---|
| • 存取周期:可以连续读写的最短时间间隔,可以理解为存储器准备数据的时间。 • 存取周期 = 存取时间 + 恢复时间 ![]() |
| 主存带宽 |
主存带宽Bm,也称数据传输速率,表示每秒从主存进出信息的最大数据量,单位字/秒、字节/秒。注意单位换算:1KB=1024B,1s=1000ms。字节和秒换算尺度不统一,不能约掉。 |
| 存储容量 |
| 存储容量 = 存储单元数(可寻单元数)× 存储单元长度(存储字长) |
| 地址位数和存储单元个数 |
| n 位地址可寻址 2n 个存储单元 |
| 存储器参数 |
| 4M×8位 存储器: • 4M=222 是存储单元个数,即需222个地址,SRAM是22根地址线,DRAM是11根地址线。 • 8位 是芯片的存储字长,即存储单元容量,等于数据线位数。 芯片存储字长物理上无法改变,所以使用该芯片的计算机,存储字长最少为8位,可以位扩展,但不可能位“减少”。 |
随机存储器 SRAM/DRAM
静态随机存储器 SRAM
| SRAM特点 |
|---|
| SRAM集成度低、速度快、价格高,故仅SRAM能用作Cache、TLB。 |
| 数据线个数 = 数据位数 = 存储字长 |
| 地址线个数 = 地址位数 |

| SRAM译码结构 | 地址情况 | 地址线、译码线个数 |
|---|---|---|
| 单译码结构 | n 位地址,2n 个存储单元 | n 根地址线,2n 根译码线 |
| 双译码结构 | n 位地址,2n 个存储单元 | n 根地址线,2·2n/2 根译码线 |
动态随机存储器 DRAM
| DRAM特点 | 内容 |
|---|---|
| ① 需要刷新,且按行刷新 | • 刷新时不可读写,称为死时间。 • 刷新一行,耗时一个存储周期。所有行都刷新一次,耗时一个刷新周期。 |
| ② 行列地址复用 | • 同一组地址引脚,先传行地址,再传列地址。 • 地址引脚数取行列数的最大值,一般行列地址线数相等。 |
| ③ 行缓冲区 | 行缓冲区大小为一行数据大小。 |
| 同步动态存储器 SDRAM | DRAM升级版,继承DRAM的特点,支持突发传输、流水线,连续读写快。 |

| 刷新方式 | 策略 | 优缺点 |
|---|---|---|
| 分散刷新 | 存取周期之后进行一次刷新,刷新时间囊括进存取周期 | 无死时间,存取周期翻倍 |
| 集中刷新 | 刷新周期的后期集中刷新所有行 | 死时间长 |
| 异步刷新 | 刷新周期分成行数段,每一段最后进行一次刷新 | 死时间短 |

SRAM和DRAM对比
| 特点 | 破环性读出 | 刷新 | 送行列地址 | 速度 | 集成度 | 成本 | 主要用途 |
|---|---|---|---|---|---|---|---|
| SRAM | 非破环性读出 | 不需刷新 | 同时送 | 快 | 低 | 高 | 高速缓存 |
| DRAM | 破环性读出 | 需要刷新 | 分两次送 | 慢 | 高 | 低 | 内存 |
存储芯片的扩展
| 扩展方式 | 含义 | 变化 |
|---|---|---|
| 位扩展 | 多个芯片“并联” | 存储单元个数不变,存储单元位数 ×2 |
| 字扩展 | 多个芯片“串联” | 存储单元个数 ×2,存储单元位数不变 |
| 字位同时扩展 | 多个芯片“串并联” | 存储单元个数 ×2,存储单元位数 ×2 |
存储单元个数 和 地址位数 有关,存储单元位数 = 存储单元容量。

字扩展片选信号
位扩展不影响地址。字扩展2n个存储芯片,需高位增加n位片选地址。
以第2个芯片为例,首地址为01 0000 0000 0000 0000 = 10000H,末地址为1FFFFH。

多模块存储器
存储芯片扩展成存储体,存储体组合成存储器。
| 多模块存储器 | 内容 |
|---|---|
| 高位交叉编址 (连续交叉编址) | 多个存储体“串联”,地址高位作“体号”,低位作“体内地址。缺点:数据传输不连续。 |
| 低位交叉编址 (轮流启动) | 多个存储体“并联”,地址高位作“体内地址”,低位作“体号”。 最佳情况: • m ≥ T/r 时效率最高,体数 = 存储周期 / 数据传输时间。 • 连续存取n个体需要的时间 t = T+(n-1)r. • 连续存取并传输n个体需要的时间 t = T+nr. 一个存储周期内存储器可以存取m个存储字,一个数据传输时间内存储器可以存取1个存储字。优点:数据传输连续。 |
| 低位交叉编址 (同时启动) | 每次存取数据只能访问“同一行”。如果数据跨行存储,就需要多个存储周期。 • 轮流启动:数据总线宽度 = MDR位数 = 存储字长。 • 同时启动:数据总线宽度 = MDR位数 = 存储字长 × 体数。 |
高位交叉编址(连续交叉编址)![]() |
低位交叉编址(轮流启动)![]() |
低位交叉编址(同时启动)![]() |
只读存储器 ROM
| 名称 | 特点 |
|---|---|
| ROM(常规ROM) | 只能读不能写 |
| PROM(一次可编程ROM) | 可以写一次,不能擦 |
| EPROM(可擦除可编程ROM) | 紫外线擦除 |
| EEPROM(电擦除可编程ROM) | 高电压擦除 |
闪存 Flash
- U盘、固态硬盘。
- 非易失性存储器,断电后可长期保存,支持电擦除和在线重写,读写性能不对称,读比写快得多。
机械硬盘 HDD
机械硬盘HDD,也叫温彻斯特硬盘,以磁性存储为主。

磁盘物理结构
| 磁盘组成 | 作用 |
|---|---|
| 盘片 | 存储数据 |
| 磁盘驱动器 | 接收磁盘控制器的控制信号,驱动磁盘转动,在盘面上通过磁头读写。 |
| 磁盘控制器 | 磁盘驱动器与主机的IO接口,接收CPU命令返回磁盘状态,向磁盘驱动器发控制信号。 |
| 数据 | 作用 |
|---|---|
| 盘面数 | 用于存储数据的单双面的数量 |
| 柱面数 | 盘片上有多少条磁道 |
| 扇区数 | 磁道上有多少个扇区 |
磁盘地址结构

若驱动器唯一则驱动器号可省略。
连续数据的存储,在同一个柱面,从上往下一个盘面一个盘面存。所以先柱面号,再盘面号,最后扇区号。
性能指标
| 性能指标 | 内容 |
|---|---|
| 道密度 位密度 面密度 | 半径方向单位长度上的磁道数 磁道单位长度上的能记录的二进制位数 道密度 × 位密度 |
| 磁盘容量 | 有格式化容量和非格式化容量,格式化容量比非格式化容量小 |
| 平均存取时间 | 平均存取时间 = 平均寻道时间 + 旋转延迟时间 + 数据传输时间 ① 寻道时间:直接给出 ② 旋转延迟时间:磁盘转半圈的时间 ③ 数据传输时间:磁头扫过数据块的时间(取决于数据区域占磁道之比)。若题目给出磁盘传输速率,用数据大小除以传输速率。 若题设给出其他延迟时间,需额外算上。 |
独立磁盘冗余阵列 RAID
RAID:将多个物理硬盘以不同的方式组合成一个逻辑硬盘的技术。
使用RAID的目的:提高硬盘的读写性能和数据安全可靠性。提高可靠性只有两种方式:冗余和校验。
| RAID | 技术 | 特点 |
|---|---|---|
| RAID0 | 条带化存储,并联多个硬盘,类似交叉编址 | 提高速度,无冗余,无校验 |
| RAID1 | 磁盘镜像技术,提供冗余,适合存储关键数据 | 镜像存储,一半冗余,无校验 |
| RAID2 | 使用海明码校验 | 冗余少,有校验,存储校验码 |
| RAID3~6 | 使用奇偶校验 | 冗余少,有校验,存储校验码 |
冗余表褒义,代表数据安全。

固态硬盘 SSD
| 固态硬盘特点 |
|---|
| 半导体器件,由U盘发展而来。 |
| 相比常规磁盘,优势在于随机存取速度快。 |
| 写速度相对读速度较慢,但仍远高于机械硬盘。 |
固态内部结构

| 读写单位 |
|---|
| 页级读写:以页为单位读写。 |
| 块级擦除:以块为单位擦除。 |
写速度慢的原因是,改写一个块需要拷贝再改写到另一个页中。
磨损均衡技术
| 磨损均衡技术 | 内容 |
|---|---|
| 动态磨损均衡 | 写入时优先选择擦写次数较少的空闲块。 |
| 静态磨损均衡 | 控制器定期扫描,将高磨损块的数据迁移至低磨损块中,高磨损块以读为主,低磨损块以写为主,以均衡整体寿命。 静态均衡算法比动态均衡算法更优秀。 |
高速缓存 Cache
Cache的基本原理
| 局部性原理 |
|---|
| • 时间局部性:现在用的信息,未来还要用。 • 空间局部性:未来用的信息,在现在所用信息的附近。 |
| CPU访问数据逻辑 |
| 𝟏. 首先去Cache中取数据,若命中,则算一次Cache存取。 𝟐. 若未命中,则将数据从主存调入Cache,再从Cache访问数据,算一次Cache存取+一次主存存取。 |
| 性能指标 |
| • Cache的命中率 • 平均访问时间 = 命中率 × 访问Cache时间 + ( 1 - 命中率 ) × ( 访问Cache时间 + 访问主存时间 ) = 访问Cache时间 + ( 1 - 命中率 ) × 访问主存时间 |
Cache的映射方式
| 映射方式 | 内容 |
|---|---|
| 直接映射 | 直接映射,主存块只能放到固定位置。 • 主存地址 = 主存块号 + 块内地址 = Tag + Cache块号 + 块内地址 计算步骤: • 主存块号 = 主存地址 / 块大小 • Cache块号 = 主存块号 % Cache块数 块内地址位数取决于块大小,Cache块号位数取决于Cache块数,主存地址位数取决于主存大小。 |
| 全相联映射 | 全相联映射,主存块可以放到任意位置。 • 主存地址 = 主存块号 + 块内地址 = Tag + 块内地址 |
| 组相联映射 | 组相联映射,主存块只能放在固定组中,但组内可以放到任意位置。n路组相联表示一个组内有n个Cache块。 • 主存地址 = 主存块号 + 块内地址 = Tag + Cache组号 + 块内地址 计算步骤: • Cache组数 = Cache块数 / Cache路数 • Cache组号 = 主存块号 % Cache组数 |
直接映射![]() ![]() |
全相联映射![]() ![]() |
组相联映射![]() ![]() |
三种映射方式地址划分![]() ![]() ![]() |
思路提示
由于映射位置是轮着来的,所以映射位置本质就是主存块号的“尾号”。不管是何种映射方式都是这样,所以“看尾号”很重要。
Cache的比较器
从Cache中获取数据,需要先找到对应位置,再比较保存的Tag信息与自身地址中的Tag是否相等,相等则命中。
| 映射方式 | 比较器个数 |
|---|---|
| 全相联映射 | 因为每块都能映射到所有的Cache行,因此只需设置n个比较器。 |
| 直接映射 | 因为每块只能映射到唯一的Cache行,因此只需设置1个比较器。 |
| r 路组相联映射 | 因为每块只能映射到唯一的Cache组,需与r个Cache行比较,需设置r个比较器。 |
- 每次获取仅消耗一次比较的时间,因为有多个比较器并行工作。
- 比较器仅需对比Tag位,比较器位数就是Tag位数。

Cache块的替换算法
替换算法的目标是找到代价最小的块。只有全相联和组相联需考虑替换算法,直接映射替换位置唯一,无需替换算法。
| 替换算法 | 策略 | 替换位 |
|---|---|---|
| RAND 随机替换 | 随机找一个位置替换 | 0 |
| FIFO 先进先出 | 谁先进来替换谁 | log2n |
| LRU 最近最久未使用 ★ | 设置计数器,没使用就加1,替换计数最大者 | log2n |
| LFU 最不经常使用 | 设置计数器,被使用就加1,替换计数最小者 | 长度无限,无需考虑 |
FIFO、LRU替换位中的n指候选块总数,故组相联时n指路数,全相联时n指总块数。
LRU手算方法
向前找第n个最近最久未使用的,重复的不算。假设有4个Cache块,访问主存块的序列为
1 2 3 2 4 1 2 5 <---√4--1--3--2--1--↑
Cache的写策略
| 情况 | 名称 | 策略 | 优缺点 |
|---|---|---|---|
| 写命中 | 全写法 | 又写Cache,又写存 | 数据一致性,增加访存次数 |
| 写命中 | 回写法 | 只写Cache,不写存,换出时再写存 | 数据不一致,减少访存次数 |
| 写不命中 | 写分配法 | 调入Cache,只写Cache | 数据不一致 |
| 写不命中 | 非写分配法 | 不调Cache,只写存 | 数据一致性 |
| 全写法、回写法特点 |
|---|
| • 全写法(直写法)可提供写缓冲队列,CPU同时写入Cache和缓冲区,缓冲区自行写入主存。 • 回写法需为每个Cache块设置修改位(脏位)。 |
| 各策略搭配情况 |
| • 写分配法只能搭配回写法,非写分配法只能搭配全写法。 • 当题设说明采用回写法,就意味着写不命中时采用写分配法。 |

Cache的容量
| Cache的行容量 |
|---|
Cache行 = 标记项 + 数据块 = 标记位Tag + 有效位1b + 脏位1b + 替换位log2n + 数据块仅回写法需要设置脏位,随机替换算法无替换位。 |
| Cache的总容量 |
| Cache总容量 = Cache行数 × Cache一行容量 |
虚拟存储器
基本概念
常规存储器的缺点:
- 一次性:必须全部加载才能运行作业,当作业很大或有大量作业无法全部装入。
- 驻留性:作业执行完毕前,必须全部驻留内存。
虚拟存储器解决主存容量不够用的问题,存在于主存-辅存层,所以虚拟地址与物理地址的转换由操作系统负责。
内外存的数据交换以页为单位。虚拟存储器中称页,主存中称页框,页与页框的大小相同。
- “基本分页”:基于常规存储器,将程序的所有页导入内存。
- “请求分页”:基于虚拟存储器,只将访问的页导入内存。
一个进程拥有一个虚拟地址空间和一个页表,主存唯一存在。
CPU访存全过程
| 通过虚拟地址获取物理地址 |
|---|
| 𝟏. CPU给出虚拟地址, 𝟐. 先查快表,若命中,直接转换为物理地址。若未命中, 𝟑. 再查页表,若命中,更新快表并转换为物理地址。若未命中,触发缺页中断后更新页表和快表。 |
| 使用物理地址获取数据 |
| 𝟒. 访Cache,若命中,直接将数据取出来。若未命中, 𝟓. 访存,将数据送Cache,再从Cache中访问。 |

段式/段页式虚拟存储器
| 段式虚拟存储器 |
|---|
| 按段划分程序,段长不固定。 |
| 𝟏. 段表项中存储段长和基址。段号须小于段表长度、段内偏移量须小于段长。 |
| 𝟐. 段内偏移量 + 基址 = 数据的地址。 |
| 𝟑. 地址划分为 段号 + 段内地址。 |


| 段页式虚拟存储器 |
|---|
| 先分段再分页。先分成大小不等的段,段内再分成大小相等的页。 |
| 𝟏. 进程拥有一张段表,每个段拥有一张页表。 |
| 𝟐. 地址划分为 段号 + 页号 + 页内地址。 |

页表 Page
| 页表 |
|---|
| 页表记录虚拟页号到物理页号的映射。 |
| 页表项中不存虚拟页号,只存储物理页号,有效位和脏位是否存在看题设。 |
| 页表计算 | 内容 |
|---|---|
| 页表项宽度 | 页表项宽度 = 有效位 + 脏位 + 页框号 |
| 页表项个度 | 页表项个度 = 进程页数,一个虚拟页对应一个页表项 |
| 页表大小 | 页表大小 = 页表项宽度 × 页表长度 |
| 物理地址 | 页内地址不变,虚页号转换成页框号 |


| 地址转换的角色 | 任务 |
|---|---|
| 硬件 MMU | 逻辑地址到物理地址的转换(先查TLB,未命中则查页表) |
| 软件 操作系统 | 页表/段表的建立、更新、缺页中断处理、权限检查及异常处理 |
快表 TLB
| 快表 TLB |
|---|
| 快表TLB是相联存储器,地址转换先查TLB以保证速度。 |
| 快表使用虚拟块号映射物理块号,将虚拟地址分为Tag + TLB组号 + 页内地址。故快表项中存储Tag和实页号。 |

访存命中分析
| 情况 | TLB | Page | Cache | 访内存次数和工作 | 访外存次数和工作 |
|---|---|---|---|---|---|
| 1 | 命中 | 命中 | 命中 | 0次 | |
| 2 | 命中 | 命中 | 缺失 | 1次,获取数据 | |
| 3 | 缺失 | 命中 | 命中 | 1次,获取地址 | |
| 4 | 缺失 | 命中 | 缺失 | 2次,获取地址和数据 | |
| 5 | 缺失 | 缺失 | 缺失 | 2次,获取地址和数据 | 1次,调入内存 |
- 快表中的数据是从页表中复制的,故TLB命中,Page一定命中
- 缓存中的数据是从内存中复制的,故Cache命中,Page一定命中
第四章 指令系统

指令的概念
| 概念 | 解释 |
|---|---|
| 指令系统 | 所有机器指令的集合。 |
| 指令集体系结构ISA | 指令系统的设计规范。ISA是软硬件之间的接口,对上是机器语言和汇编语言的基础,对下是硬件的使用者。 |
| 微体系结构/微架构 | 具体硬件的设计规范。软件感知不到。 |

| 结构层级 | 规定内容 |
|---|---|
| 指令集体系结构ISA | 指令格式,寄存器,寻址方式,虚拟内存、地址翻译机制,中断异常处理机制 |
| 微体系结构 | 控制信号,时钟周期,流水线,数据通路,Cache,ALU、译码器,TLB |
指令集体系结构ISA指明指令的具体设计,微体系结构指定硬件的实现方法。
指令的格式

指令一般包含三大内容:操作码、形式地址A和寻址方式位。
| 指令内容 | 作用 |
|---|---|
| 操作码 | 操作类型的编号。 |
| 形式地址A | 可能是操作数本身,或是操作数所在寄存器编号或主存地址。数量可能有0到4个。 |
| 寻址方式位 | 寻址方式的编号。(寻址方式位可有可无) |

| 零地址指令 |
|---|
| 零地址指令只有操作码。两种可能: ① 无需操作数的指令:空操作指令、停机指令、关中断指令。 ② 隐含操作数的指令:参与运算的两个操作数被放在栈顶和次栈顶,因此指令中无需指明地址。 如果说零地址指令一定不需要操作数,是错误的。 |
| 一地址指令 |
| 一地址指令的操作数称为目的操作数。两种可能: ① 只有目的操作数的单操作数指令:OP(A1)→A1,如++、--、取反等。 ② 隐含约定目的地址的双操作数指令:(ACC)OP(A1)→ACC,A1和ACC的运算结果写回ACC。 ![]() |
| 二地址指令 |
| 二地址指令的操作数分别为目的操作数和源操作数,指令含义:(A1)OP(A2)→A1。 一般算术/逻辑运算指令需使用两个操作数,给出目的操作数和源操作数的地址,目的操作数地址还用于写回结果。 二地址指令的访存次数为4次,取指令一次、取操作数两次、存结果一次。 ![]() |
| 三地址指令 |
| 三地址指令的操作数分别为源操作数1、源操作数2、目的操作数,指令含义:(A1)OP(A2)→A3。 三地址指令的访存次数为4次,取指令一次、取操作数两次、存结果一次。 ![]() |
| 四地址指令 |
| 四地址指令的操作数分别为源操作数1、源操作数2、目的操作数、下条指令地址。 指令含义:(A1)OP(A2)→A3。 ![]() |
操作码扩展
以16位指令为例,操作码可以从4位扩展到8位、再到12位、再到16位。
| 操作码扩展 | 内容 |
|---|---|
| 4 位操作码 | 使用0000到1110共15种,1111保留作8位操作码的起始4位。 |
| 8 位操作码 | 使用1111 0000到1111 1110共15种,1111 1111保留。 |
| 12位操作码 | 使用1111 1111 0000到1111 1111 1110共15种,1111 1111 1111保留。 |
| 16位操作码 | 使用1111 1111 1111 0000到1111 1111 1111 1111共16种,此时无需保留。 |

上述例子是只保留一种情况,也可以保留两种。
指令的寻址方式
取指周期
- 将PC中下条指令地址放到MAR中,(PC)→MAR
- 根据MAR中的指令地址访存获得指令放到MDR中,M(MAR)→MDR
- 将MDR中的指令放到IR中,(MDR)→IR
- PC指针自增形成下条指令地址,(PC)+1→PC

| 顺序寻址 |
|---|
| 程序计数器PC + “指令所占存储单元数”,自动形成下条指令的地址。 取指周期末,PC自动自增以指向下条指令,相当于PC时刻保存当前所执行指令的下条指令地址。 |
| 跳跃寻址 |
| 跳跃寻址有两种地址给出方式: 𝟏. 绝对地址:直接就是转移目标地址,A→PC(A无符号数) 𝟐. 相对地址:指出当前PC值到转移目标地址的偏移量,(PC)+A→PC(A可正可负,补码表示) 转移指令在指令执行阶段才进行跳跃寻址,此时PC早已在取指周期自增“1”,执行周期再将“PC+A”,故偏移量本质是相对下条指令地址的偏移量。 |
数据的寻址方式
| 寻址方式 | 具体内容 |
|---|---|
| 隐含寻址 | 操作数地址无需直接指出,隐含在ACC或栈帧中,具体据指令类型而定。 |
| 立即寻址 | 操作数即数据本身,无需访存时间最短,但立即数的范围被限制。 |
| 直接寻址 | 操作数即数据的有效地址EA,需访存一次。 |
| 间接寻址 | 操作数是数据的间接地址,需访存两次。n次间接寻址需访存n+1次。 |
| 寄存器寻址 | 操作数是寄存器编号,寄存器中存储数据本身。无需访存,地址码短,寄存器有限。 |
| 寄存器间接寻址 | 操作数是寄存器编号,寄存器中存储数据的有效地址。 |
| 相对(偏移)寻址 | 指令的跳跃寻址,算作一种数据寻址方式,EA=(PC)+A。适用于转移指令。 三种偏移寻址的偏移量A均可正可负、使用补码表示。 |
| 基址(偏移)寻址 | 用基址寄存器BR或通用寄存器保存基址,指令的形式地址保存偏移量。 基址固定、偏移量可变,二者结合为有效地址,EA=(BR)+A。适用于多道程序设计。 |
| 变址(偏移)寻址 | 用变址寄存器IX或通用寄存器保存变址,指令的形式地址保存偏移量。 变址可变、偏移量固定,二者结合为有效地址,EA=(IX)+A。用户可更改,适用于循环、数组遍历。 |
| 堆栈寻址 | 用寄存器或内存的一块区域模拟堆栈,寄存器堆栈称硬堆栈,内存堆栈称软堆栈。堆栈读写位置由堆栈指针SP指出,故一般堆栈寻址的指令隐含操作数。 |
多次间接寻址的地址空间可用标志位标识,间接地址为1,真实地址为0。 ![]() |
基址变址寻址若采用通用寄存器,须在指令中指明寄存器编号。 ![]() |
复杂精简指令集 CISC/RISC
| 复杂指令系统CISC |
|---|
| 1. 指令系统复杂,指令数目200条以上。 2. 指令长度不固定,格式多,寻址方式多。指令访存性不受限制。指令间使用频度差距大。 3. 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。 4. 控制器采用微程序控制,难以通过优化编译生成高效的目标代码程序。 |
| 精简指令系统RISC |
| 1. 指令数量少,格式少,都为等长指令,寻址方式相对少,适合流水线操作。 2. 仅LOAD/STORE指令可访存,LOAD指令读存储器,STORE指令写存储器。 3. 寄存器多,大大减少访存操作。 4. 控制器采用硬布线控制。 |
| 对比 | 复杂指令集 CISC | 精简指令集 RISC |
|---|---|---|
| 指令数目 | 一般大于200条 | 一般小于200条 |
| 指令字长 | 不固定 | 固定 |
| 指令功能 | 功能强好 | 功能简单 |
| 可访存指令 | 不加限制 | 只有LOAD/STORE指令 |
| 各种指令执行时间 | 相差较大 | 绝大多数能在一个周期内完成 |
| 各种指令使用频率 | 相差很大 | 比较均衡 |
| 通用寄存器数量 | 较少 | 较多 |
| 控制方式 | 绝大多数为微程序控制器 | 绝大多数为硬布线控制器 |
| 兼容性 | 好 | 差 |
| 编译优化 | 不利于编译优化 | 有利于编译优化 |
| 指令流水线 | 可以通过一定方式实现 | 必须实现 |
程序的机器级表示
常用汇编指令

| 数据转移指令 | 含义 |
|---|---|
| move eax, ebx / move byte ptr [var], 5 | 将ebx内容写入eax / 将5写存地址var字长byte |
| push eax / push [var] | 将eax内容压栈 / 将地址var的内容压栈,栈帧数据默认4B |
| pop eax / pop [var] | 弹栈放入eax / 弹栈放入地址var处 |
| 算术运算指令 | 含义 |
| add d, s / sub d, s | d加s、d减s,结果存入d |
| mul d, s / imul d, s / imul m, d, s | d无符号乘s,结果存入d / d有符号乘s,结果存入m |
| div s / idiv s | 除数为s,被除数为edx:eax的64位组合 |
| 二进制运算指令 | 含义 |
| neg d / inc d / dec d | d取反、d自增、d自减 |
| shl d, s / shr d, s | d逻辑左移s位,d逻辑右移s位 |
| 逻辑运算指令 | 含义 |
| and d, s / or d, s / not d | d和s逐位与,d和s逐位或,d逐位取反,结果放入d |
| xor d, s | d逐位异或,结果放入d |
| 控制流指令 | 含义 |
| cmp eax, 10 | 执行减法,不存结果,仅更新标志位,以供转移指令使用 |
| test eax, 10 | 执行按位与,不存结果,仅更新标志位,以供转移指令使用 |

| 无条件转移指令 | 含义 |
|---|---|
| jmp 128 | 跳转到128地址位置 |
| jmp [128] | 跳转到主存188地址中所保存的位置 |
| jmp .L1 | 跳转到.L1标记位置 |
| call / ret | call跳转到函数入口,ret返回call指令的下一条指令 |
| 条件转移指令 | 含义 |
| je / jne | jump if equal / if not equal |
| jz / jne | jump if zero / if not zero |
| jg / jge | jump if greater / if greater or equal |
| jl / jle | jump if less / if less or equal |
选择结构的机器级表示
int f1(int n){
1 00401000 55 push ebp
... ... ...
if(n>1)
11 00401018 83 7D 08 01 cmp dword ptr [ebp+8], 1
12 0040101C 7E 17 jle f1+35h (00401035)
return n*f1(n-1);
13 0040101E 8B 45 08 mov eax, dword ptr [ebp+8]
14 00401021 83 E8 01 sub eax, 1
15 00401024 50 push eax
16 00401025 E8 D6 FF FF FF call f1 (00401000)
... ... ...
19 00401030 0F AF C1 imul eax, ecx
20 00401033 EB 05 jmp f1+3Ah (0040103a)
else return 1;
21 00401035 B8 01 00 00 00 mov eax, 1
}
... ... ...
26 00401040 3B EC cmp ebp, esp
... ... ...
30 0040104A C3 ret循环结构的机器级表示
for(i=0; i<24; i++)
1 00401072 C7 45 F8 00 00 00 00 mov [ebp-8], 0
2 00401079 EB 09 jmp 00401084h
3 0040107B 8B 55 F8 mov eax, [ebp-8]
... ... ...
7 00401088 7D 32 jge 004010bch
for(j=0; j<64; j++)
8 0040108A C7 45 FC 00 00 00 00 mov [ebp-4], 0
... ... ...
a[i][j]=10;
... ... ...
19 004010AE C7 84 82 00 20 42 00 0A 00 00 00 mov [ecx+edx*4+00422000h], 0Ah
20 ... ... ...过程调用的机器级表示
int add(int x, int y){
return x+y;
}
int caller(){
int temp1=125;
int temp2=80;
int sum=add(templ,temp2);
return sum;
}
caller:
push ebp
mov ebp, esp
sub esp, 24
mov [ebp-12], 125 # M[R[ebp]-12]←125,即temp1=125
mov [ebp-8], 80 # M[R[ebp]-8]←80,即temp2=80
mov eax, dword ptr [ebp-8] # R[eax]←M[R[ebp]-8], 即R[eax]=temp2
mov [esp+4],eax # M[R[esp]+4]←R[eax],即temp2入栈
mov eax, dword ptr [ebp-12] # R[eax]←M[R[ebp]-12],即R[eax]=temp1
mov [esp], eax # M[R[esp]]←R[eax],即temp1入栈
call add # 调用add,将返回值保存在eax中
mov [ebp-4], eax # M[R[ebp]-4]←R[eax],即add返回值送sum
mov eax, dword ptr [ebp-4] # R[eax]←M[R[ebp]-4],即sum作为返回值
leave
ret
第五章 中央处理器


CPU的功能和结构
CPU功能有:指挥指令周期的过程、处理异常和中断、时序控制。
CPU的组成

| 部件 | 功能 | |
|---|---|---|
| 运 算 器 | 算术逻辑单元ALU | 执行算术和逻辑运算的核心部件,运算结果和状态标志写入寄存器。 |
| 程序状态字PSW | 标志寄存器FR,保存ALU运算的状态信息,用于条件判断与转移控制。 | |
| 通用寄存器组GPRs | 可编程供用户程序使用,多用于暂存数据,减少主存访问提升效率。 | |
| 控 制 器 | 控制单元CU | CPU指挥中心,负责指令译码、生成微操作控制信号,协调CPU部件。 |
| 地址寄存器MAR | 存放当前要访问的主存地址。 | |
| 数据寄存器MDR | 暂存从主存读出的数据或将要写入主存的数据。 | |
| 指令寄存器IR | 存放从存储器取出的指令。IR的位数等于指令的位数。 | |
| 程序计数器PC | 取指周期结束后,存放CPU下一条指令的地址。 | |

PC的位数问题
| PC的位数问题 |
|---|
| 一般情况下,PC位数 = 地址位数 = MAR位数。 |
| PC的位若指令按指令字长边界对齐,即指令存放时按指令字长编址。按字编址 |
可见或透明的寄存器

| 可见或透明的寄存器 |
|---|
| 可见或透明是针对用户程序而言, |
| 程序可使用的寄存器,有PC、GRPs、PSW以及基址变址堆栈寄存器。 |
| 程序不可见的寄存器,有IR、MAR、MDR等一系列内核功能所用寄存器。 |
指令周期的数据流向
| 概念 | 内容 |
|---|---|
| 指令周期 | CPU取出并执行指令的全部过程。指令周期是灵活的,有的指令只有取指周期,有的只有取指周期和执行周期,不同指令的执行周期不一定相等。 |
| 机器周期 | 指令周期的每个阶段称为一个机器周期。(区别于CPU时钟周期) |


取指周期
根据PC中的指令地址,从主存中取出指令代码存放在IR中。
- 取指操作无需操作码,由控制器自动进行。
- 当指令定长时,所有指令的取指都相同。
- 取指周期必定访问存储器。

| 数据流向 | 机器指令 | 描述 |
|---|---|---|
| PC | PC→MAR | 将PC中的指令地址放入MAR |
| CU发出读命令 | M(MAR)→MDR | 拿MAR指令地址访存,将指令放到MDR中 |
| 主存 | (MDR)→IR | 将MDR中的指令放到IR中 |
| CU发出控制信号 | (PC)+“1”→PC | PC自动指向下一条指令的地址 |
间址周期
访存取出操作数的有效地址EA,而非操作数本身。

| 数据流向 | 机器指令 | 描述 |
|---|---|---|
| Op(IR) | Op(IR)→CU | 将操作码提供给CU,以进行译码 |
| Ad(IR) | Ad(IR)→MAR | 取出指令中的形式地址A,放入MAR中 |
| CU发出读命令 | 读出主存中的有效地址EA | |
| 主存 | M(MAR)→MDR | 将有效地址EA放入MDR中 |
执行周期
| 执行周期 |
|---|
| 通过有效地址EA取出操作数,并根据指令的操作码,进行运算并产生结果。 |
| 执行周期的特点 |
| 𝟏. 取操作数未必需要访存,取决于数据的寻址方式 𝟐. 不同指令的执行不同,因此没有统一的数据流向 |
各周期访存对比
| 周期 | 是否访存 | 访存工作 |
|---|---|---|
| 取指周期 | 一定访存 | 访存取指令 |
| 间址周期 | 一定访存 | 访存取操作数的有效地址EA |
| 执行周期 | 不一定访存 | 取决于数据寻址方式 |
数据通路的概念
数据通路的定义
| 数据通路的定义 |
|---|
| 数据在功能部件之间传送的路径,包括功能部件本身,统称为数据通路。 |
| • 数据流经的部件包括ALU、通用寄存器、状态寄存器、异常和中断处理逻辑。 • CPU由数据通路和控制部件两部分组成。控制部件会根据指令生成对数据通路的控制信号。 数据通路描述了信息从什么地方开始,中间经过哪个寄存器或多路开关,最后传送到哪个寄存器,这些都由控制信号决定。 |
数据通路的组成

数据通路由组合逻辑元件(操作元件)和时序逻辑元件(状态元件)组成。
| 数据通路组成 | 内容 | 特点 |
|---|---|---|
| 组合逻辑元件(操作元件) | 算术逻辑单元、译码器、多路选择器、三态门 | 数据存不住 |
| 时序逻辑元件(状态元件) | 通用寄存器、程序计数器、状态/暂存/移位/锁存寄存器 | 数据存的住 |
三态门、多路选择器的作用
- 多路选择器(MUX)通过控制信号Select来确定哪个输入被输出。
- 三态门视为一种控制开关,由控制信号EN决定信号线的通断,也就是所连寄存器与总线通断。

数据通路的结构

| 总线方式 | 含义 | 特点 |
|---|---|---|
| 单总线方式 | 所有寄存器的输入输出端都接在一条公共通路上 | 结构简单、容易冲突、性能较低 |
| 多总线方式 | 所有寄存器的输入输出端都接到多条公共通路上 | 效率较高 |
| 专用数据通路 | 根据指令执行过程中的数据流向安排连接线路 | 避免共享,性能更高,硬件量大 |
单总线结构

单总线框图描述
- 虚线表示控制信号,实线表示数据流向。
- 三态门
表示通过信号控制连接和断开,
表示并行传输4位二进制数据。
- XXin XXout 表示XX部件的输入输出的控制信号,信号有效则表示数据会从该部件发出或进入。
- ALU两个输入端:一个直接与总线相连,一个与暂存器相连。
- ALU两个输出端:一个与暂存器相连,一个与标志寄存器FR/程序状态字寄存器PSW相连。
- 单总线结构同时仅能有一个部件发数据,但可有多个部件接收数据。
- 单总线结构无法实现单周期CPU。
数据从一个部件流入另一个部件的时间为一个时钟周期,单总线光取指周期就需要多个时钟周期,所以一个时钟周期不可能完成指令。
取指间址的信号序列

| 取指周期 数据流 | 信号序列 | 间址周期 数据流 | 信号序列 | ||
|---|---|---|---|---|---|
| T0 | (PC)→MAR | PCout=1 MARin=1 | T0 | op(IR)→CU | IRout=1 CUin=1 |
| T1 | M(MAR)→MDR | Read=1 MDRin=1 | T1 | ad(IR)→MAR | IRout=1 MARin=1 |
| T2 | (MDR)→IR | MDRout=1 IRin=1 | T2 | M(MAR)→MDR | MARout=1 MDRin=1 |
| T3 | (PC)+“1”→PC | PCout=1 PCin=1 |
单周期和多周期CPU
| CPU分类 | CPI | 内容 |
|---|---|---|
| 单周期CPU | 平均CPI = 1 | 每条指令都在一个时钟周期内完成,时钟周期由耗时最长的指令决定。单周期CPU使用单周期数据通路。 |
| 多周期CPU | 平均CPI > 1 | 不同指令所分配时钟周期数不同,时钟周期由最复杂的指令阶段决定。多周期CPU使用多周期数据通路。 |
时钟周期的概念
时钟周期是计算机内最小时间单位,
- 控制器以时钟周期为单位产生控制信号。即一个时钟周期内,控制信号不变。
- 而发出一次控制信号,只会控制对应部件运行一次。即一个时钟周期内,每个部件最多使用一次。
| 单周期数据通路的特点 |
|---|
| • 对于单周期CPU而言,一次指令执行过程中,控制信号不会发生改变,每个部件只会使用一次。 • 对于多周期CPU而言,一次指令执行过程中,控制信号多次发生改变,每个部件可以使用多次。 |
单周期数据通路,程序计数器PC无须写使能控制信号。单周期CPU每个时钟周期自动取指,故无需额外PC控制信号。 |
| 单周期数据通路,一个时钟周期内无法发生状态元件到状态元件的数据转移。因此无需设置寄存器IR。 |
| 单周期数据通路,指令和数据需分离存储,一个存储器在一个时钟周期内,只能响应一个地址请求。 |
控制器的概念
控制器是CPU的指挥中心,主要功能有:
| 控制器的功能 | 内容 |
|---|---|
| 取指 | 从主存取指,并指出下条指令的地址。 |
| 译码 | 对指令译码,并产生控制信号。 |
| 控制 | 指挥CPU、主存、IO设备间的数据流动。 |

控制器的输入输出

| 控制器 | 内容 |
|---|---|
| 输入端 | 𝟏. 指令操作码或操作码的译码结果 𝟐. 运算器的反馈信息/运算标志。反馈信息又叫条件码、标志位,来自PSW/FR寄存器。 𝟑. 时钟脉冲/时序信号 |
| 输出端 | 输出控制信号给各部件 |
控制器的分类
根据控制信号产生方式的不同,分为硬布线控制器和微程序控制器,二者控制单元CU实现不同。
| 对比 | 微程序控制器 | 硬布线控制器 |
|---|---|---|
| 组成 | 软件+硬件(硬件结构+微程序固件) | 硬件(组合电路+时序电路) |
| 速度 | 慢 | 快 |
| 指令集 | CISC | RISC |
| 扩充性 | 容易 | 困难 |


微程序控制器
微程序控制的概念
- 微程序设计思想是将机器指令编写成一个微程序,微程序由微指令组成。
- 微指令存储在控制存储器CM中,微指令的寻址方式和机器指令类似。x86平台多采用微程序技术。
控制存储器CM是一块ROM芯片,能按地址进行随机存取。
| 概念 | 含义 | 对应关系 |
|---|---|---|
| 微命令 | 控制器发出的控制信号,如(PC)→MAR | 一条微指令 ⇔ 多个微命令 |
| 微操作 | 执行部件收到微命令所做的操作,如PCout MARin | 一个微操作 ⇔ 一套微命令 |
| 一条机器指令 ⇔ 一个微程序 ⇔ 若干微指令 ⇔ 若干多个微指令 | ||
控制存储器和主存的区别
- 主存储器用于存放程序和数据,在CPU外部,用ROM和RAM实现。
- 控制存储器用于存放微程序,在CPU内部,用ROM实现。
- 存放指令的主存储器单元的地址称为地址。
- 存放微指令的控制存储器单元的地址称为微地址。
- 程序是指令的集合,以实现特定功能。
- 微程序是微指令的集合,以实现机器指令。
微程序控制器的组成


| 组成部件 | 介绍 |
|---|---|
| 微地址形成部件 | 根据指令操作码生成对应微程序的入口地址,依据当前微指令的顺序控制字段及状态条件,产生后续微地址。 |
| 微指令地址寄存器μPC | 接收微地址形成部件提供的微地址,作为CM的读地址。 |
| 控制存储器CS/CM | 微程序控制器的核心部件,用于存放所有机器指令对应的微程序。 |
| 微指令寄存器μIR | 暂存从CM中读出的微指令,并将其操作控制字段和顺序控制字段分别送至执行单元和微地址形成部件。 |
微程序控制器的工作过程
| ① 执行取指令公共操作 |
|---|
| 将取指微程序的入口地址(通常为0号地址)送入μPC,再从CM中读取首条取指微指令并送入μIR。完成取指微程序后,从主存中取出的机器指令即被存入指令寄存器IR中。 |
| ② 生成当前指令的微程序入口地址 |
| 根据IR中机器指令的操作码,通过微地址形成部件产生对应微程序的起始微地址,并送入μPC。 |
| ③ 顺序执行微程序 |
| 在CM中逐条读取微指令,送入μIR并执行,直至该微程序执行完毕。 |
| ④ 循环重新取指 |
| 当前指令的微程序执行结束后,控制器自动转移到取指微程序的入口,重新开始处理下一条机器指令。 |
微指令地址的生成方式
| 地址 | 生成方式 |
|---|---|
| 微程序入口地址 | 一条机器指令从主存取出并送入IR后,微地址形成部件通过其操作码,生成对应微程序的首条微指令地址,并送入μPC。 |
| 顺序执行 | 增量方式:由μPC+1自动生成下条微地址。 断定方式:微指令的下地址字段中指出下一条微指令地址。 |
| 条件分支(转移) | 增量方式:修改μPC。 断定方式:微指令的下地址字段指定的转移目标地址。 |
微指令的格式和编码方式

| 微指令的内容 | |
|---|---|
| 操作控制字段 | 也称微操作码字段,表示各种控制信号。 |
| 顺序控制字段 | 也称微地址码字段,表示下条微指令的地址。 |
| 微周期是指从控制存储器中取出并执行一条微指令所需的全部时间,通常为一个时钟周期。 | |
微指令的编码方式
| 编码方式 | 内容 |
|---|---|
| 直接编码 | 微命令字段相当于位图,每一位代表一个微命令。 无需译码,简单直观,速度快,并行性好,但字长过长。 |
| 字段直接编码 | 微命令字段分成若干小字段,每个字段独立编码。互斥性微命令编进同一字段,相容性微命令编进不同字段。 缩短字长,但削弱并行性。 |
| 字段间接编码 | 一个字段的某些微命令需由另一个字段中的某些微命令来解释,又称隐式编码。 进一步缩短字长,进一步削弱并行性。 |

字段直接编码的具体编码方法
直接编码方式本质就是位图,该位置1表示有效,置0表示无效。
字段直接编码方式用字段编码,比如三位划作一个字段,该字段可表示23-1个微命令,留出一种以表示空。
- 互斥性微命令:同一个时钟周期内,不能同时出现的微命令,需划分到一个字段
- 相容性微命令:同一个时钟周期内,可以同时出现的微命令,需划分到不同字段
微指令的格式
| 水平型微指令 |
|---|
| 从编码方式看,直接编码、字段直接编码和字段间接编码都属于水平型微指令。一条水平型微指令能定义多种微命令。 • 优点:微程序短,并行能力强,执行速度快 • 缺点:微指令长,编写微程序较麻烦 |
| 垂直型微指令 |
| 垂直型微指令类似机器指令,在微指令中设置微操作码字段,由其指定微指令的功能。一条垂直型微指令通常只能定义一种微命令。 • 优点:微指令短、简单、规整,便于编写微程序 • 缺点:微程序长,执行速度慢,工作效率低 |

| 对比 | 水平型微指令 | 垂直型微指令 |
|---|---|---|
| 并行性、效率、灵活性 | 强 | 差 |
| 执行时间 | 短 | 长 |
| 微指令字长 | 长 | 短 |
| 微程序长度 | 短 | 长 |
异常和中断机制
异常和中断的概念

| 概念 | 内容 |
|---|---|
| 异常(内中断) | 指令执行过程中,检测到CPU内部的,和正在执行的指令有关的事件。 |
| 中断(外中断) | 指令执行结束后,检测到外设触发的,与当前执行的指令无关的事件。 |
| 异常 | 内容 |
|---|---|
| 故障 | 指令执行过程中被检测到的,处理完毕后,返回原指令位置重新执行,若无法处理,直接终止。 |
| 自陷 | 指令执行完毕后主动触发的,处理完毕后,返回原指令的下条指令继续执行。又叫陷阱或陷入。 |
| 终止 | 指令执行过程中发生严重的硬件故障,导致程序无法运行,因此终止。 |
| 中断 | 内容 | |
|---|---|---|
| 时钟中断 | 系统时钟硬件,周期性发出的中断,以便系统进行任务切换。 | 分 类 一 |
| 外设中断 | 外部设备(如键盘、硬盘、打印机等)发出的处理请求。 | |
| 可屏蔽中断 | 通过可屏蔽中断线INTR发出的中断请求,可在中断控制器中设置屏蔽字。 | 分 类 二 |
| 不可屏蔽中断 | 通过不可屏蔽中断线NMI发出的中断请求,如紧急硬件故障,电源掉电等。 | |

异常或中断的检测时机
- 异常是在指令执行周期发生、检测和处理的。
- CPU在每条指令执行周期结束时,发送中断查询信号,以检测是否有中断请求。若有中断请求,就进入中断周期,若无中断请求,就没有中断周期。
所有异常和中断都是由硬件检测的。
| 类型 | 产生原因 | 是否返回 | |
|---|---|---|---|
| 异常(内中断) | 故障 | 可恢复的错误 | 可能返回到当前指令 |
| 自陷 | 主动的偏离 | 总是返回下一条指令 | |
| 终止 | 不可恢复的错误 | 不会返回 | |
| 中断(外中断) | 外设中断/时钟中断 | 总是返回下一条指令 | |
浮点数溢出是否是故障?
- 浮点数上溢:机器停止运算,进行溢出中断处理。
- 浮点数下溢:IEEE 754规定直接将尾数置0,可以继续运算,无需中断处理。
异常和中断的响应流程
| 中断的响应流程 | 含义 |
|---|---|
| 𝟏. 中断判优 | 若存在多个中断请求,通过中断判优逻辑响应一个中断源。中断判优仅用于外中断,外中断比异常多一个中断判优。 |
| 𝟐. 中断响应的条件 | • 有中断请求 • CPU允许中断(异常和不可屏蔽中断不受关中断限制) • 指令执行完毕(异常立即响应无需等到指令执行结束) |
| 𝟑. 中断隐指令 | • 关中断 • 保存断点PC和程序状态PSW • 送中断向量 这三步由硬件完成且不可打断。 |
异常和中断的处理流程
中断响应和执行中断服务程序统称为中断处理,流程如下:

| 流程 | 处理步骤 | 解释 | 硬软件执行 |
|---|---|---|---|
| 中断 响应 | 1. 关中断 2. 保存断点 3. 中断服务程序寻址 | 中断响应必须先关中断 保存PC和PSW内容以能够返回 根据中断类型号找中断向量,执行服务程序 | 中断隐指令 (硬件)完成 |
| 中断 处理 | 4. 保存现场和屏蔽字 5. 开中断 6. 执行中断服务程序 7. 关中断 8. 恢复现场和屏蔽字 9. 开中断、中断返回 | 发生进程切换,需要保存进程上下文 多重中断,执行中断服务程序前,需要开中断 - 恢复进程上下文前需要关中断 恢复进程上下文 中断返回前需要开中断 | 中断服务程序 (软件)完成 |
中断向量和中断向量表
中断服务程序的首地址称中断向量,中断向量存放在中断向量表中,每个中断向量对应一个中断类型号。

中断向量在中断向量表的下标即中断类型号,中断向量的所在内存地址即中断向量地址。
- 中断向量是中断服务程序的首地址
- 中断向量地址是中断服务程序的首地址的地址
多重中断和中断屏蔽
在执行中断程序的过程中,若转去处理优先级更高中断请求,为多重中断/中断嵌套。

| 两种优先级 | 含义 |
|---|---|
| 中断处理 优先级 | 每个中断源都有自己的中断屏蔽字,执行其中断程序时会将其放入中断屏蔽字寄存器中,代表此时的中断处理优先级。 中断执行中屏蔽寄存器才会生效,一般会屏蔽自身同等级以及更低优先级的中断。处理优先级决定了中断是否会被屏蔽。 |
| 中断响应 优先级 | 中断响应优先级由硬件排队电路(或程序逐个查询优先级)决定,不可动态改变。响应优先级决定了多个未屏蔽中断优先处理谁。 |
| 此时新中断请求,会先经处理优先级过滤,再按响应优先级进行判优。 | |

指令流水线
指令流水线的概念
将一个指令分成五个阶段,每个阶段使用不同部件,这样同一时刻可执行多个指令的不同阶段,这就是流水线技术。
| 流水段 | 内容 |
|---|---|
| 取指 (IF) | 从指令存储器或Cache中取指令。 |
| 译码/读寄存器 (ID) | 控制器对指令进行译码,同时从寄存器中取操作数。 |
| 执行/计算地址 (EX) | 执行运算操作或计算地址。 |
| 访存 (MEM) | 对存储器进行读写操作。 |
| 写回 (WB) | 将指令执行结果写回寄存器。 |


指令流水段的时长
- 一个时段T就是一个CPU时钟周期,因此时钟周期必须为五个阶段的最长耗时。
- 从5T开始,每隔一个时钟周期就有一条指令流出流水线,做到平均CPI为1。
流水线的逻辑结构

- 因各阶段耗时不同,故需设置寄存器暂存本段的结果和控制信号,以便在下个周期提供给下个流水段。
- 统一的CLK时钟信号即作用在功能部件上,也作用在流水段寄存器上。
- 单周期和流水线CPU的取指和译码阶段自动完成,不需要控制信号的参与,但多周期CPU需要。

流水线的指令要求
- 长度一致:指令长度尽量一致,利于简化取指和译码操作。
- 格式规整:指令格式尽量规整。
- 访存受限:仅Load/Store指令可访存。
- 内存对齐:数据在存储器中对齐存放。
流水线的性能指标
| 任务耗时 |
|---|
| • 5段指令采用流水线执行n条指令的耗时:5T+(n-1)T • 5段指令不用流水线执行n条指令的耗时:5nT • k段指令采用流水线执行n条指令的耗时:kT+(n-1)T • k段指令不用流水线执行n条指令的耗时:knT k段指令采用流水线,前kT只能完成一条指令,后面每个T都能完成一条指令,故总耗时是 (k + n- 1)T。 |
| 吞吐率 |
| 单位时间内流水线所完成的任务量,即任务量 / 所耗时间。 |
| 加速比 |
| 相同任务量下,不用流水线和使用流水线的耗时之比。 |
流水线冒险和处理

不同类型的指令在各流水段中的操作
- 运算型指令:EX阶段执行运算,MEM阶段空操作,WB阶段写回
- 访存型指令:EX阶段计算地址,MEM阶段访存,WB阶段将结果写入寄存器
- 控制型指令:EX阶段计算地址,MEM阶段送PC,WB阶段空操作

| 结构冒险(资源冲突) |
|---|
不同指令在同一时刻争用同一部件而形成冲突,如取指IF和访存MEM可能会冲突。 ![]() |
| 解决方法 |
𝟏. 插入空操作指令 (nop) 或硬件阻塞 (stall) 延迟执行相关指令,将后续指令暂停若干时钟周期,直至前条指令的结果可被安全读取。有软件插入空操作指令 (nop) 和硬件插入气泡 (stall) 两种方法。𝟐. 程序和数据的缓存分离 ![]() |
| 控制冒险(控制冲突) |
|---|
| 当遇到改变指令执行顺序的情况,例如转移指令、返回指令、异常和中断时,执行时会改变PC值从而造成断流。 转移指令在MEM阶段会判断转移条件是否满足,若转移条件满足,此时下方所有已执行的流水段全部作废。 ![]() |
| 解决方法 |
以上图为例,若转移条件满足,目标指令需延迟到转移指令的MEM阶段之后执行,若转移条件不满足,则没有浪费继续执行。𝟏. 插入空操作指令 (nop) 或硬件阻塞 (stall) 𝟐. 进行分支预测,尽早生成转移目标地址 分支预测分为静态预测和动态预测,动态预测是根据转移的历史情况调整预测策略,有较高准确率。 ![]() |
| 数据冒险(数据相关) |
|---|
下条指令的所用数据是上条指令的执行结果,下条指令使用时结果还没有写入。 ![]() |
| 解决方法 |
𝟏. 插入空操作指令 (nop) 或硬件阻塞 (stall) 𝟐. 使用旁路转发 设置转发通路,不等前条指令把结果写回寄存器,下条指令也不从寄存器读,直接将EX阶段数据转发到ALU的输入端,相当于EX到EX。 ![]() |
| Load-use数据冒险 |
|---|
Load-use是数据冒险中的特殊情况,下条指令的所用数据是上条指令的访存结果。 ![]() |
| 解决方法 |
Load-use冒险光靠旁路转发不能解决,必须延迟一个周期,再旁路转发。 ![]() |
高级流水线
| 高级流水线 | 内容 |
|---|---|
| 超标量流水线 | 能够在一个时钟周期内同时执行多条指令,需配备多套部件。CPI>1 |
| 超流水线 | 将流水段进一步划分,时钟周期减小主频提升。CPI = 1 |
| 超长指令字 | 将多条可并行的指令合并成一条具有多个操作码的超长指令。需配备多个执行部件。 |

多处理器
计算架构的概念
| 计算架构 | 含义 | 特点 |
|---|---|---|
| 单指令流单数据流 SISD | 一个控制器一套计算器 | 只能串行执行指令 |
| 单指令流多数据流 SIMD | 一个控制器多套计算器 | 可对大量数据作相同处理(向量处理器) |
| 多指令流单数据流 MISD | 多个控制器一套计算器 | 没必要存在 |
| 多指令流多数据流 MIMD | 多个控制器多套计算器 | 可对大量数据作不同处理(多核处理器) |

多处理器的概念
多指令流多数据流 MIMD 又可分为多核处理器、多处理器系统、多计算机系统。
| MIMD | 含义 |
|---|---|
| 多核处理器 | 一个CPU中有多个处理器核心 |
| 多处理器系统 | 一个计算机中有多个处理器,多个CPU共享一个内存 (SMP) 统一内存访问 (UMA):所有处理器共享唯一的集中式内存 非统一内存访问 (NUMA):主存划分成多个区域分配给不同CPU并以总线互连 |
| 多计算机系统 | 一个系统中有多个计算机 |


硬件多线程
硬件多线程必须为线程提供单独的通用寄存器组、程序计数器等,线程切换只需激活寄存器不必访存,大大减少了线程切换的开销。
| 实现方式 | 含义 |
|---|---|
| 细粒度多线程 | 多个线程之间轮流交叉执行指令 |
| 粗粒度多线程 | 连续若干时钟周期执行同一线程的指令,阻塞时切换线程且需清空流水线 |
| 同时多线程SMT | 单个时钟周期内同时执行多个线程的多条指令,实现了指令级并行和线程级并行,如超线程技术在一个核心中维护两套线程状态部件,但共享执行资源。 |
第六章 总线


总线分类

| 总线种类 | 介绍 |
|---|---|
| 片内总线 | CPU芯片内部的总线 |
| 系统总线 | 连接CPU、主存、IO接口的总线 |
| IO总线 | 连接主机与各类IO控制器的总线 |
系统总线

| 系统总线 | 功能 |
|---|---|
| 数据总线 | 传输数据、指令和中断类型号等,支持双向传输,数据总线位数反映一次传送的数据宽度。 |
| 地址总线 | 传输主存地址或IO端口地址,仅支持单向传输,地址总线位数反映空间地址位数。 |
| 控制总线 | 传输各种命令、反馈和定时信号,信号包括时钟、复位、总线请求/允许、中断请求/回答、存储器读写、IO读写、传输确认等。 |

总线的性能指标
| 性能指标 | 含义 |
|---|---|
| 总线时钟周期 | 总线有自己的时钟周期 |
| 总线时钟频率 | 总线时钟周期的倒数 |
| 总线传输周期 | 完成一次总线事务的时间 |
| 总线工作频率 | 每秒完成总线事务的次数 |
| 总线宽度 | 总线中数据线的条数,即并行传输的数据位数 |
| 总线带宽 | 最大数据传输速率,总线带宽=总线宽度×总线工作频率 |
| 总线复用 | 不同信息可在同一条线上传输,若没有单独地址线,地址就得通过数据线传送,即地址/数据线复用 |
| 总线寻址能力 | 地址线位数决定地址空间量,即寻址能力。16根地址线可寻址216个单元 |
总线事务

主从设备之间的一次完整信息交换,称为一个总线事务。包含三个阶段:
| 事务阶段 | 内容 |
|---|---|
| 地址传送阶段 | 主设备将目标地址和操作类型(读/写)通过总线传送给从设备 |
| 从设备响应(数据准备)阶段 | 从设备根据地址准备数据(该阶段耗时若未提及可忽略) |
| 数据传送阶段 | 完成实际数据在总线上的传输 |

| 传送方式 | 内容 |
|---|---|
| 非突发传送 | 主从设备之间一般只能传输一个总线宽度的数据 |
| 突发传送 | 寻址阶段发的是首地址,传输阶段传送多个连续单元的数据 |
| 传送方式 | 内容 |
|---|---|
| 串行传输 | 串行同步:双方时钟严格一致,效率高,但复杂成本高。仅添加首尾定界标记。 串行异步:双方使用独立时钟,无须严格同步。格式:起始位+数据位+校验位+停止位 |
| 并行传输 | 多条线同时传输,短距离延迟低吞吐高。信号串扰和时序偏移,限制工作频率的提升 |
总线定时

| 总线定时方式 | 内容 |
|---|---|
| 独占式 | 从发起请求到传送结束,总线全程被该事务占用 |
| 分离式 | 将总线事务分解为请求和应答两个子过程,避免准备时段的占用 |
| 独占式 | 内容 |
|---|---|
| 同步 | 采用统一的时钟来协调双方的定时。一个总线周期可以进行一次数据传送。 速度快、逻辑简单,不能及时校验,适用于总线长度短、设备速度接近的系统。 |
| 异步 | 无统一时钟,无固定间隔,依靠握手信号实现定时。 总线周期和长度可变、能及时校验更可靠,稍复杂且速度慢,适合速度差距大的系统。 |
| 半同步 | 增设一条Wait响应信号线,Wait信号有效则存在数据。 控制简单、可靠性高,时钟频率不能太高、速度不快,适合速度不高的简单系统。 |
异步定时又分以下三类:

| 异步定时 | 内容 |
|---|---|
| 不互锁 | 请求信号自动撤销 |
| 半互锁 | 请求信号必须等收到回答信号才可撤销,回答信号自动撤销 |
| 全互锁 | 请求信号必须等收到回答信号才可撤销,回答信号必须等请求信号撤销之后撤销 |
第七章 输入输出系统

IO接口
IO接口/控制器:主机和外设的交界面,实现二者的信息交换,本质是程序和硬件的结合。具体功能有:信号转换、数据暂存、地址译码、控制设备、暂存设备状态等。
IO端口:接口电路设置的若干寄存器,用来缓冲数据、设定控制、保存状态等,这些寄存器可以被CPU直接访问。

IO接口在主机侧通过IO总线(系统总线)与CPU、内存相连。数据线有三种功能:
- 发命令:发送命令字到IO控制寄存器
- 读状态:从状态寄存器中读取状态字
- 读写数据:从数据缓冲寄存器发送或读取数据
| 端口 | 作用 | 具体内容 |
|---|---|---|
| 数据端口 / 数据缓冲寄存器 | 读写数据 | 用来暂存与CPU之间传送的数据 |
| 状态端口 / 状态寄存器 | 读状态 | 用来记录接口或设备的状态信息 |
| 控制端口 / 控制寄存器 | 发命令 | 用来保存CPU对外设的控制命令 |
状态和控制寄存器在方向上相反,时间上错开,因此可合二为一。

IO接口和系统总线的连接

| 线路 | 传输内容 |
|---|---|
| 数据线 | 数据本身、状态信息/状态字、控制信息/控制字、命令/命令字、中断类型号 |
| 地址线 | IO端口地址 |
| 控制线 | 读写控制信号、中断请求信号、中断响应信号、仲裁信号、握手信号 |
IO端口的编址
IO端口须进行编址以能够被CPU访问,存在两种编址方式,独立编址和统一编址。
| 编址方式 | 含义 |
|---|---|
| 独立编址 | IO端口的地址空间与主存地址空间是两个独立的地址空间。 优点:IO端口数少,只需少量地址线,译码简单,寻址速度快 缺点:需专用IO指令,增加了指令系统的复杂性。 |
| 统一编址 | 主存地址空间分出一部分给IO端口进行编址,IO端口和主存单元在同一地址空间。 优点:CPU访IO端口和访存一致,无需专门IO指令,简化指令系统设计。 缺点:IO端口占用了一部分地址空间,导致减少了内存地址的可用范围。 |

IO方式
程序查询方式


CPU发命令后,外设准备数据,CPU持续查询IO状态(踏步等待),IO就绪后传送数据。
| 流程 | 内容 |
|---|---|
| 发命今 | 发送命令字到IO控制寄存器,向设备发送命令 |
| 读状态 | 从状态寄存器读取状态字,获得设备的状态信息 |
| 读写数据 | 从数据缓冲寄存器读写数据,完成数据交换 |
| 数据传输的两个阶段 | 内容 |
|---|---|
| 过程1:外设准备数据 | 外设将数据送到IO接口的数据缓冲寄存器中(取决于外设数据传输速率) |
| 过程2:CPU传输数据 | 将数据从数据端口传输到CPU(取决于指令执行的时间) |
程序中断方式
CPU发命令后,外设准备数据,CPU调度其他进程,IO就绪通过中断程序传输数据。
| 程序中断的工作流程 | 内容 |
|---|---|
| 中断请求 | 外部设备向CPU发起中断请求 |
| 中断响应判优 | 通过中断判优逻辑(一般由硬件实现)决定响应哪个中断请求 |
| 中断响应 | 中断响应被称为中断隐指令:关中断、保存断点PC和PSW内容、送中断向量 |
| 中断处理 | 中断响应+执行中断服务程序叫中断处理 |

DMA方式
DMA方式在外设与内存之间开辟了一条“直接数据通路”,信息传送不再经过CPU。
DMA控制器
使用DMA传输的设备,都接在DMA控制器上,DMA控制器负责数据交换的全过程。

| 寄存器 | 功能 |
|---|---|
| AR主存地址寄存器 | 存放将要读写的主存单元地址 |
| WC传送长度计数器 | 记录已写入字的个数 |
| BR数据缓冲寄存器 | 存放将要读写的数据字 |
DMA整体流程
| 整体流程 | 内容 |
|---|---|
| 预处理 | CPU完成准备工作 |
| 数据传输 | 由DMA控制器完成(硬件控制),数据传输过程无需CPU参与 |
| 后处理 | DMA控制器发出中断请求,CPU执行中断做后处理 |

DMA传输过程
DMA是将一个数据块交换到主存,具体将块以字为单位进行传输。
- 首先CPU进行预处理,设置AR/WC/BR初始值。
- 当字准备好时,设备向DMA控制器发起DMA请求,DMA控制器设置AR/WC/BR内容。
- DMA控制器向CPU发起总线请求,CPU响应此请求,DMA控制器将字传输到主存。
- AR自增,WC自增。
- WC溢出时,发送“溢出信号”到中断机构,中断机构发起中断,请求CPU进行后处理。
CPU每隔一个总线周期,对DMA请求检测和响应一次。

DMA访问主存
DMA不经过CPU直接访问主存,若和CPU发生访问冲突,有如下三种策略:
| 策略 | 解释 |
|---|---|
| 停止CPU访存 | DMA要访存时向CPU发送停止信号,CPU放弃系统总线的使用权, 整批数据传输完毕后,将总线控制器交给CPU |
| DMA与CPU交替访存 | 若CPU工作周期比主存存取周期长很多,采用交替访存 |
| 周期挪用 | a. CPU不在访存,挪用若干个主存存取周期给IO设备 b. CPU正在访存,等待CPU机器周期结束,CPU将总线占有权让出 c. 二者同时访存,CPU暂时放弃总线占有权,因IO访存优先于CPU访存 此时DMA使用分离式总线定时,传送一个字后立即释放总线。 |

IO方式的比较
| IO方式 | CPU和外设的工作情况 |
|---|---|
| 程序查询方式 | CPU和外设完全串行工作 |
| 程序中断方式 | CPU和外设并行,程序和传输串行 |
| DMA方式 | CPU和外设并行,程序和传输并行 |
| 对比 | 中断方式 | DMA方式 |
|---|---|---|
| 数据传输 | CPU控制数据传输,每次传一个字 | DMA控制数据传输,每次传一个块 |
| 中断请求 | 发送中断请求传送数据 | DMA发送后处理中断请求 |
| CPU参与率 | 高,需要参与数据传输 | 低,无需参与数据传输 |
| 适用场景 | 低速小数据设备 | 高速大容量设备 |
| 优先级 | DMA > 中断 | |
























𝟐. 使用旁路转发 

