计算机组成原理
文章目录
第二章
2.1移位运算
- 算数移位:通过改变各个数码和小数点的相对位置,从而改变各数码位的位权。 对于**所有码都是左移 x2,右移/2 **
- 原码算数右移:
- 原码算数左移:
定点小数和定点整数的移位一样
- 反码的算数移位:正相同,负相反
- 补码的算数移位:
小小结:
由于机器位数有限,有时无法用算数移位精确得等效乘除法
- 算数移位的应用
- 逻辑移位
- 循环移位:出的用来补。
小结:
2.2定点数的加减运算
- 原码的加减法
- 补码的加减法 (计算机中通常)
- 溢出判断
- 何时溢出:
- 方法一:采用一位符号位判断
- 方法二:根据进位情况判断
- 方法三:双符号位
- 符号扩展
小结:
2.3定点数的乘法运算
- 乘法运算的实现思想
- 原码的一位乘法
被乘数可用双符号位,乘数只要写数值位
- 补码的一位乘法
- 对比:
2.4定点数的除法运算
-
除法运算的思想
-
原码的除法
- 两种方法:恢复余数法和加减交替法(不恢复余数法)
恢复余数法:
加减交替法:
- 补码的除法
- 减去除数=加上(-除数)的补码;最后一位置为 1.
加减交替法:
- 除法运算回顾:
2.5强制类型转换
- c 语言中的定点整数有:int ,short,long。用补码存储。
2.6数据的存储和排列
-
大小端模式:
大端模式:最高的有效字节存到最低有效地址,最低的有效字节存到最高有效地址。
小端模式:与上述相反
2.7浮点数的表示
-
浮点数的表示
- 浮点数的理解:阶码反映数值大小,常用补码或移码表示定点整数;尾数反映精度,常用原码或补码表示定点小数。
- 浮点数尾数的规格化:规定尾数的最高位为有效值。方法:算术左移或右移。
- 左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减 1。
- 右规:当浮点数运算的结果尾数出现溢出(双符号位位 01 或 10)时,将尾数算数右移,阶码加一。
- 规格化浮点数的特点:
- 用原码表示的尾数进行规格化:
- 用补码表示的尾数进行规格化:
注意补码表示的尾数规格化:符号位和最高位不同(规定的,常用来判断该补码是否规格化)
- 用原码表示的尾数进行规格化:
正下溢和负下溢当作 0
- 小结:
- 浮点数的理解:阶码反映数值大小,常用补码或移码表示定点整数;尾数反映精度,常用原码或补码表示定点小数。
-
IEEE754 标准
-
移码:补码的基础上将符号去反。移码只能用于表示整数。定义:移码=正值+偏置值。如:八位移码的偏置值=128D=1000 0000B,也可以取 127D 即:2n-1或者 2n-1-1,不够便取 mod。
-
规格化:
- 注意原码隐藏了最高位 1,表示 1.M
- 阶码全 1,全 0 用作后面特殊处理
- 练习 1:十进制->浮点数:
- 练习 2:浮点数->十进制
- IEEE 单精度浮点数表示的最小绝对值:尾数全为 0,阶码真值最小-126(-128,-127 有特殊处理),对用移码机器数 0000 0001,此时整体的真值为(1.0)2x2-126
- IEEE 单精度浮点数表示的最大绝对值:尾数全为 1,阶码真值最大 127,对用移码机器数 1111 1110,此时整体的真值为(1.111…11)2x2127
- 只有 1<=E<=254 时,真值=(-1)sx2-126
-
非规格化:
- 当阶码 E 全为 0,尾数 M 不全为 0 时,表示非规格化小数+(0.xx…x)2x2-126。注意:隐含最高位变为 0,阶码真值固定视为-126。
- 当阶码 E 全为 0,尾数 M 全为 0 时,表示真值+0。
- 当阶码 E 全为 1,尾数 M 全为 0 时,表示无穷大+无穷大。
- 当阶码 E 全为 1,尾数 M 不全为 0 时,表示非数值“NAN”(not a number)表示非法运算。
- 浮点数的运算
- 浮点数的加减运算:
- 对阶中小阶向大阶靠齐;
- 尾数加减
- 规格化,0.00 几需要“左规”,99.21 几需要“右规”,规格化为几点几几
- 舍入:规定保留有效尾数;多余的直接砍掉,若砍掉部分非 0,则入 1;或者四舍五入,舍弃位>=5,高位入 1。
- “0”舍“1”入法:类似于十进制数运算中的“四舍五入” 法,即在尾数右移时:被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
- 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
- 判溢出:按规定。
- 练习:
- 强制类型转换:
- 在32位机器中不会丢失精度:char->int->long->double; float->double
- int->float:可能损失精度
- float->int:可能溢出损失精度
- 32位以上的机器:
- int:表示整数,范围-231~ 231-1,有效数字32位。
- float:表示整数及小数,范围+[2-126~2127X(2-2-23)],有效数字23+1=24位。
小结:
2.8电路基本原理和加法器设计
2.8.1:ALU
- 算术运算:加减乘除等
- 逻辑运算:与或非等
- 辅助功能:移位,求补等
2.8.2:加法器
- FA:full adder:原理:
- 表达式:
输 出 : S i = A i ⊕ B i ⊕ C i − 1 C i = A i B i + ( A i ⊕ B i ) C i − 1 \begin{aligned} 输出: S_i &= A_i \oplus B_i \oplus C_i-1\\ C_i &= A_iB_i+(A_i \oplus B_i)C_i-1 \end{aligned} 输出:SiCi=Ai⊕Bi⊕Ci−1=AiBi+(Ai⊕Bi)Ci−1 - 串行进位的并行加法器:把n个全加器串接起来,就可以进行两个n位数的相加。串行进位又叫行波进位。
2.8.3:加法器改进设计
- 套娃思想:第i位向更高位的进位i可以根据被加数、加数的第1~i位,再结合C0来确定。
- 观察到G1P1在每一个式子都存在,所以考虑将其现送入高位
- 同理,G2P2在后面的n-1个式子存在,同样往后送,以此类推。
- 并行进位的并行加法器:各级进位信号同时形成,又称先行进位、同步进位。
- 四位并行进位加法器原理图:
- 单级先行进位方式:又称组内并行、组间串行。并行用4位(越多线路越复杂),然后通过每一个4位CLA加法器(四位并行进位加法器)的串行进位来扩展位更高位。
- 改进:继续套娃得到:多级先行进位方式,又称组内并行、组间并行进位方式。
- ALU芯片的优化:
相当于CLA,相当于BCLA
第三章:存储系统
3.1:存储系统基本概念
3.1.1:存储器的层次结构
- 辅存中的数据要调入主存后才能被cpu访问
- 辅存也有外存之称
- 主存–辅存:实现虚拟存储系统,解决了主存容量不够的问题。
- Cache–主存:解决了主存与cpu速度不匹配的问题。
3.1.2:存储器的分类
- 按层次分类:
- 按存储介质分类:
- 半导体存储器
- 磁表面存储器
- 光存储器
- 按存取方式
- 随机存取存储器(RAM):硬盘
- 顺序存取存储器(SAM):磁带
- 直接存取存储器(DAM):磁盘
- 相联存储器(SAM):按内容访问
- 按照信息可更改性
- 读写存储器
- 只读存储器(ROM)
- 信息的可保存性
1.易失性存储器(主存,Cache)
2.非易失性存储器(磁盘、光盘)
- DRAM:破坏性读出
- SRAM:非破坏性读出
3.1.3:存储器的性能指标
- 存储容量:存储字数X字长(如1Mx8位)
- 单位成本:每位价格=总成本/总容量
- 存储速度:数据传输率(主存带宽:Bm)=数据的宽度/存储周期
- 小结:
3.2:主存储器的基本组成
3.2.1:半导体元件的原理
- MOS管:可以理解为一种电控开关,输入电压达到某个阈值时,MOS管就可以接通。
- 存储元:可存一位二进制数据,由一个MOS和电容组成。
- 存储元,存储单元;存储体
3.2.2:存储芯片的基本原理
- 控制电路:控制译码器的开关,只有当MAR地址稳定后,打开让译码器翻译地址;同时当数据输出的时候,只有输出电信号稳定之后,控制电路才打开,给数据总线输出数据
- 片选线:给出芯片选择信号:头上有线表示低电平有效。CS:芯片选择信号,CE:芯片使能信号。
- n位地址->2n个存储单元
- 总容量=存储单元个数x存储字长=2 3x 8bit = 2 3 x 1Byte=8B
- 8 x 8位的存存储芯片:常见描述:
3.2.3:如何实现不同的寻址方式
- 总容量为1K个单元:地址线:10根
- 按字寻址:256个单元,每个单元4B
- 按半字寻址:512个单元,每个单元2B
- 按双字寻址:128个单元,每个单元8B
- 小结:
3.3:SRAM和DRAM
3.3.1:存储单元不同导致的特性差异
- DRAM:动态RAM,使用栅极电容存储信息。通常用于主存
- 读出1:MOS管接通,电容放点,数据线上产生电流
- 读出0:MOS管接通后,数据显上无电流
- 电容放电信息被破坏,是破坏性读出。读出后应该重写操作
- 读写慢
- 每个存储元制造成本更低,集成度高,功耗低
- 需要刷新:2ms之内刷新一次,因为电荷会从电容里流失
- SRAM:静态RAM,使用双稳态触发器。通常用于Cache
- 双稳态,1:A高B低;0:A低B高
- 读出数据,触发器保持稳定,是非破坏性读出,不需要重写;
- 读写更快
- 每个存储元制造成本更高,集成度低,功耗大
- 不需要刷新
- 对比:
3.3.2:DRAM的刷新
- 刷新周期:每行都刷新一遍:2ms;
- 每次刷新一行
- 刷新有存储器独立完成,不需要cpu控制
- n位地址,由2n根选通线;改进:一维变二维:拆分为行地址译码器和列地址译码器,则需要2n/2:行列都选通时可以进行读写操作。
- 一维和二维的对比
- 硬件支持,读出一行的信息后重新写入,占用1个读/写周期
- 假设DRAM内部结构排列成128x128的形式,存取周期(读/写周期)为0.5us;2ms共2ms/0.5us=4000个周期
- 刷新方式一:分散刷新:每次读写都刷新一行,系统的存取周期翻倍为1us:前0.5us用于读写,后0.5us用于刷新某行
- 刷新方式二:集中刷新:2ms内集中安排时间全部刷新,系统存取周期还是0.5us,有一段时间用于刷新,无法访问存储器,成为“死区”
- 刷新方式三:异步刷新:2ms内每行刷新1次即可,2ms内需要产生128次刷新请求,每隔2ms/128=15.6us一次,没15.6us内有0.5us的“死时间”
3.3.3:DRAM的地址线复用技术
- 本来要n条地址线,复用可以只要n/2条地址线
小结:
3.4:只读存储器ROM
- RAM芯片:易失性
- ROM芯片:非易失性
3.4.1:MROM
- MROM:掩模式只读存储器
- 任何人不可重写(只能读出)
3.4.2:PROM
- 可编程只读存储器
- 可用专门的PROM写入器写入信息,写一次就不能改写
3.4.3:EPROM
- 可擦除可编程只读存储器
- 通过特殊手段:可进行多次重写
- UVEPROM:紫外线擦除全部信息
- EEPROM:电擦除,可擦除特定的字
3.4.4:闪存
- 闪存存储器
- 可进行多次快速擦除,每个存储元只需要一个MOS管,位密度比RAM更高
- 注意:由于闪存需要先擦除再写入,因此写比读更快
3.4.5:SSD
-
固态硬盘
-
控制端元加存储单元(闪存flash芯片)
-
可进行多次快速擦除重写。SSD速度快、功耗低、价格高。
-
虽然可读可写:但还是只读存储器
小结:
3.5:主存储器与cpu的连接
3.5.1:单块存储芯片与cpu的连接
3.5.2:多块存储芯片与cpu的连接
- 增加主存的存储字长-位扩展
- 同时读或者写2位信息
- 8kb的存储器
- 增加主存的存储字长-字扩展
线选法和译码片选法
- 通过片选信号,选中某一片存储器:加一个非门电路
- 低电平有效的
- 字位同时扩展法
小结:
3.5.3:关于译码器补充
- MREQ:cpu主存请求信号
3.6:双口RAM & 多模块存储器
3.6.1:双端口RAM
3.6.2: 多模块存储器
- 多体并行存储器:每个模块都有相同的容量容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。他们既能并行工作,又能交叉工作
- 高位交叉编址的多体存储器:最高的两个比特位来区分四根内存条;低位是相反的
- 可以看到:高位是读取完一个存储体才读取下一个存储体;而低位是每个存储体依次读取 ,宏观上读写一个字的时间接近r。
- 假设每个存储体存取周期位T,存取时间为r,假设T=4r
- 存取周期为T,存取时间(总线传输时间)为r,为了使流水线不间断,应保证m≥T/t
- 单体多字存储器:每个存储单元存储m个字,总线长度为m个字,一次并行读出m个字。每次只能同时读取m个字,不能单独取其中某个字。
- 注意:指令和数据在主存中必须是连续存放的。
小结:
3.7:Cache基本原理基本概念
3.7.1:Cache的工作原理
- 局部性原理
- 空间局部性:
- 时间局部性:
- 基于局部性原理,可以吧cpu目前访问的地址周围的部分数据放到Cache中。
3.7.2:性能分析
- 设tc:访问一次Cache所需的时间
- t m:访问一次主存所需的时间。
- 命中率H:cpu欲访问的信息已经在Cache中的比率。
- 缺失(未命中)率M=1-H
- Cache–主存 系统的平均访问时间:t=Htc+(1-H)(tc+ tm)。先访问Cache,若Cache未命中再访问主存
- 若cpu同时访问Cache和主存,Cache命中,立刻停止访问主存:t= Htc+(1-H) tm
3.7.3:解决“周围”
- 主存和Cache以块为单位交换数据
- 主存由块号和块内地址组成
- 主存的块也叫页,Cache的块也叫行
小结
3.8:Cache-主存的映射方式
3.8.1:全相联映射(随意放)
3.8.2:直接映射
- 直接映射:主存块在Cache中断位置=主存块号%Cache总块数
- 末尾三位直接表示主存块所在的Cache位置,所以Cache中不需要存着三位
- 如何访存
3.8.3组相映射(可放到特定分组)
- 如何存放
- 如何访存
小结
3.9:Cache的替换算法
- 以全相联映射为例的四种算法
3.9.1:随机算法RAND
- RAND:若Cache满了,则随机选择一块替换
3.9.2:先进先出算法FIFO
- FIFO:若Cache满了,则替换最先被调入Cache的块
- 抖动现象:频繁的换入换出现象
3.9.3近期最少使用LRU
- LRU:为每一个Cache块设置一个“计数器”,用于记录Cache块多久没有被访问,计数器大的替换。
- 手算
- 机器算
- Cache块总数=2n,则计数器只需要n位,且Cache装满后所有计数器的值一定不重复
- 基于局部性原理,合理的,命中率高
3.9.4:最近不经常使用LFU
- 为每一个Cache块设置计数器,用于记录被访问次数,替换计数器最小的。
- 不是很遵循局部性原理,不如LRU
小结
3.10:Cache写策略(数据一致性)
3.10.1:写命中
- 全写法:当CPU对Cache写命中时,必须把数据同时写入Caceh和主存,一般使用写缓冲
- 写回法:当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
3.10.2:写不命中
-
写分配法:当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法。
-
非写分配法:当CPU对Cache写不命中时只写入主存,不调入Cache,搭配全写法使用
- 注意,只有读不命中时才需要调入Cache
3.10.3:多级Cache
小结
3.11:页式存储器
- 逻辑地址(虚地址):程序员视角看到的地址
- 物理地址(实地址):实际在主存中的地址
-
改进
-
小结
3.12:虚拟存储器
3.12.1:页式虚拟存储器
3.12.2:段式虚拟存储器
- 段式虚拟存储器:按照功能模块拆分
3.12.2:段页式虚拟存储器
第三章小结
第四章:指令系统
4.1:指令格式
4.1.1:操作码、地址码的概念
- 指令:计算机执行某种操作的命令,是计算机运行的最小功能单位
- 指令集:一台计算机所有指令的集合构成该机的指令系统
- 一条指令:由操作码(OP)和地址码(A)构成
4.1.2:根据地址数目不同分类
- 零地址指令:OP
- 不需要操作数,如空操作,停机,关中断
- 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
- 一地址指令:OP+A1
- 二地址指令OP+A 1(目的操作数) +A2(源操作数)
- 三地址指令OP+A 1 +A2+ A3(结果)
- 四地址指令:OP+A 1 +A2+ A3(结果)+ A4(下址)
4.1.3:根据指令长度分类
- 指令字长:一条指令单总长度(可能会变)
- 机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常与ALU有关)
- 存储字长:一个存储单元中的二进制代码位数(通常与MDR位数相同)
- 半字长指令、单字长指令、双字长指令===指令长度是机器字长的多少倍
- 指令字长会影响取指令所需时间。如机器字长=存储字长=16bit,则取一条双字长指令需要访存两次
- 定长指令字结构:指令系统中所有指令单长度都相等
- 变长指令字结构:指令系统中各种指令单长度不等
4.1.4:根据操作码的长度不同分类
- 定长操作码:指令系统中所有指令的操作码长度都相同
- n位->2^n条指令
- 可变长操作码:指令系统中各指令的操作码长度可变
4.1.5:根据操作类型分类
小结
4.2:扩展操作码指令格式
- 定长指令字结构+可变长操作数
4.2.1:其中一种设计方法
- 注意:1:不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同;2: 各指令的操作码一定不能重复
4.2.2:另一种设计方法
小结:
4.3:指令寻址
- 指令寻址:下一条欲执行指令的地址(始终由程序计数器PC给出)
4.3.1:顺序寻址
- 顺序寻址:(PC)+”1”–>PC,“1”理解为一个指令字长,实际加的值会因指令长度、编址方式而不同
4.3.2:跳跃寻址
- 跳跃寻址:由转移指令指出JMP
小结
4.4:数据寻址
- 数据寻址:确定本条指令的地址码指明的真实地址
- 多地址
- 接下来10种寻址方式;我们默认指令字长=机器字长+存储字长,假设操作数为3
4.4.1:直接寻址
4.4.2:间接寻址
4.4.3:寄存器寻址
- 寄存器寻址
- 寄存器间接寻址
4.4.4:隐含寻址
4.4.5:立即寻址
4.4.6:基址寻址
- A存放偏移量
- 作用
- 优点:便于程序“浮动”,方便实现多道程序并发进行
- 采用基址寻址无需修改指令中的地址码
- 注意:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器(BR)的内容不变(作为基地址),形式地址可变(作为偏移量)
- 当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但内容仍由操作系统确定。
- 优点:扩大寻址范围
4.4.7:变址寻址
- 作用:
- 先看直接寻址的缺点
- 显然非常不方便
- 变址改变:
- 基址&变址复合寻址
4.4.8: 相对寻址
- 取走一条指令后,一定会自动+“1”
- 作用
但a[0]是变的,可以采用“分段”
4.4.9:堆栈寻址
- 硬堆栈
- 软堆栈
4.4.10:小结
4.5:CISC和RISC
-
CISC :complex instruction set computer
-
RISC :reduced instruction set computer