跳转至

计算机组成原理

主存地址空间与MAR(存储器地址寄存器)位数的关系

MAR的位数是由系统的主存地址空间大小决定的,代表了CPU最大能寻址的范围,与当前实际安装了多少容量的内存无关。

IEEE 754

  1. float (32位单精度浮点数)

总共占用 32 bits(4字节)。

结构划分 符号位 (S) 阶码/指数 (E) 尾数 (M)
位数 1 位 8 位 23 位
含义 0 为正,1 为负 采用移码表示(偏移量为 127) 隐藏最高位的 1,只存小数部分
  1. double (64位双精度浮点数)

总共占用 64 bits(8字节)。

结构划分 符号位 (S) 阶码/指数 (E) 尾数 (M)
位数 1 位 11 位 52 位
含义 0 为正,1 为负 采用移码表示(偏移量为 1023) 隐藏最高位的 1,只存小数部分
  1. 牢记,牢记。若问及最大非规格化正数应当是最小规格化正数 - 最小非规格化正数。也即是2^-126^ - 2^-126^ * 2^-23^即\[(1 - 2^{-23}) \times 2^{-126}\]

image-20260918150046050

栈空间的访问

栈本质上就是主存(RAM)中划出来的一片普通存储区域而已,因此可以使用普通的访存指令实现对栈空间的读写。

计算操作控制字段的尾数

“字段直接编码法”必须在每个字段中留出一个状态来表示“不操作”。

中断

  1. INTR(可屏蔽)和NMI(不可屏蔽)都是外中断,都需要在一条指令结束后进行响应。只有内中断可以在一条指令执行中进行响应。

  2. 优先级排名:DMA请求 > 硬件故障 (NMI) > 内中断 (异常) > DMA结束中断 (高速 INTR) > 普通 I/O 中断 (低速 INTR)

  3. 外部设备通过中断控制器向CPU发中断请求信号。当中断处理完成后,通常是由CPU向中断控制器发送中断结束信号,告知中断控制器该中断已处理完毕。

逻辑移位和算数移位

算数移位才需要符号扩充。

CF与OF

1. 关于 CF(无符号数进位/借位标志)

  • 减法(瞪眼法): 直接看作无符号数,A < B 时一定产生借位,CF = 1。
  • 加法(瞪眼法): 如果算出来的结果反而比其中任何一个加数还要小,就说明发生了进位溢出,此时 CF = 1(例如 8 位下 \(250 + 10 = 4\),\(4 < 250\),一眼就能看出 CF = 1)。
  • 公式推导: CF = Cout ^ Cin(Sub)

2. 关于 OF(有符号数溢出标志)

  • 排除法(瞪眼法): 只有同号相加、异号相减才会溢出
  • 公式推导: OF = Cn ^ Cn - 1(最高位产生的进位异或此高位产生的进位)。
  • 一般方法: 老老实实算出来看符号位。

全相联、组相联、直接映射

全相联(所有块一个组)

组相联

直接映射(一个块一个组)

image-20260918163506842

写策略

image-20260925172747698

犬吠(全写法与非写分配法),回血(回写法与写分配法)

常见指令

  1. lw (Load Word)
  2. sw (Store Word)
  3. beq (Branch if Equal)
  4. bne (Branch if Not Equal)

数据相关

当一条指令读取某个寄存器时,只需要向前找“最近一次写这个寄存器”的指令建立 RAW 数据相关;更早对这个寄存器的写入已经被后面的写入覆盖,因此不再是这次读取所依赖的数据来源。

I/O 接口、控制器、适配器与驱动器

  1. I/O 接口位于 CPU/主存和 I/O 设备之间,负责命令传递、状态反馈、数据缓冲、速度匹配等工作;在 408 中,控制器、适配器通常都可以看作 I/O 接口。以磁盘为例,结构可理解为:CPU → 磁盘控制器 → 磁盘驱动器 → 磁盘介质,其中磁盘控制器属于 I/O 接口,负责接收 CPU 命令并控制数据传输;磁盘驱动器属于 I/O 设备的硬件执行部分,负责让盘片、磁头等真正完成读写动作,因此它不是 I/O 接口。要注意,驱动器 drive 是硬件,驱动程序 driver 是软件;“驱动器”这个叫法在 408 中主要常见于磁盘、光盘、磁带等存储类设备。
  2. 驱动程序 = 软件,在控制器上面 控制器 = 硬件,负责控制设备 驱动器 = 具体硬件设备,通常在控制器下面
  3. 上述的驱动程序就是对应OS中IO分层里的驱动程序。用户程序 -> 设备独立性软件 -> 设备驱动程序 -> 中断处理程序 -> I/O接口(设备控制器) -> 具体设备。

  4. 设备驱动程序:和具体硬件强相关,负责把 OS 发出的较抽象 I/O 请求,转换成具体设备控制器能执行的命令。

  5. 设备独立性软件:尽量屏蔽不同设备之间的差异,向上提供统一的 I/O 使用方式,使上层程序不用关心“这是磁盘、打印机还是别的设备”。

  6. 设备驱动程序和控制器的功能可以理解为两个层次的控制,前者是软件层次,后者是硬件层次。所以考试时看见设备驱动程序控制设备读写等之类的说法是正确的。

  7. I/O 控制方式由硬件系统所支持的机制决定,设备驱动程序本身不能随意决定采用查询、中断、DMA 等哪种方式,但驱动程序可以针对既定的 I/O 控制方式完成相应的初始化、参数配置和控制。

image-20261015145356537

各寄存器宽度

部件/寄存器 宽度主要由什么决定 如果题目给总线,可以怎么判断 核心含义
MAR 地址长度 / 主存可寻址单元数 通常 MAR 位数 = 地址线根数 存放主存地址
PC 地址长度 通常与 MAR、地址线位数一致 存放下一条指令地址
MDR 存储字长、数据通路设计 408 常见题中可结合 数据线宽度 判断 暂存主存读出/写入的数据
IR 指令字长 与地址线、数据线 没有必然相等关系 存放当前指令
ACC 机器字长 不能直接由数据线根数推出 存放运算数据/结果
GPR 通用寄存器 机器字长 不能直接由数据线根数推出 CPU 内部数据寄存器
ALU 机器字长 / 运算数据宽度 不能直接由数据线根数推出 一次能运算多少位数据
SP 地址长度 通常与地址长度有关 存放栈顶地址
基址寄存器 地址长度 / 有效地址长度 通常与地址长度有关 存放基地址
变址寄存器 地址长度 / 有效地址计算需要 通常与地址长度有关 参与有效地址计算

ISA和微指令体系所管辖范围

指令是什么、怎么编码、语义是什么、能访问哪些寄存器、怎么寻址=> ISA

指令怎么取指、译码、流水执行、转发、阻塞、预测=> 微体系结构

高级语言 -> 可执行目标文件

预处理(将inlude的头文件读入,宏定义等等) -> 编译(高级语言翻译为汇编语言) -> 汇编(汇编语言翻译为机器语言) -> 链接(将多个目标文件以及所需的库文件连接起来,生成可执行文件)

image-20261013141916769

采用硬件阻塞方式处理控制冒险

题中若问及发生流水线阻塞的指令,就算采用硬件阻塞方式处理控制冒险,也算发生流水线阻塞。

Cache与主存、主存与外存

image-20261006140522935

B可以理解为Cache太快了,因此需要硬件来进行替换;对于C,Cache-主存和主存-外存都通常采用回写法;对于D,前半句对,直接映射实现简单,速度快,但是对于访问外存,开销大,所以需要提高命中率,多用全相联或组相联。

通常命中率关系是:

全相联 >= 组相联 >= 直接映射

如果只看“查找速度 / 命中判断速度”,一般是:

直接映射 > 组相联 > 全相联

越自由,冲突越少,命中率越高;但查找时要比较的位置越多,所以越慢。

总线

同步总线与异步总线

  1. 同步总线并不代表着时钟频率一定等于工作频率,只是用统一时钟规定时序,一个时钟周期内可以传一次数据,多次数据或者若干时钟周期才传一次数据,因此工作频率不一定等于时钟频率。
  2. 异步总线由握手信号定时,一次握手过程完成一组数据交换。

总线带宽

总线带宽(最大数据传输速率)是理想情况下总线单位时间最多能传多少数据:

\[总线带宽=总线频率\times每周期传输次数\times总线宽度\]

要区分三个概念:

概念 含义
总线时钟频率 每秒有多少个时钟周期
总线工作频率(总线频率*每周期传输次数) 每秒理论上可以进行多少次数据传输
实际数据传输速率 每秒实际传输了多少有效数据

总线事务

总线事务是指从总线请求开始,到完成一次总线操作为止的整个过程。

在 408 中,可以这样理解:

  • 总线事务:完成一次总线操作的全过程,例如一次总线读或总线写。
  • 总线传输:在总线上实际传送数据的过程。
  • 总线周期:完成一次总线事务所需的时间(传统总线模型下)。

总线事务是CPU与内存/外设通过总线进行数据交换的过程,其结束是总线操作的自然完成,仅需硬件握手信号确人,无需触发中断请求,不属于中断事件。

DMA控制器控制的数据传输通路

指的是终点和起点,为主存和设备接口

C/C++数据类型转换

在常见的补码机器上,对于整数由低位宽转换为高位宽,可以这样理解:

先按照原数据类型进行扩展,再按照目标数据类型解释。

RSIC和CSIC

CISC(复杂指令集计算机):指令种类多、功能复杂,一条指令可以完成较复杂的操作。

RISC(精简指令集计算机):指令种类较少、功能相对简单,强调通过简单指令的组合完成复杂操作,便于流水线执行。

RISC 通常只有 Load、Store 指令能够访问主存,算术逻辑运算主要在寄存器之间完成。所以通常需要大量寄存器传递过程调用时的参数。

RISC 常采用硬布线控制,但不是必须;CISC 常采用微程序控制,也不是必须。

image-20261008141424070

Cache索引

严格来说,Cache 索引只包括组号(或行号),不包括块内地址。

具体要看 Cache 的映射方式:

  • 直接映射:索引是 Cache 行号。
  • 组相联映射:索引是 Cache 组号,不包括组内的路号。
  • 全相联映射:没有组索引位。

题中数组在页中、块中偏移量不为0时,一定注意这会影响Cache缺失次数以及缺页次数

进程虚拟地址空间组成

image-20261008161113304

BSS 段(Block Started by Symbol)是程序中用于存放未初始化或初始化为 0 的全局变量、静态变量的内存区域。

多发技术

image-20261010135542597

桥接器

  1. 总线与总线之间:通过桥接器连接。
  2. 设备与总线之间:通过总线接口连接。
  3. 桥接器的作用: 连接不同总线,实现速度匹配、数据缓冲和必要的协议转换。

中断请求的产生与当前正在执行指令的关系

内中断:同步,与当前执行的指令有关。

外中断:异步,与当前执行的指令无关。

在 408 考研中,如果题目只说“中断”,没有特别说明,通常默认指外中断。

但不是绝对的,要结合题目语境判断。

单周期多周期

单周期 CPU 与多周期 CPU(408 考点)

比较项目 单周期 CPU 多周期 CPU
指令执行 一条指令在一个时钟周期内完成 一条指令需要多个时钟周期
CPI 恒为 1 通常大于 1,不同指令可不同
时钟周期长度 由执行时间最长的指令决定 由耗时最长的执行阶段决定
时钟频率 较低 较高
控制信号 一个时钟周期内稳定后保持不变 随执行阶段逐周期改变
单总线数据通路 不能采用(408 常规模型) 可以采用
硬件资源 通常需要更多独立硬件,支持并行操作 不同阶段可以复用硬件
控制器 通常采用组合逻辑控制 通常采用有限状态机控制
指令执行时间 所有指令均占一个相同长度的时钟周期 不同指令可能不同
流水线 不采用指令流水线 多周期本身不等于流水线

注意:

  • 单周期 CPU 的控制信号在一个周期内稳定后保持不变,不需要按多个时钟阶段切换。
  • 单周期 CPU 不能采用单总线数据通路,是针对 408 常规同步数据通路模型而言。
  • 单周期 CPU 的时钟频率通常较低,但 CPI = 1 不代表执行速度一定更快。

工作集

求某时刻的工作集就从该处往前数工作集大小个,然后去重即可。

地址划分与 Cache 映射

就跟虚页号有的时候也分为页目录好和页号,块号也会根据映射方式的不同分为好几部分,如果直接按二进制算的话可以免去很多计算。

能直接被硬件执行的

能够被 CPU 直接执行的语言程序:只有机器语言程序。

能够被硬件直接执行或处理的指令:除了机器指令,还有微程序控制器中的微指令。

Cache 容量计算

核心公式

Cache 数据区容量 = Cache 行数 × 主存块大小

  • 一个 Cache 行的数据区存放一个主存块。
  • Cache 行的数据区大小 = 主存块大小。
  • 计算数据区容量时,不需要考虑 Tag、有效位等附加信息。

数据区容量与总容量的区别

比较项 Cache 数据区容量 Cache 总容量
数据块 包含 包含
Tag(标记位) 不包含 包含
有效位、脏位等 不包含 包含
计算方法 行数 × 块大小 行数 × 每行总位数

易错点

  • 主存块大小 = Cache 行的数据区大小,不等于 Cache 行的总大小。
  • Cache 的映射方式影响标记位等信息的位数,但不改变已知行数和块大小下的数据区容量。
  • 计算 Cache 总容量时,必须考虑题目规定的标记位、有效位等开销。

记忆:求数据区容量,直接行数 × 块大小;求总容量,还要加标记位和状态位。

磁盘内数据的修改

读出来到内存中,在内存中修改,修改完后写回磁盘。这一共算两次访问磁盘。

DMA响应时机与中断IO方式

image-20261020142439592

中断IO方式下数据传送通过软件完成。这句话是正确的,当然整个过程中也需要硬件参与。这里的软件指的是设备驱动程序中的中断服务程序。

多体交叉存储器、Cache 与 CPU 执行时间

高位交叉编址与低位交叉编址

对比 高位交叉编址 低位交叉编址
存储体编号 地址高位决定 字地址低位决定
连续地址 集中在同一个存储体 依次分布在不同存储体
连续访存 通常需要等待同一存储体 可交叉并行访问
特点 适合存储体相对独立工作 适合连续、批量数据传送

image-20261020163031103

记忆:高位交叉连续地址集中,低位交叉连续地址分散。

多体交叉存储器的访问时间

设存储周期为 \(T\),存储体数量为 \(m\)。

理想情况下,连续交叉访问的最小启动间隔:

\[\boxed{\Delta t=\frac{T}{m}}\]

理解: - 存储周期:同一存储体两次启动存取操作的最小间隔。 - 多个存储体轮流启动,再次轮到第一个存储体时,恰好经过一个存储周期。 - 多体交叉提高吞吐率,并没有缩短单个存储体的存储周期。 - 实际启动间隔还受总线周期、存储器接口等条件限制。

突发传送时间(流水线)

一次读突发传送:

传送地址和命令 → 等待首个数据准备完成 → 连续传送数据

在连续数据能够交叠准备、总线能够持续传送的条件下:

\[\boxed{T_{\text{总}}=T_{\text{地址}}+T_{\text{首字准备}}+T_{\text{数据传送}}}\]

后续存储字的准备过程可以与前面的数据传送重叠,不必对每个存储字重复计算完整存储周期。

平均访存次数与 Cache 缺失

CPU 访存包括取指访存和数据访存,因此一条指令可能多次访存。

\[\boxed{\text{总访存次数}=\text{指令条数}\times\text{平均每条指令访存次数}}\]

访存不一定意味着实际访问主存: - 不考虑 Cache:访存通常直接理解为访问主存。 - 考虑 Cache:CPU 访存通常先查询 Cache,命中直接返回,缺失才需要访问主存取块。

\[\boxed{\text{缺失次数}=\text{总访存次数}\times\text{Cache缺失率}}\]

注意:Cache 缺失率针对访存次数,不一定针对指令条数。

CPI 与 CPU 执行时间

CPI:平均每条指令所需的 CPU 时钟周期数。

  • CPU 执行指令包括取指、译码、执行、访存等操作,并不只是计算。
  • CPU 执行时间包含因 Cache 缺失产生的 CPU 停顿时间。
  • 基础 CPI(Cache 全命中)包含正常 Cache 访问开销。
  • 实际 CPI 还可能包含 Cache 缺失等导致的停顿周期。

\[\boxed{\text{实际CPI}=\text{基础CPI}+\text{平均额外停顿周期}}\]

CPU 执行时间的计算

当题目给出 Cache 全命中时的 CPI 和 Cache 缺失损失时间时:

\[\boxed{T_{\text{CPU}}=N\times CPI\times T_c+N\times a\times f\times P}\]

符号 含义
\(N\) 指令条数
\(CPI\) Cache 全命中时的基础 CPI
\(T_c\) CPU 时钟周期
\(a\) 平均每条指令访存次数
\(f\) Cache 缺失率
\(P\) 每次缺失的额外损失时间

理解:基础执行时间 + Cache 缺失额外开销。

基础 CPI 已包含正常 Cache 命中时间,不能重复计算。

Cache 缺失时间是否包含命中时间

题目表述 理解
Cache 缺失损失时间(Miss Penalty) 相对于正常命中额外增加的时间
Cache 缺失时的总访问时间 包含正常 Cache 查询及缺失处理时间
Cache 全命中时的 CPI 已包含正常 Cache 访问开销
主存访问时间 仅说明主存操作时间,是否额外计入取决于题目模型

平均访存时间可以写成:

\[\boxed{AMAT=T_{\text{命中}}+f\times P}\]

也可以写成:

\[\boxed{AMAT=(1-f)T_{\text{命中}}+fT_{\text{缺失总时间}}}\]

注意: - 缺失损失可能包括主存读取、脏块写回、Cache 填充等开销。 - 区分“额外损失时间”和“缺失时的总访问时间”,避免重复计时。

冷知识

  1. 寄存器未赋值也会有某种二进制的组合,因此取反不会有问题。