计算机组成原理

第一章

1.1 计算机硬件发展

电子管 --> 晶体管 --> 集成电路 --> 超大规模集成电路

1.2 计算机系统层次结构

  • 冯诺依曼机的特点
    • "存储程序"的工作方式,控制流驱动
    • 五大组成
      • 存储器: 主, 辅, MAR, MDR
      • 运算器: ALU。累加器,乘商寄存器,操作数寄存器······
      • 控制器:PC,IR,CU
      • 输入
      • 输出
  • CPU:ALU + CU + PC + IR + GPRs(通用寄存器组,又用X代指) + MAR + MDR
  • 冯诺依曼模型机概念图
  • CPU 和 主存之间有一组总线:
    • 地址
    • 控制
    • 数据
  • 计算机系统的层次结构: 书上的5层说法
  • .c - > .exe的中间流程

1.3 计算机主要性能指标

  • 机器字长
  • 数据通路带宽
  • 主存容量
  • 运算速度
    • 吞吐量,吞吐率
    • 响应时间
    • CPU时钟周期
    • 主频
    • CPI(Circle Per Instruction)
    • IPS (Instructions Per Second)
    • MIPS (Million Instructions Per Second)
    • CPU 执行时间
    • FLOPS
  • Benchmarks (基准程序)

第二章

数制与编码

  • 进位计数制及其转换
    • 常用进制:二进制、八进制、十六进制
    • 转换方法:R进制→十进制(按权展开)、十进制→R进制(除基取余/乘基取整)、二→八/十六(分组转换)
  • 定点数的编码表示
    • 原码:符号位+绝对值,0有两表示
    • 补码:正数同原码,负数=模-绝对值,0唯一
    • 反码:正数同原码,负数=原码除符号位取反,0有两表示
    • 移码:真值+偏置值,用于阶码,0唯一
  • 整数的表示
    • 无符号整数:全为数值位,范围0~2ⁿ-1
    • 有符号整数:补码表示,范围-2ⁿ⁻¹~2ⁿ⁻¹-1
  • C语言整数类型及转换
    • 类型:short、int、long(有符号/无符号)
    • 转换规则:同字长(位值不变,解释方式变)、不同字长(截断/扩展:零扩展/符号扩展)

运算方法和运算电路

  • 基本运算部件
    • 全加器:输入A、B、低位进位,输出和、高位进位
    • 加法器:串行进位(进位逐级传递)、并行进位(CLA部件并行产生进位)
    • ALU:实现算术+逻辑运算,核心为带标志加法器
  • 移位运算
    • 逻辑移位:无符号数,左移补0(溢出看最高位),右移补0
    • 算术移位:有符号数(补码),左移补0(溢出看符号位变化),右移补符号位
  • 加减运算
    • 补码加减:[A±B]补=[A]补+[±B]补
    • 溢出判断:单符号位(同号相加/异号相减结果符号异常)、双符号位(符号位不同)、进位异或(符号位与最高数位进位不同)
  • 乘除运算
    • 乘法:原码(符号异或,数值相乘=加法+移位),补码(Booth算法)
    • 除法:原码(符号异或,数值相除=减法+移位),补码(加减交替法)。注:存在不需要加的方法

整数的表示和运算

  • 无符号整数:运算规则,溢出判断(结果超出范围)
  • 有符号整数:补码运算,符号位参与运算,溢出处理
  • C语言运算特点:混合运算时类型提升,无符号与有符号运算按无符号处理

浮点数的表示和运算

  • 浮点数表示
    • 格式:N=(-1)ˢ×M×Rᴱ(符号s、尾数M、阶码E)
    • IEEE 754标准:单精度(1符+8阶+23尾)、双精度(1符+11阶+52尾),阶码移码(偏置127/1023),尾数隐藏最高位1
  • 规格化:M范围[1/R,1)(原码),左规(尾数左移,阶码-1),右规(尾数右移,阶码+1)
  • 加减运算步骤
    • 对阶:小阶向大阶看齐,尾数右移
    • 尾数运算:定点加减
    • 规格化:左规/右规
    • 舍入:就近舍入、正向/负向舍入、截断
    • 溢出判断:阶码上溢(结果溢出)、下溢(按0处理)
  • 存储相关:大小端(字节排列)、边界对齐(地址为大小整数倍)。注:计算机按字读取。

Q&A

1. IEEE754 中 float 的阶码为什么偏置值要设置为 127 而不是 128?

答:IEEE 754 单精度浮点数(float)的阶码为 8 位,偏置值设为 127 而非 128,核心原因是兼顾阶码范围的对称性、非规格化数的编码需求及硬件实现简便性

  • 阶码范围对称性:8 位无符号阶码的存储值范围是 0~255,偏置值 127 对应的阶码真值为 “存储值 - 127”,范围是 - 127~128(覆盖正负对称的区间);若偏置值为 128,真值范围为 - 128~127,正阶码范围(127)比负阶码范围(128)小 1,对称性更差。
  • 适配非规格化数与特殊值:IEEE 754 规定 “阶码全 0” 表示非规格化数(隐含阶码为 - 127),“阶码全 1” 表示特殊值(无穷大、NaN)。偏置值 127 可使非规格化数的隐含阶码(-127)恰好衔接规格化数的最小阶码(-126),形成连续的阶码序列;若用 128,非规格化数隐含阶码为 - 128,与规格化数最小阶码(-127)的衔接逻辑一致,但正阶码最大范围缩小,不利于表示更大的数。
  • 硬件实现简便:127 是 2⁷-1(8 位的 “半满值减 1”),阶码运算(如对阶时计算阶差)时,“存储值 - 127” 的逻辑更易通过加法器实现,且能减少因范围不对称导致的溢出概率。

2. 如何通过 ZF、OF、SF 标志位判断有符号数 A、B 的大小关系?

答:基于 A-B 的运算结果,规则如下:

  • 若 ZF=1:A=B;
  • 若 ZF=0(A≠B):
    • 未溢出(OF=0):SF=0 则 A>B,SF=1 则 A<B;
    • 溢出(OF=1):OF=SF 则 A>B(如正溢出时结果符号为负但真实为正),OF≠SF 则 A<B(如负溢出时结果符号为正但真实为负)。

3. 有符号数与无符号数的溢出有何区别?

答:核心差异体现在定义、判断标志和本质:

  • 无符号数:超出范围(0~2ⁿ-1)时溢出,由进位 / 借位标志 CF 判断(CF=1 表示溢出),本质是数值超上限导致高位截断;
  • 有符号数:超出范围(-2ⁿ⁻¹~2ⁿ⁻¹-1)时溢出,由溢出标志 OF 判断(OF=1 表示溢出),本质是补码符号位错误(如正数 + 正数 = 负数)。

4. 无符号数减法中,被减数 < 减数时为何 CF=1(溢出)?

答:无符号数无法表示负数,当被减数 <减数时,运算需从最高位借位(相当于 “借 1 当 2ⁿ”),此时 CF=1 标志借位发生,说明结果为负数(超出无符号数范围),即 “溢出”。例如 8 位无符号数 5-10,被减数 < 减数,CF=1,结果实际为负数(截断后为 251,无意义)。

5. 原码小数乘法的运算过程是什么?

答:符号位与数值位分开处理:

  • 符号位:被乘数与乘数符号位异或(同号为正,异号为负);
  • 数值位:逐位相乘 + 移位累加。例如 0.1101×0.1011,将乘数每一位与被乘数相乘(0 位结果为 0,1 位结果为被乘数),按权重移位后累加,最终结合符号位得结果。

6. 阵列乘法器为何能单周期完成运算?

答:核心是并行性:

  • 与门阵列并行生成所有部分积(aᵢbⱼ);
  • 加法器阵列(半加器 / 全加器)并行累加部分积,进位沿斜对角传递(非串行),关键路径延迟仅与加法器级数相关(如 4×4 乘法器需 3 级全加器),无寄存器延迟,故单周期内完成。

7. 32 位 int 与 unsigned int 相乘如何判断溢出?

答:基于 64 位完整乘积的高 32 位与低 32 位关系:

  • int 型(有符号):若高 32 位每一位均等于低 32 位的符号位(补码符号扩展特性),则不溢出;否则溢出;
  • unsigned int 型(无符号):若高 32 位全为 0,则不溢出(乘积≤2³²-1);否则溢出(乘积 > 2³²-1)。

8. Booth 算法的核心原理是什么?

答:通过分析乘数补码的 “位对”(yᵢ, yᵢ₋₋₁,y₋₁=0)简化补码乘法:

  • 位对为 00 或 11:部分积右移 1 位;
  • 位对为 01:部分积加被乘数补码后右移 1 位;
  • 位对为 10:部分积减被乘数补码(加其相反数)后右移 1 位。
    优势:减少连续 1 的加法次数,适合硬件实现。

9. 除法时被除数为何需要扩展?如何扩展?

答:为匹配 “2n 位被除数 ÷n 位除数 = n 位商 + n 位余数” 的规则,保证位数充足:

  • 定点正小数(原码):低位添 n 个 0(不改变小数数值);
  • 定点正整数(无符号):高位添 n 个 0(不改变整数数值)。
    若除数为 0,触发 “除数为 0” 异常,由操作系统处理。

10. 浮点数对阶时移出位如何保留?

答:通过硬件寄存器存储:

  • 保护位(G):存储右移时移出的最高位;
  • 舍入位(R):存储保护位右侧的移出位;
  • 粘滞位(S):若舍入位有 1 则置 1。
    这些位在舍入阶段参与调整(如就近舍入),避免精度损失。

11. 什么是隐藏位?为何必须还原?

答:隐藏位是 IEEE 754 规格化浮点数中省略的最高位 1(尾数形式为 1.M,存储时仅保留 M),作用是节省存储空间。
必须还原的原因:区分规格化数(1.M)与非规格化数(0.M),确保运算时尾数数值真实(如 1.M≠M,不还原会导致数值错误)。

12. 右规为何只需一次?

答:右规触发于尾数相加产生进位(形式为 11.××…×,整数部分两位 1),二进制中进位最多 1 位,故一次右移即可将整数部分缩减为 1 位(1.M),同时阶码加 1 补偿,无需多次操作。

13. 就近舍入与 0 舍 1 入的规则是什么?

答:- 就近舍入

  • 非中间值:舍入到最近的可表示数;
  • 中间值:舍入到末位为偶数的数(二进制中末位为 0 即为偶数)。
  • 0 舍 1 入:针对超出保留位的舍入位,0 则舍弃,1 则向保留部分末位进 1(如右规时移出位为 1 则入 1)。

14. C语言中无符号和有符号之间的计算规则

  • 在 C 语言中,当有符号类型与无符号类型进行计算(包括比较、算术运算等)时,遵循 “有符号类型会被隐式转换为无符号类型” 的规则,之后再进行运算。

易错点

x - y在硬件操作中的输入和进位输入

在加法器中,有符号数和无符号数的减法运算 xyx - y硬件操作层面完全相同,即通过“将被减数 yy 取反后输入加法器,同时将进位输入端(通常记为 CinC_{in})置为1”来实现,本质是将减法转换为“x+(y)x + (-y)”的加法运算。具体原因如下:

1. 减法转加法的核心逻辑(无论有符号/无符号)

无论是有符号数还是无符号数,减法 xyx - y 均可转换为加法:xy=x+(y)x - y = x + (-y)
在二进制加法器中,“y-y”的硬件实现依赖“取反加1”:

  • yy 的二进制位逐位取反(得到“反码”);
  • 再通过进位输入端 Cin=1C_{in} = 1 实现“加1”,最终得到“y-y”的补码(无符号数中是“模补码”,有符号数中是“补码”)。

因此,无论 xxyy 是有符号还是无符号,加法器的输入操作完全一致:

  • 一个输入端接 xx 的二进制值;
  • 另一个输入端接 yy 的取反值;
  • 进位输入端 Cin=1C_{in} = 1

2. 差异在于“结果的解释”和“标志位判断”

虽然硬件操作相同,但有符号数和无符号数对运算结果的解释方式溢出/借位判断不同:

  • 无符号数:结果视为无符号整数,关注“借位标志(CFCF)”。若运算后进位输出 Cout=0C_{out} = 0,表示发生借位(x<yx < y);Cout=1C_{out} = 1 表示无借位(xyx \geq y)。
  • 有符号数:结果视为补码表示的有符号整数,关注“溢出标志(OFOF)”。若两个同号数相减后结果符号异常(如正数减负数结果为负),则 OF=1OF = 1(溢出),否则 OF=0OF = 0

结论

加法器中,有符号数和无符号数的减法运算 xyx - y硬件操作完全相同(均为 yy 取反输入,进位 Cin=1C_{in} = 1),差异仅在于对结果的解释(无符号/有符号)和标志位(CFCF/OFOF)的判断逻辑,与运算过程本身无关。

判断OF/CF

硬件层面标志寄存器中会同时产生OF和CF,OF用有符号数判断,CF用无符号数判断。

计算机如何实现AB-A-B ?

编译器先处理,之后要先计算A-A, 求得补码, 然后计算减法, 用加法器算减法, 其控制信号sub置为1: A-A的补码输入加法器, BB先经过异或门(异或1(sub))取反之后输入加法器输入端, 同时sub输入到CinC_{in}, 此时CinC{in}为1, 进而实现了对B-B的补码.

对阶、左规、右规、尾数舍入

在浮点数运算(如加减乘除)中,对阶、左规、右规、尾数舍入是关键操作,其可能导致的情况及尾数溢出的根源可总结如下:

一、对阶(浮点数加减运算的第一步)

定义:使两个参与运算的浮点数阶码相同(小阶向大阶对齐),以便尾数直接运算。
操作:阶码较小的数,其尾数右移(每右移1位,阶码+1),直到阶码与大阶相等。

可能导致的情况

  1. 精度损失:尾数右移时,低位有效数字被移出(丢失),导致运算结果精度下降(尤其是右移次数较多时)。
  2. 无阶码溢出:对阶后阶码等于原较大阶码,未超过原阶码范围,因此不会导致阶码上溢或下溢。

二、左规(规格化操作之一)

定义:当尾数运算结果不符合规格化要求(绝对值太小,如正数尾数<1,即最高位为0)时,通过尾数左移、阶码减小,使其恢复规格化的操作。
规格化标准:正数尾数需满足 1≤尾数<2(二进制为 1.xxxx...),负数(补码)需满足 尾数≤-1(二进制为 1.xxxx...,符号位与最高有效位相同)。

可能导致的情况

  1. 阶码下溢风险:左规时阶码需随尾数左移次数同步减小(每左移1位,阶码-1)。若原阶码已为最小可表示阶码(如IEEE 754双精度的-1023),继续减小会导致阶码下溢(结果为“非规格化数”或“零”)。
  2. 无精度损失:尾数左移时,高位可能被移出(但左规目标是使最高位为1,通常仅移除前导0,无损失)。

三、右规(规格化操作之一)

定义:当尾数运算结果超出规格化范围(绝对值太大,如正数尾数≥2,即最高位产生进位)时,通过尾数右移、阶码增大,使其恢复规格化的操作。

可能导致的情况

  1. 阶码上溢风险:右规时阶码需随尾数右移次数同步增大(每右移1位,阶码+1)。若原阶码已为最大可表示阶码(如IEEE 754双精度的1023),继续增大会导致阶码上溢(结果为“无穷大”)。
  2. 精度损失:尾数右移时,低位有效数字被移出,需配合舍入处理(否则误差更大)。

四、尾数舍入(精度调整操作)

定义:当尾数右移(对阶、右规)或运算后位数超过规定长度(如52位尾数)时,对超出部分进行截断或调整,以保留规定位数的操作(目的是减少精度损失)。

可能导致的情况

  1. 精度误差:舍入本质是近似处理,可能引入误差(如“0舍1入”法可能使尾数增大,“恒置1”法可能使尾数偏小)。
  2. 二次规格化需求:舍入后尾数可能再次偏离规格化范围(如舍入后正数尾数≥2,需右规;或舍入后正数尾数<1,需左规),进而可能引发阶码上溢/下溢。

五、尾数溢出的根源

尾数溢出是指尾数运算结果超出规格化范围(绝对值≥2,对正数即 尾数≥2,对补码负数即 尾数<-2),其直接原因是尾数运算(加减、乘)的结果超过了规格化上限

  • 加法/减法:两个同号尾数相加(或异号尾数相减)时,可能产生进位。例如:
    正数尾数 1.1000(1.5) + 1.0100(1.25) = 10.1100(2.75),结果≥2,尾数溢出。
  • 乘法:两个较大尾数相乘时,结果可能超过2。例如:
    正数尾数 1.1111(≈1.9375) × 1.1111(≈1.9375)≈3.75,结果≥2,尾数溢出。

注意:尾数溢出≠浮点数溢出。尾数溢出可通过右规调整(尾数右移、阶码+1)恢复规格化,仅当右规后阶码上溢时,才导致浮点数整体溢出。

总结

操作 核心行为 可能导致的情况
对阶 小阶尾数右移、阶码增大 精度损失(无阶码溢出)
左规 尾数左移、阶码减小 阶码下溢风险、轻微精度损失
右规 尾数右移、阶码增大 阶码上溢风险、精度损失(需舍入)
尾数舍入 截断/调整超出位数 精度误差、二次规格化(引发阶码溢风险)
尾数溢出 尾数≥2(或≤-2) 需右规调整,可能间接导致阶码上溢

第三章

存储器概述

  • 分类
    • 按作用:主存、辅存、Cache
    • 按介质:磁表面、磁芯、半导体、光存储器
    • 按存取方式:RAM、ROM、串行访问存储器
    • 按信息可保存性:易失性(RAM)、非易失性(ROM等)
  • 性能指标
    • 存储容量=存储字数×字长
    • 单位成本:位价=总成本/总容量
    • 存储速度:存取时间、存取周期、主存带宽
  • 多级层次结构
    • 结构:寄存器→Cache→主存→辅存
    • 作用:解决速度、容量、成本矛盾
    • Cache-主存层:硬件管理,解决速度不匹配
    • 主存-辅存层:软硬件管理,解决容量问题

主存储器

  • SRAM与DRAM
    • SRAM:触发器存储,非破坏性读出,无需刷新,速度快,集成度低
    • DRAM:电容存储,破坏性读出,需定时刷新,集成度高,速度慢
    • 刷新方式:集中刷新、分散刷新、异步刷新
  • ROM类型
    • MROM、PROM、EPROM、Flash存储器、SSD
  • 多模块存储器
    • 单体多字:并行读出多个字,受连续存放限制
    • 多体并行:高位交叉(顺序编址)、低位交叉(交叉编址,提高吞吐率)
  • 与CPU连接
    • 位扩展:增加字长,地址线、控制线并联,数据线单独连接
    • 字扩展:增加存储字数,数据线、控制线并联,地址线高位译码选片
    • 字位同时扩展:结合位和字扩展

外部存储器

  • 磁盘存储器
    • 组成:驱动器、控制器、盘片
    • 性能指标:记录密度、容量(非格式化/格式化)、存取时间(寻道+旋转延迟+传输)、数据传输速率
    • RAID:提高可靠性和性能(如RAID0无冗余,RAID1镜像)
  • 固态硬盘(SSD)
    • 基于闪存,无机械部件,速度快,寿命受擦写次数限制
    • 磨损均衡技术:动态/静态均衡,延长寿命

高速缓冲存储器(Cache)

  • 基本原理
    • 局部性原理:时间局部性、空间局部性
    • 命中率:H=命中次数/总访问次数
    • 平均访问时间:H×t_c + (1-H)×t_m
  • 映射方式
    • 直接映射:主存块→唯一Cache行,冲突概率高
    • 全相联映射:主存块→任意Cache行,成本高
    • 组相联映射:组间直接,组内全相联,平衡性能与成本
  • 替换算法
    • 随机算法、FIFO、LRU(近期最少使用)、LFU
  • 写策略
    • 全写法:同时写Cache和主存,简单但开销大
    • 回写法:只写Cache,替换时写回主存,需脏位
    • 写分配/非写分配:不命中时是否调入主存块

虚拟存储器

  • 基本概念
    • 虚地址→实地址转换,扩大寻址空间
    • 局部性原理为基础
  • 页式虚拟存储器
    • 页表:记录虚页→实页映射,含有效位、脏位等
    • 快表(TLB):缓存页表项,提高转换速度
    • 地址转换:虚页号→页表→实页号+页内地址
  • 段式与段页式
    • 段式:按逻辑分段,段表记录段起始和长度,利于共享保护
    • 段页式:先分段再分页,结合两者优点,开销大