- 数据的表示和运算
- 存储系统
- 指令系统
- *处理器(CPU)
- 总线
- 输入/输出系统
- 中断和异常
- 杂项
本笔记为博主2021计算机专业考研408科目的计算机组成原理个人笔记,融合了一些操作系统的知识点,也将一些知识点划给了操作系统笔记,也加入了一些王道书没有提及的知识点,仅供参考。
数据的表示和运算
数制(进制转换)
十进制转任意进制
- 整数部分:除基取余法
- 小数部分:乘基取整法
编码(BCD码、ASCII、汉字编码)
BCD码(4位二进制编码的十进制数)
ASCII、汉字编码
- ASCII:7位二进制编码
- 区位码:每字节用7位码,区位码是4位十进制数(前2位是区码,后2位是位码)
- 国标码:\((区位码)_{16}+2020H\)
- 汉字内码:\((国标码)_{16}+8080H\)(实际就是每字节最高位均改为1)
校验码(奇偶校验码、海明校验码、循环冗余校验码)
奇偶校验码:加一个奇/偶校验位,使1的数量为奇/偶数
- 可以检测 \(1\) 位错误(或奇数位错误)
海明校验码(汉明校验码)
- 可以检测 \(1\) 位错误,纠错 \(1\) 位
- 要检测 \(2\) 位错,需要增加 \(1\) 位检验位,即 \(k+1\) 位。
循环冗余校验码(CRC码、(N,K)码)
- 可以检测 \(1\) 位错误,纠错 \(1\) 位
- 生成多项式,例如 \(G(x) = x^3+x^1+1\) 对应 \(1101\) ,最高次幂为 \(3\)
- 信息码左移 \(3\) 位,然后用\(G(x)\)进行模2除法,得到的 \(3\) 位余数作为校验位覆盖后三位。
- 校验原理:对CRC码用\(G(x)\)进行模2出发,得到的余数即为错误位的下标(若无错误,则为000)
定点数(移位、加减法、符号扩展、溢出、乘除法)
原码、补码、反码、移码
- 反码 = 原码除符号位其余位取反
- 补码 = 反码 + 1
- 移码 = 原码 + 偏置值(常取\(2^n\))
移位
算术移位(不移动符号位):
- 正数:补0
- 负数原码:补0
- 负数反码:补1
- 负数补码:左移填0,右移填1
逻辑移位(包括符号位):直接补0
符号扩展
- 正数:补0
- 负数原码:补0
- 负数反码:补1
- 负数补码:整数填1,小数填0
原码定点数加减法
补码定点数加减法
溢出
- 一位符号位:\(V=A_SB_S\overline{S_S}+\overline{A_SB_S}S_S\)(\(A_S\)、\(B_S\)分别为A、B的符号,\(S_S\)为运算结果符号),若 \(V=0\) 无溢出,\(V=1\) 溢出
- 双符号位(变形补码、模4补码):采用双符号位\(S_{s1}S_{s2}\),最高位代表真正的符号(正数为00,负数为11,加减运算后结果若两位不同,则证明溢出);ALU运算时使用2位表示双符号位,但数据存储时只需要1个符号位。
- 一位符号位+进位情况:如果符号位的进位\(C_s\)与最高数位的进位\(C_1\)相同,则无溢出;否则溢出
浮点数(规格化、IEEE 754、加减法)
\(浮点数值 = 数符×基数^{阶符×阶数}×{0.尾数}\)
IEEE 754标准
短浮点数(单精度、float):\(总位数32 = 1位数符+8位阶码+23位尾数\)
长浮点数(双精度、double):\(总位数64 = 1位数符+11位阶码+52位尾数\)
- 阶码:移码表示(重要,总是忘了偏置值),短浮点数偏置值为127(长浮点数为1023),可表示范围1254(12026),减去偏置值就是实际表示范围(-126~127)。
阶码全为0时表示非规格数,阶码全为1时表示无穷大,因此偏置值取最高位代表的值-1,可表示范围也就剔除了0和255(2027)。
- 尾数:原码表示,隐含1.xxxx
浮点数加减运算
- 对阶:小阶对大阶,即尾数右移,阶码增加
- 尾数求和
- 规格化:若结果尾数不是规格化浮点数 => 左规,若结果尾数溢出 => 右规
尾数最高数位必须是一个有效值(为了充分利用位数),例如:
- 原码(基数2):1
- 原码(基数16):前四位至少有一个1
- 补码(基数2):正数为1,负数为0
- 补码(基数16)正数前四位至少有一个1,负数前四位至少有一个0
- 舍入:指在对阶、右规时(不可能左规),尾数可能丢失低位导致精度误差。
- 0舍1入法:若0直接舍弃,若为1则低位+1
- 恒置1法:低位恒置1
- 浮点数溢出:指阶码溢出(分为超出最大正数的上溢、小于最小负数的下溢),只有上溢才会引发异常(内中断)
机器零:浮点运算中,结果出现正下溢或者负下溢(即其值无限趋近于0),即非规格数(移码形式的阶码全0)
类型转换、大小端、边界对齐
无损类型转换
- char->int->long->double
- float->double
小端方式、大端方式
- 小端方式:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。地址的增长顺序与值的增长顺序相同;与人类阅读习惯一致
- 大端方式:数据的高字节 保存在内存的低地址中,而数据的低字节保存在内存的高地址中。地址的增长顺序与值的增长顺序相反
边界对齐
- 可按字节(8位)、半字(16位)、字(32位)一次访存取出
存储系统
存储介质分类:
- 磁心存储器半导体存储器:MOS型存储器(SRAM)、双极型存储器(DRAM)
- 磁表面存储器:磁盘、磁带
- 光存储器:光盘
存取方式分类:
- 随机存储器(RAM):可随机读/写,具有易失性;又分为静态RAM和动态RAM
- 只读存储器(ROM):可随机读(广义上也可写入,但远远慢于读取速度),具有非易失性
- 串行访问存储器:只可按物理位置的先后顺序寻址来进行读写操作
- 又分为顺序存取存储器(如磁带)与直接存取存储器(如磁盘)
易失性分类:
- 易失性存储器:断电后丢失信息,包含RAM
- 非易失性存储器:断电后不会丢失信息,包含ROM、磁表面存储器(磁盘、磁带)和光存储器(CD-ROM)
半导体随机存储器(SRAM、DRAM、ROM)
静态随机存储器(SRAM)
- 组成:使用双稳态触发器(六晶体管MOS),非破坏性读出。
- 用途:高速缓冲存储器
- 引脚数:地址位数 + 数据位数 + 读写信号2位 + 片选线1位
- 优点:存取速度较快
- 缺点:具有易失性、集成度低(功耗较大)
动态随机存储器(DRAM)
- 组成:使用栅极电容的电荷来存储信息,需要再生(破坏性读出)
- 用途:大容量主存
- 引脚数 = 地址位数/2 + 数据位数 + 读写信号2位 + 行列通选信号2位
采用地址复用技术,地址线是原来的1/2,分行通选、列通选两次传送。
- 优点:容量大、集成度高(成本低、功耗低)
- 缺点:具有易失性、存取速度相对较慢
DRAM刷新策略:
- 集中刷新:在每一个刷新周期(一般为2ms)的一段固定时间集中对所有行逐一刷新
- 存在死时间(死区,即停止对存储器的读写操作)
- 分散刷新:把对每行的刷新分散到各个存取周期,每个工作周期前半部分用于正常读/写/保持,后半部分用于刷新某一行
- 没有死时间,但加长了存取周期,降低效率
- 异步刷新:把对每行的刷新分散到一个刷新周期(一般为2ms),每隔一小段时间(刷新周期/行数)产生一次行刷新请求。
- 缩短了死时间,减少了刷新次数,提高效率
DRAM的刷新单位是行,刷新操作只需要行地址
DRAM的刷新操作类似于读操作(刷新1行的时间=1个存取周期),不同点:给栅极电容补充电荷不需要信息输出。此外刷新时不需要选片,整个存储器中的所有芯片同时被刷新。
只读存储器(ROM)
- 优点:结构简单,集成度比RAM高;具有非易失性,可靠性高
-
- MROM 掩模式只读存储器:产家生产时直接写入,写入后无法改变。集成度高(成本低),但灵活性差
- PROM 一次可编程只读存储器:用户可一次性编程写入,写入后无法改变
- EPROM 可擦除可编程只读存储器:用户可多次擦除、编程写入
- Flash Memory 闪速存储器:可快速擦除、重写,例如U盘
- SSD 固态硬盘:由Flash芯片组成,保留闪速存储器长期保存信息、快速擦除与重写的特性
主存储器的扩展、地址分配和片选
容量扩展
- 字扩展法:增加字的数量,片选地址分配在最高位
- 位扩展法:增加位的数量,片选地址分配在最低位
- 字位同时扩展法
片选
- 线选法:某地址线为0时就选中与之对应的存储芯片(例如3位只能产生3个片选信号)
- 译码片选法:使用一片74LS138作为地址译码器(例如3位可产生8个片选信号)
结构图
2Kx4位 芯片组成 6Kx8位 存储器:组成3组(\(CS_0\)、\(CS_1\)、\(CS_2\)),一组2片
连线:
- 每片芯片地址线连接CPU地址线低11位:\(A_{10}\)~\(A_0\)
- 每组的两片芯片分别连接到CPU数据线高4位、低4位:\(D_7D_6D_5D_4\)、\(D_3D_2D_1D_0\)
片选信号:
- \(CS_0=\overline{A_{13}}\overline{A_{12}}\overline{A_{11}}\) (即地址13~11位:000)
- \(CS_1=\overline{A_{13}}\overline{A_{12}}A_{11}\) (即地址13~11位:001)
- \(CS_2=\overline{A_{13}}A_{12}\overline{A_{11}}\) (即地址13~11位:010)
双端口RAM、交叉(多模块、多体)存储器
双端口RAM
-
访问冲突:两个端口同时访问一存储器的同一地址单元时,若其中一方是写入行为(若双方都是读出行为则不会发生错误)会产生错误。
-
解决方式:置“忙”信号\(\overline{BUSY}\)为0,由判断逻辑决定暂时关闭其中一个端口,延长一定时间后再才允许访问
单体多字存储器
由单个存储体组成:每个存储单元存储m个字,总线宽度为m个字,一次并行读出m个字。
交叉(多模块、多体)存储器
-
高位交叉编址方式:将低位的体内地址送到由高位体号确定的模块内进行译码,不满足局部性原理。访问连续内存块时,会顺序访问一个个存储模块,非并行访问,从而总会有其他模块空闲。
-
低位交叉编址方式:将高位的体内地址送到由低位体号确定的模块内进行译码,适合局部性原理。访问连续内存块时,采用流水线方式并行存取,各个模块都能同时工作。
交叉存储器存取周期计算
(\(T\) 为一个字的存取周期,\(r\) 为总线传输周期)
- 交叉存取度: \(m=T/r\) ,存储交叉模块数应大于等于交叉存取度 \(m\)
- 连续存取 \(m\) 个字所需时间:\(t = T+(m-1)r\)
- 访问连续内存的理想状态下(即流水线开始第一个存取周期之后),存取 1 个字只需一个总线传输周期 \(r\)
- 无论何种方式,交叉存储器理想情况下都可以让所有模块都工作起来
指令系统
指令格式(定长操作码、扩展操作码)
指令格式 = 操作码 + 寻址特征 + 地址码
- 定长操作码:固定长度;有利于简化硬件设计,提高指令译码速度。
- 扩展操作码:采用可变长度操作码,不允许短码是长码的前缀(类似哈夫曼编码);指令字长不变的情况下保持更多的指令种类,但使指令译码复杂化。
一般给频率较高的指令分配较短操作码,较低的指令分配较长操作码,尽可能减少译码分析时间
指令的寻址方式
指令寻址
- 顺序寻址:通过程序计数器(PC)加1(1个指令字长),自动形成下一条指令的地址
- 跳跃寻址:当前指令修改PC值,这样可以通过程序计数器(PC)给出下一条指令地址;跳跃到的地址分为:绝对地址、相对地址。
数据寻址
- 隐含寻址:隐含的操作数地址是累加器(ACC)
- 堆栈寻址:隐含的操作数是堆栈顶,通过堆栈指针(SP)来访问堆栈顶
- 立即寻址:形式地址指出的是操作数(立即数)本身
- 不访问主存
- 直接寻址:形式地址直接指出操作数的主存地址
- 直接访问一次主存
- 寄存器寻址:形式地址指出操作数所在寄存器编号
- 不访问主存,执行速度快,支持向量/矩阵运算
- 间接寻址:形式地址指出存放操作数主存地址的主存地址(还可能是多次间接寻址)
- 要多次访问主存
- 寄存器间接寻址:形式地址指出存放操作数主存地址的寄存器
- 仍需要访问一次主存
- 相对寻址:程序计数器(PC)的内容加上形式地址A形成操作数的有效主存地址:\(EA=(PC)+A\)
- A是相当于当前指令的偏移量,补码表示
- 计算地址时需注意取出当前指令后,PC会自增指向下一个指令
- 便于程序浮动,广泛应用于转移指令
- 基址寻址:基址寄存器(BR)的内容加上形式地址A形成操作数的有效主存地址:\(EA =(BR)+A\)
- 基址寄存器(位数大于A的位数)可采用 专用寄存器、通用寄存器
- 基址寄存器内容由系统或管理程序确定,程序运行过程不变
- 面向操作系统的多道程序设计
- 变址寻址:变址寄存器(IX)的内容加上形式地址A形成操作数的有效主存地址:\(EA=(IX)+A\)
- 变址寄存器(位数大于A的位数)可采用 专用寄存器、通用寄存器
- 变址寄存器内容由用户设定,程序运行过程中可变
- 面向用户,常用于处理数组问题
CISC、RISC
复杂指令系统计算机(CISC) | 精简指令系统计算机(RISC) | |
---|---|---|
代表 | X86架构计算机 | ARM架构、MIPS架构计算机 |
指令系统 | 复杂,庞大 | 简单,精简 |
指令数目 | 多,一般大于200条,格式多,寻址方式多 | 少,一般小于100条 |
兼容性 | 强(指令数目多) | 低(指令数目少) |
指令字长 | 不固定 | 定长 |
可访存指令 | 不加限制 | 只有Load/Store指令 |
各种指令执行时间 | 相差很大 | 绝大多数一个时钟周期内完成 |
各种指令使用频度 | 相差很大 | 都常用 |
通用寄存器 | 少 | 多(注意),因此就可以减少访存次数 |
目标代码 | 难以优化编译生成高效的目标代码程序 | 优化编译生成的代码较为高效 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |
*处理器(CPU)
运算器
算术逻辑单元(ALU):进行算术/逻辑运算
移位器(SR):对操作数或运算结果进行移位运算(shl、shr)或者直接输出(mov)
SRout 所控制的部件是一个三态门,用于控制移位寄存器与总线之间数据通路的连接和断开
多路选择器(MUX):选择一路输入作为输出,用MUXop作为选择信号
MUXop=0选择输出第0路输入,MUXop=1则选择输出第1路输出
计数器(CT):控制乘除运算的操作步数。
寄存器 | 对用户可见 | 专用/通用 | 作用 |
---|---|---|---|
累加寄存器(ACC) | 可见 | 通用 | 暂时存放ALU运算结果信息,也可以作为加法运算的一个输入端。 |
暂存寄存器 | 可见 | 通用 | 用于暂存从主存读来的数据。 |
通用寄存器组 | 可见 | 通用 | 用于存放操作数(包括源操作数、目的操作数及中间结果)和各种地址信息。如AX、BX、CX、DX、SP |
程序状态字存储器(PSW) | 可见 | 专用 | 保留由算术、逻辑运算或测试指令的结果而建立的各种状态信息。如溢出标志OF、符号标志SF、零标志ZF、进位标志CF等。PSW中的这些位参与并决定微操作的形成。 |
算术逻辑单元(ALU)
一位全加器(FA):全加器是最基本的加法单位
- 全和表达式:\(S_i=A_i\bigoplus B_i \bigoplus C_{i-1}\)
- 进位表达式:\(C_i=A_iB_i+(A_i\bigoplus B_i)C_{i-1}\)
串行加法器:由1个全加器组成,器件少成本低,但运算速度较慢
并行加法器:由多个全加器组成
其中\(G_i = A_iB_i\) ,\(P_i=A_i\bigoplus B_i\)
- 串行进位(行波进位):运算时间主要由进位信号的传递时间决定
- \(C_n=G_n+P_nC_{n-1}\)
- 并行进位(先行进位、同时进位):完全用并行进位会使电路结构过于复杂
- \(C_1=G_1+P_1C_0\)
- \(C_2=G_2+P_2G_1+P_2P_1C_0\)
- ...
- 单级先行进位(组内并行,组件串行):例如4片74181串联,形成4组串行进位,每片78141片内4位并行进位
- 多级先行进位(组内并行,组间并行):例如4片74181被第二级的1片74182并联,形成4组并行进位,每片78141内4位并行进位
状态(标志)寄存器
- 零标志(ZF):表示结果是否为0
- 进位/借位标志(CF):表示最高位的进位(即无符号数是否溢出,进位/借位即正溢出/负溢出),只对无符号数有意义
- 符号标志(SF):表示最高位(即符号位,无溢出时表示为真正的符号),只对有符号数有意义
- 溢出标志(OF):表示有符号数是否溢出
无符号数
- 等于:相减后结果为0(ZF=1)
- 大于:无借位 & 相减后不为0(CF=0 & ZF=0)
- 小于:有借位 & 相减后不为0(CF=1 & ZF=0)
带符号整数
- 等于:相减后为0(ZF=1)
- 大于:不溢出时为正,溢出时为负 & 相减后不为0(!(SF⊕OF) & ZF=0)
- 小于:不溢出时为负,溢出时为正 & 相减后不为0((SF⊕OF) & ZF=0)
控制器
作用:从主存取出一条指令,并指出下一条指令在主存中的位置;对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作;指挥并控制CPU、主存、输入和输出设备之间的数据流动方向
指令译码器(ID):仅对操作码字段进行译码,向控制器提供特定的操作信号。
时序系统:用于产生各种时序信号,它们都有统一时钟(CLOCK)分频得到。
微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
寄存器 | 对用户可见 | 专用/通用寄存器 | 作用 |
---|---|---|---|
程序计数器(PC) | 可见 | 专用 | 用于指出下一条指令在主存中的存放地址(访问地址=PC*指令字长,因此实际PC位数可能小于等于MAR位数) |
指令寄存器(IR) | 不可见 | 专用 | 用于保存当前正在执行的那条指令 |
存储器地址寄存器(MAR) | 不可见 | 专用 | 用于存放要访问的主存单元的地址 |
存储器数据寄存器(MDR) | 不可见 | 专用 | 用于存放向主存写入的信息或从主存读出的信息 |
组合逻辑(硬布线)控制器、微程序控制器
组合逻辑(硬布线)控制器
- 同步控制方式:统一时钟,以最长部件操作为标准,采取统一具有相同间隔、数目的节拍作为机器周期运行不同的指令。运行速度慢,控制电路简单。
- 异步控制方式:通过应答方式进行联络,各部件按自身速度工作,不存在基准时标信号。运行速度较快,控制电路较复杂。
- 联合控制方式:折中方法,对各种不同指令的微操作实行大部分采用同步控制、小部分采用异步控制的办法。
组合逻辑(硬布线)控制器、微程序控制器的区别
硬布线控制器 | 微程序控制器 | |
---|---|---|
工作原理 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生 | 微操作控制信号以微程序的形式存放在控制器存储器,执行指令是读出即可 |
执行速度 | 快 | 慢 |
规整性 | 繁琐、不规整 | 较规整 |
应用场合 | RISC CPU | CISC CPU |
易扩充性 | 困难 | 易修改扩充 |
CPU数据通路(单总线、三总线、专用通路)
数据通路:指数据在功能部件之间传送的路径,如(PC)->MAR
数据通路方式:
- CPU内部单总线方式:冲突多,性能低
- CPU内部三总线方式:冲突减少,效率提高
- 专用数据通路方式:冲突大大减少,性能较高,但硬件量大
- 【指令地址/数据地址】:控制器 地址总线> 主存、IO设备
- 【指令】:主存 数据总线> 控制器
- 【数据】:主存、IO设备 <数据总线> 运算器
- 【控制信号】:控制器 <控制总线> 主存、IO设备
ALU本身没有内部存储功能,因此执行两操作数运算时,一个输入端和暂存器相连,另一个输入端和总线相连,输出端和另一个暂存器相连
控制器也接受来自控制总线的控制信号,如中断请求、DMA请求
指令周期(取指、间址、执行、中断)
取指周期
//取指 微操作序列
(PC)->MAR
M(MAR)->MDR (PC)+1->PC //CU发出Read信号,同时发出+1信号
(MDR)->IR
//Op(IR)->CU CU译码
间址周期(可能没有)
//间址 微操作序列
Ad(IR)->MAR //CU发出Read信号
M(MAR)->MDR //存放操作数有效地址
执行周期
根据 IR 的操作码执行
//ADD X 加法
Ad(IR)->MAR //CU发出Read信号
M(MAR)->MDR
(ACC)+(MDR)->ACC
//STA X 存数
Ad(IR)->MAR //CU发出Write信号
(ACC)->MDR
(MDR)->M(MAR)
//LDA X 取数
Ad(IR)->MAR //CU发出Read信号
M(MAR)->MDR
(MDR)->ACC
//JMP X 无条件跳转
Ad(IR)->PC
中断周期(可能没有)
//中断隐指令微操作序列
(SP)-1->SP //SP为栈顶
(SP)->MAR //入栈地址传给MAR
(PC)->MDR //断点传给MDR
MDR->M(MAR) //断点存入主存
//Ad(CU)->PC 中断服务程序入口地址传给PC
微指令
- 微程序:对应实现一个机器指令,由若干个微指令组成
-
微指令:若干微命令的集合,至少包含两大信息:
- 操作控制字段(操作码字段):用于产生某一部操作所需的各种操作控制信号
- 顺序控制字段(微地址码):用于控制产生下一条要执行的为指令地址
- 微周期:通常指从控制器存储器中读取一条微指令并执行相应的微操作所需的时间
- 微命令:对应一个微操作;有相容性(一些微命令之间可以同时产生、共同完成)和互斥性(不允许同时出现的微命令)之分。(如打开某个控制门的电位信号)
- 微操作:是计算机中最基本的、不可再分解的操作。
微程序控制器
- 控制存储器(CM):核心部件,用于存放指令对应的微程序,在CPU内部,可用ROM实现。
- 微指令寄存器(CMDR或\(\mu\)IR):用于存放从CM中取出的微指令,位数 = 微指令字长。
- 微地址形成部件:用于产生初始微地址和后继微地址,以保证微指令的连续执行。
- 微地址寄存器(CMAR):接受为地址形成部件送来的微地址,为在CM中读取指令做出准备。
微程序实际上是机器指令的是实时解释器,设计者实现编制好存于CM中,对于程序员来说是透明的。
机器指令有些操作是相同的,因此可以统一编成一个公共微程序(取值周期、间址周期、中断周期三部分),因此可以 \(CM的微程序个数 = 机器指令数+对应取值、间址、中断周期共用微程序数\)
微指令执行过程
- 执行取指令公共微程序:自动将微程序入口地址送入CMAR,并从CM中读出相应的微指令送入CMDR。
取指微程序入口地址一般为CM的0号单元,执行完后主存中取出的机器指令就已存入指令寄存器中。
- 机器指令的操作码 通过 微地址形成部件 产生该机器指令所对应的微程序的入口地址,并送入 CMAR
- 从 CM 中逐条取出对应的微指令并执行
- 执行完对应一条机器指令的一个微程序后,又回到取指微程序的入口,重复上述步骤
//取指 微操作序列(微程序控制器)
//此时,取值微程序的入口地址已在CMAR
CM(CMAR)->CMDR
Ad(CMDR)->CMAR //微指令中隐含的下一条微指令地址传给CMAR
(PC)->MAR //执行CMDR对应的微指令,触发(PC)->MAR
CM(CMAR)->CMDR
Ad(CMDR)->CMAR //微指令中隐含的下一条微指令地址传给CMAR
M(MAR)->MDR (PC)+1->PC //执行CMDR对应的微指令,触发该行行为
CM(CMAR)->CMDR
Ad(CMDR)->CMAR //微指令中隐含的下一条微指令地址传给CMAR
(MDR)->IR //执行CMDR对应的微指令,触发该行行为
CM(CMAR)->CMDR
//OP(IR)->微地址形成部件->CMAR 机器指令操作码生成新的微程序入口地址并传给CMAR
动态微程序设计/毫微程序设计
- 动态微程序设计:能根据用户要求改变微程序。实现微程序可采用可擦除可编程只读存储器(EPROM)
- 毫微程序设计:硬件不由微程序直接控制,而是通过存放在第二级控制存储器(毫微存储器)中的毫微程序来解释的。直接控制硬件的是毫微微指令。
微指令地址形成方式
- 直接由微指令下地址字段指出(断定方式):微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址。
- 根据机器指令操作码形成:机器指令取至指令寄存器后,微指令的地址由操作码经 微地址形成部件 形成。
还有以下形成方式:
- 增量计数法,即(CMAR)+1 => CMAR,适用于连续的后继微指令地址
- 由硬件直接产生微程序入口地址,如取指微指令
- 根据各种标志决定微指令分支转移的地址
- 通过网络测试形成
微指令编码方式
- 直接编码(直接控制):每一位代表一个微命令。选用或不用某个微命令,只需将其对应位设置0/1。微指令字长过长,造成控制存储容量极大。
- 字段直接编码:分成若干小字段,把互斥性微命令组合放在同一字段内,相容性微命令分在不同段,每个字段独立编码。缩短了微指令字长,但要通过译码电路后再发出微命令,比直接编码方式慢。
每个小段一般还要留出一个状态,表示本字段不发出任何微命令(通常全0视为无命令状态)
- 字段间编码(隐式编码):一个字段的某些微命令需要另一字段中的某些微命令来解释。进一步缩短微指令字长,削弱了微指令并行控制能力,常作为直接编码的辅助手段。
微指令格式
- 水平型微指令:一位对应一个控制信号,有输出时为1,否则为0。一条水平型微指令定义并执行几种并行基本操作。(直接编码、字段直接编码、字段间直接编码和混合编码方式都属于水平型微指令)
- 垂直型微指令:类似机器指令操作码的方式,设置微操作码字段,采用微操作码编译法,由微操作码规定微指令功能。一条垂直型微指令只能定义并执行一种基本操作。
- 混合型微指令:在垂直型的基础上加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快。
并行操作能力 | 效率&速度 | 字长/微程序长度 | 易用性 | |
---|---|---|---|---|
水平型微指令 | 并行性强 | 效率高 | 字长长,但微程序短 | 难以掌握 |
垂直型微指令 | 并行性弱 | 效率低 | 字长短,但微程序长 | 简单规整,易于掌握 |
指令流水线
指令执行方式(单指令周期、多指令周期、指令流水线)
- 单指令周期(串行执行):每个指令都用相同的执行时间完成,串行执行。系统运行速度较慢。
- 多指令周期(串行执行):对不同类型的指令按需分配不同的执行时间完成,串行执行
- 一次重叠执行方式(流水线):同时进行第k条指令的执行阶段和第k+1条指令的取值阶段;耗时\(T=(2n+1)t\)
- 二次重叠执行方式(流水线):同时进行第k条指令的执行阶段、第k+1条指令的分析阶段和第k+2条指令的取值阶段;耗时\(T=(n+2)t\)
流水线特点
- 依靠多个功能部件并行工作,缩短程序执行时间
- 流水线每个功能部件后面都要有一个 缓冲寄存器(锁存器),其作用是保存本流水线段的执行结果,供给下一流水段使用
- 流水线中个功能段的时间尽量相等,否则会引起堵塞断流,时间长的功能段将成为流水线的瓶颈
- 要求尽量不断提供连续任务,这样才能发挥流水线效率
- 装入时间(第一个任务进入流水线到输出流水线的时间)、排空时间(最后一个任务进入流水线到输出流水线的时间)
流水线分类
- 流水线分级:
- 部件功能级流:将复杂的算术逻辑运算组成流水线工作方式。例,可将浮点加法操作分成阶差、对阶、位数相加、结果规格化等4个子过程。
- 处理机级流水:把一条指令解释过程分成多个子过程,如取指、译码、执行、访存、写回5个子过程。
- 处理机间流水:每个处理机完成某一专门任务,得到的结果需存放在与其它处理机共享的存储器中。
- 单功能和多功能流水线:
- 单功能流水线:实现一种固定专门功能的流水线
- 多功能流水线:通过各段间不同连接方式可以同时或不时地实现多种功能的流水线
- 动态和静态流水线:
- 静态流水线:同一时间内只能按同一种功能的连接方式工作。
- 动态流水线,同一时间内当某些段正在实现某种运算,另一些段却正在进行另一种运算。
- 线性和非线性流水线
- 线性流水线:从输入到输出,每个功能段只允许经过一次,没有反馈回路。
- 非线性流水线:某些功能段将数次通过流水线,存在反馈回路。更加适合线性递归运算。
超标量流水线、超流水线、超长指令字
- 超标量流水线技术:(需要采用多个功能部件)每个时钟周期可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行。不能调整指令执行顺序,只能靠编译程序挖掘指令并行性。
- 超流水线技术:在一个时钟周期内再分段,一个时钟周期内一个功能部件使用多次。不能调整指令执行顺序,只能靠编译程序解决优化问题。
- 超长指令字:(需要采用多个功能部件)将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),由编译程序挖掘指令潜在并行性。
指令流水线阻塞
- 资源冲突:多条指令在同时争用同一资源而形成的冲突。
- 前一指令访存时,后一相关指令(及其后续指令)暂停一个时钟周期。
- 单独设置数据存储器和指令存储器,使取数据、取指令在不同的存储器中进行。
- 数据相关(数据冒险):下一条指令会用到这一条指令计算出的结果。
- 硬件阻塞法、软件插入"NOP"指令法:把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。
- 数据旁路(转发)技术:设置相关专用通路。即不等前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把前一条指令的ALU的计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行。
- 通过编译器对数据相关指令编译优化的方法,调整指令顺序来解决数据相关。
- 控制相关(控制冒险):一条指令要确定下一条指令的位置时,因为执行转移、调用、返回等指令而造成的断流。
- 对转移指令进行分支预测,尽早生成转移目标地址:
- 简单(静态)预测:总是预测条件不满足,继续执行分支指令的后续指令
- 动态预测:根据程序执行的历史情况,进行动态预测调整,有较高的预测准确率
- 预取转移成功和不成功两个控制流方向上的目标指令
- 加快和提前形成条件码
- 对转移指令进行分支预测,尽早生成转移目标地址:
Cache缺失也会导致流水线阻塞。
流水线性能指标
- 吞吐率:单位时间内流水线所完成任务数量。
\(TP=\frac{n}{T_k}=\frac{n}{(k+n-1)*\Delta{t}}\) - 加速比:完成同样一批任务,不用流水线和用流水线所用时间比。
\(S=\frac{T_0}{T_k}=\frac{k*n}{k+n-1}\) - 流水线效率:流水线设备利用率,时空图上定义为完成n个任务占用的时空有效面积,与n个任务所用时间及k格流水段所围成的时空区总面积之比。
\(E=\frac{n个任务所占时空区有效面积}{n个任务所用时间和k个流水段所围成的时空区总面积}=\frac{T_0}{kT_k}\)
总线
总线概述
- 特点:分时(同一时刻只允许有一个部件向总线发送信息)、共享(可挂靠多个部件且可同时从总线接受信息)
- 猝发传输方式:先传送一个首地址,然后在一个总线周期内传出地址对应的连续多个数据字的总线传输方式。
- 总线复用:指一种信号线在不同的时间传输不同的信息,因此可使用较少的线传输更多信息,从而节省空间和成本。
总线分类
- 片内总线:芯片(CPU芯片)内部总线。
- 系统总线:系统各功能部件(CPU、主存、I/O接口)之间相互连接的总线。按传输信息内容不同又可分为:
- 数据总线(双向):传输各功能部件之间的数据信息;与机器字长、存储字长有关。
- 地址总线(单向):指出目的数据所在主存或I/O端口地址;与主存地址空间大小有关。
- 控制总线(双向):传输控制信息,包括CPU送出控制命令和主存(或外设)返还CPU的反馈信号
- 通信总线(外部总线):计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间传送信息的总线。
总线标准
- ISA:并行,系统总线,最早出现的系统总线
- EISA:并行,系统总线,扩展并兼容ISA
- AGP:并行,局部总线,连接主存、显卡
- PCI:并行,局部总线,连接显卡、声卡、网卡等,即插即用
- PCI-E:串行,局部总线,全面取代PCI和AGP,连接主存、网卡、视频卡等
- USB:串行,外部(通信)总线,连接外部设备的I/O总线,即插即用
- IDE:并行,旧硬盘接口
- SATA:串行,新硬盘接口
- RS-232C:串行,应用于串行二进制交换的数据终端设备盒数据通信设备之间的标准接口。
- PCMCIA:广泛用于笔记本电脑的一种接口标准。即插即用。
- SCSI:计算机和智能设备(硬盘、软驱、光驱、打印机等)之间系统级接口的独立处理器标准,智能的通用接口标准
总线传输四个阶段(申请分配、寻址、传输、结束)
- 申请分配阶段:需要使用总线的主模块(或主设备)提出申请,经总线仲裁机构决定将下一传输周期的总线使用权授予某一申请者。还可细分为传输请求和总线仲裁2个阶段。
- 寻址阶段:取得使用权的主模块通过总线发出本次要访问的从模块(或从设备)的地址及有关命令,启动参与本次传输的从模块。
- 传输阶段:主模块和从模块进行数据交换,可单向或双向进行数据传送。
- 结束阶段:主模块的有关信息均从系统总线上撤出,让出总线使用权。
系统总线结构(单总线、双总线、三总线)
单总线结构
- 优点:结构简单,成本低,易于接入新设备。
- 缺点:宽带低、负载重;多个部件争用唯一的总线,不支持并发传送操作
双总线结构(通道)
- 优点:将低速I/O设备从单总线分离出来,实现存储器总线和I/O总线分离
- 缺点:需增加通道等硬件设备
三总线结构(DMA)
- 优点:提高了I/O设备的性能,从而更快响应命令,提高系统吞吐量。
总线定时方式(同步、异步)
同步定时方式
系统采用统一时钟信号,产生每个相等且固定的总线周期,在一个总线周期中,发送方和接收方可以进行一次数据传送。
- 优点:较高传输速率;总线控制逻辑简单
- 缺点:主从设备属于强制性同步;不能及时进行数据通信的有效性检验,可靠性较差。
适用于总线长度较短及总线所接部件存取时间比较接近的系统。
异步定时方式
无统一时钟,无固定时间间隔,完全靠传送双方相互制约的握手信号来实现定时控制。
- 优点:总线周期长度可变,保证两个工作速度相差很大的部件(或设备)之间可靠的进行信息交换,自动适应时间的配合
- 缺点:较低传输速率;总线控制逻辑复杂
异步定时方式分为3种:
- 不互锁方式:
- 主设备(无互锁关系):发出“请求”信号后,一段时间后便撤销“请求”信号
- 从设备(无互锁关系):接收“请求”信号后,发出“回答”信号,一段时间后自动撤销“回答”信号
- 半互锁方式:
- 主设备(存在互锁关系):发出“请求”信号后,必须等到从设备“回答”信号才撤销“请求”信号
- 从设备(无互锁关系):接收到“请求”信号后,发出“回答”信号,一段时间后自动撤销“回答”信号
- 全互锁方式:
- 主设备(存在互锁关系):发出“请求”信号后,必须等到从设备“回答”信号才撤销“请求”信号。
- 从设备(存在互锁关系):接收到“请求”信号后,发出“回答”信号,必须在获知主设备“请求”信号撤销后,再撤销“回答”信号。
输入/输出系统
I/O系统层次结构
- 用户层I/O软件:实现与用户交互的接口,提供一组系统调用用于I/O操作。
用户通过系统调用接口发出read命令。
- 设备独立性软件:实现用户程序与设备驱动器的统一接口、设备命令、设备保护及设备分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
由于系统调用接口是统一的,read命令需要通过设备独立层解析,交给下一层。
- 设备驱动软件:与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
不同类型设备对read命令行为有所不同,因此还需继续把read命令解析成不同的指令。
- 中断处理程序:用于保存被中断进程的CPU环境,转入相应中断进程处理程序进行处理,处理完并恢复被中断进程现场后,返回被中断进程。
命令解析完后,需要中断正在运行的进程,从而执行read对应的中断服务程序。
- 硬件设备:设备控制器(适配器)
最后I/O接口(设备控制器)按照CPU传达的命令操控硬件设备,完成相应功能。
I/O软件:通常采用I/O指令和通道指令实现CPU和I/O设备的信息交换。包括驱动程序、用户程序、管理程序、升级补丁等。
I/O硬件:通过设备控制器来控制I/O设备具体动作,通过I/O接口与主机(总线)相连。包括外部设备、设备控制器、接口、I/O总线等。
I/O设备类型
块设备、字符设备
- 块设备:传输单位是数据块,可寻址(即随机读/写任一块),如存储设备(磁盘、磁带、光盘等),通常是高速设备。
- 字符设备:传输单位是字符(字节),不可寻址,且通常采用中断驱动方式,如交互类设备(打印机、显示器、键盘鼠标),通常是中低速设备。
独占设备、分享设备
- 独占式使用设备(独占设备):如打印机
- 分时式共享使用设备(共享设备):如磁盘设备I/O
- SPOOLing方式使用外部设备(虚拟设备、假脱机I/O技术):对I/O操作进行批处理,以空间换时间
输入/输出设备
- 显示器:阴极射线管(CRT)、液晶显示器(LCD)、LED(发光二极管)显示器
- 打印机:针式打印机、喷墨式打印机、激光打印机
外存储器
- 磁盘存储器
- 磁盘阵列:将多个物理磁盘组成一个独立逻辑盘,交叉存储、并行访问,提高存取速度
- RAID0(条带化):无冗余和无校验的磁盘阵列,仅支持交叉并行读写,提高存取速度,无容错能力
- RAID1(镜像磁盘阵列):互为备份,容量少一半,提供安全可靠性
- RAID2(纠错海明码)、RAID3(位交叉奇偶校验)、RAID4(块交叉奇偶校验)、RAID5(无独立校验奇偶校验):数据校验提供容错能力
- 固态硬盘:主体使用Flash Memory(本质ROM)
磁盘存储器
磁盘结构
磁盘地址结构 = 柱面号 + 盘面号 + 扇区号
- 磁头(读写头):通过磁头从磁盘存取数据
- 固定头磁盘:磁头相对盘片径向方向固定
- 活动头磁盘:磁头可移动
- 磁盘:包含多个盘片,安装在磁盘驱动器(由磁头臂、主轴等组成)
- 固定盘磁盘:磁盘永久固定在磁盘驱动器
- 可换盘磁盘:磁盘可移动和替换
- 盘片:一片盘片包含两个盘面
- 盘面:一个盘面包含若干个磁道(水平)
- 柱面:一个柱面包含若干个磁道(垂直)
- 磁道:同心圆,一个磁道可被划分为若干扇区(盘块)
- 扇区(盘块):最小最基本的磁盘存储(读写)单位,一段圆弧
- 簇:很多操作系统都采用 以簇为单位进行空间分配,将同一磁道的若干个扇区组成簇,从而改善磁盘访问时间。
一次完整的磁盘读写操作:
- 寻道(寻找)时间:磁臂启动时间 + 磁头移动到指定磁道所需时间
- 延迟时间:磁头定位到某一扇区的时间(取决于磁盘旋转速度,平均时间取半转的时间)
- 传输时间:磁头从磁盘读出/写入数据的时间(取决于磁盘旋转速度,时间取扫过该扇区的时间)
由于寻道需要移动磁臂,占用时间往往最长。因此存储一个文件一个磁道存储不下的时候,应该选择同一柱面的不同盘面,而不选择同一盘面的不同磁道。
磁盘寻道算法
- 先来先服务(FCFS)
- 公平、简单
- 最短寻找时间优先(SSTF)
- 可能出现“饥饿”现象
- 扫描算法(SCAN、电梯梯度算法):规定离当前磁头最近的请求位置为固定方向,扫描到尽头后反向再扫到满足剩下最后一个请求的位置。
- 不利于远离磁头一端的访问请求
- LOOK调度(默认):不必扫描到尽头,而是扫描到该方向最后一个请求位置则返回
- 循环扫描算法(C-SCAN):与扫描算法类似,扫描到尽头后反向移动至起始端而不服务任何请求,再继续按原方向,扫到满足剩下最后一个请求的位置。
- 消除了对两端磁道请求的不公平
- C-LOOK调度(默认):不必扫描到尽头,也不必返回到起始端位置,而是扫描到该方向最后一个请求位置则返回到第一个请求位置
磁盘格式化
- 低级格式化(物理分区):出厂前进行,分成扇区以便磁盘控制器进行读写操作,在每个扇区采取特别的数据结构(通常分为头信息、数据区域、尾信息)。
- 分区:操作系统把磁盘分为由一个柱面或多个柱面组成的分区(如C盘、D盘)
- 逻辑格式化(创建文件系统):操作系统将初始文件系统数据结构(如空闲表、目录)存储在磁盘上
- 分区控制块(UFS->超级块,NTFS->主控文件表):包含分区详细信息(如分区块数、块的大小、空闲块数量和指针、空闲FCB数量和指针)
表示文件存储器空闲空间的“位向量”表或第一个成组链块,以及卷中的目录区、文件区划分信息都需要放在辅存储器中,一般放在卷头位置(在UNIX系统中被称为超级块)。对卷中的文件进行操作前,超级块需要预先读入系统空闲主存,并且保持主存超级块与辅存卷中超级块的一致性。
磁盘引导块
-
初始化程序(自举程序):负责初始化CPU、寄存器、设备控制器和内存等从而启动操作系统,即负责找到磁盘上的操作系统内核装入内存并开始操作系统的运行。它只在ROM保留很小的自举装入程序,将完整功能的自举程序放在位于磁盘的引导控制块
-
引导控制块(UFS->引导块,NTFS->分区引导扇区):包括从该分区引导启动操作系统所需要的信息(若磁盘无操作系统,则这块内容为空),通常是分区的第一块
-
启动磁盘(系统磁盘):拥有启动分区的磁盘
磁盘坏块
属于硬件故障,操作系统不能修复,只能使用某种机制使系统不去使用坏块。
- 对于简单硬盘:可手工处理,扫描检查坏扇区,然后坏扇区会在FAT表上标明。
- 对于复杂磁盘:控制器维护一个磁盘坏块链表。在出厂前进行低级格式化前就已经初始化,并使用过程中不断更新,对操作系统透明。磁盘控制器可用备用块来逻辑地替代坏块,这种方法称为扇区备用。
磁盘高速缓存与缓冲区
磁盘高速缓存
利用内存的存储空间暂存从磁盘中读出的一系列盘块的信息,即磁盘高速缓存逻辑上属于磁盘,物理上是驻留在内存块的盘块。
磁盘高速缓存在内存的两部分:
- 在内存中开辟单独存储空间,大小固定
- 未利用内存空间作为缓冲池,供请求分页系统和磁盘I/O时共享
缓冲区
I/O缓冲区位于内存中,主要用途:
- 缓和CPU与I/O设备速度不匹配矛盾
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决基本数据单元大小(数据粒度)不匹配的问题
- 提高CPU和I/O设备之间的并行性
假设输入到缓冲区的时间为T,缓冲区输出到用户区时间为M,CPU对数据处理时间为C。
- 单缓冲:\(处理每块数据时间=max(C,T)+M\)
- 双缓冲:\(处理每块数据时间=max(C+M,T)\)
- 循环缓冲:每个缓冲区有一个链接指针指向下一个缓冲区,还需要设置in、out指针。
- 缓冲池:分为空缓存队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓冲队列(输出队列)。
I/O接口(设备控制器)
I/O接口(设备控制器)功能
- 适配主机和外设的通信:
- 主机与外设时序配合:协调不同工作速度的外设和主机之间交换信息
- 信号格式转换:提供主机与外设信号格式(电平、数据格式等)的转换功能
- 实现数据交换:通过数据总线或通道,控制器和主存之间的数据传输;此外还包括设备与控制器之间的数据传输
- 实现数据缓冲:主机与外设速度不匹配,需设置数据缓冲寄存器暂存数据避免丢失数据
- 识别地址码和选择设备:主机送来外设地址码,接口必须译码以选择设备
- 传送控制命令和状态信息:主机要启动某一外设时,向控制寄存器发出启动命令,从而启动相应外设;外设准备就绪时,则将“准备好”状态信息送回接口中的状态寄存器,并反馈给CPU。外设向CPU提出中断请求时,CPU也应该有相应的响应信号反馈给外设。
- 发现和记录设备及自身状态信息:供主机处理使用。
主机可以是CPU、通道、主存(DMA方式)
I/O接口(设备控制器)基本结构
- 数据缓冲寄存器(数据端口) <=数据总线=> 主存(或CPU的寄存器)【数据】
- 状态寄存器(状态端口) =数据总线=> CPU 【接口和设备的状态信息、中断类型号】
- 控制寄存器(控制端口) <=数据总线= CPU 【对外设的控制命令】
-
I/O接口控制逻辑部件:
- 地址总线给出要访问的I/O端口(I/O接口的寄存器)的地址,控制线给出Read/Write控制信号(此外控制线还会传送一些仲裁信号和握手信号),一起发送到 I/O接口控制逻辑部件
- 能对控制寄存器的命令字进行译码,得到的控制信号通过外设界面控制逻辑送到外设。
- 同时,将数据缓冲寄存器的数据发送到外设,或从外设接收数据到数据缓冲寄存器。
- 此外,还具有收集外设状态到状态寄存器的功能。
I/O接口(设备控制器)类型
- 按数据传送方式可分为:并行接口(一个字节/字同时传送)、串行接口(一位一位地传送)
- 按I/O设备控制方式可分为:程序查询接口、中断接口、DMA接口等
- 按功能选择灵活性可分为:可编程接口、不可编程接口
I/O端口及其编址
I/O端口:指接口电路中可被CPU直接访问的寄存器。主要有数据端口、状态端口和控制端口,若干端口加上相应控制逻辑电路才能组成接口。
- 统一编址(存储器映射方式):把I/O端口视为存储器单元进行分配。
- 优点:CPU不需要设置专门的I/O指令,访问I/O的操作更加灵活方便;还可使端口有较大的编址空间。
- 缺点:端口占用存储器地址,使内存容量变小;使用存储器编址的I/O执行速度较慢。
- 独立编址(I/O映射方式):I/O端口地址空间与主存地址空间是两个独立的地址空间。
- 优点:I/O指令与存储器指令有明显区别,程序清晰便于理解。
- 缺点:CPU需要专门设置I/O指令(提供存储器读/写,I/O设备读/写两组控制信号),增加控制复杂性。
I/O指令只能在操作系统内核底层I/O软件中使用,是一种特权指令
I/O方式(程序查询方式、程序中断方式、DMA方式、通道方式)
程序查询方式
CPU通过程序方式不断查询I/O设备的状态信息,直到状态就绪才传送信息。CPU一旦启动I/O就必须停止现行程序的运行,并在插入查询程序。
- CPU执行初始化程序,并预置传送参数。
- 向I/O接口发出命令字(控制端口),启动I/O设备。
- CPU不断从I/O接口读取I/O设备状态信息(状态端口)用于查询状态,直到外设准备就绪。
- 传送一次数据(数据端口)。
- 修改地址和计数器参数。
- 判断传送是否结束,若未结束转第3步,直到计数器为0。
主要特点:
- CPU有“踏步”等待现象,CPU与I/O串行工作
- CPU要花费很多时间来查询和等待,且一段时间内只能和一台外设交换信息,效率低
- 由程序方式实现,设计简单、硬件量少
程序中断方式
CPU在程序中安排好某个时刻启动某台外设,然后CPU继续执行原来的程序。一旦I/O设备完成数据传送的准备工作,就主动向CPU发出中断请求。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序完成一次主机与外设之间的数据传送,传送完成后,CPU返回原来的程序。
DMA方式
主存和I/O设备之间建立一条直接数据通路,传送数据不需要经过CPU,I/O和主机并行工作,程序和传送并行工作。
主要特点:
- 完全由硬件电路直接实现
- DMA传送速度快,CPU与外设并行工作,提高了系统效率,适合于高速外设组成的成组数据传送
- 主存中要开辟专用缓冲区,及时供给和接受外设的数据
- 在传送开始前要通过程序方式进行预处理,结束后要通过中断方式进行后处理
DMA控制器(DMA接口)组成:
- 主存地址计数器:存放要交换数据的主存地址
- 传送长度计数器:记录传送数据的长度,计数溢出时,数据即传送完毕,自动发中断请求信号
- 数据缓冲寄存器:暂存每次传送的数据
- DMA请求触发器:每当I/O设备准备好数据,给一个控制信号,使DMA触发器置位
- 控制/状态逻辑:由控制和时序电路及状态标志组成,用于指定传送方向,修改传送参数,并对DMA请求信号和CPU响应信号进行协调和同步
- 中断机构:当一个数据块传送完毕后触发中断机制,向CPU发出中断请求
DMA传送过程:
-
预处理 (程序方式、测试设备、申请总线):
- CPU执行几条I/O指令以测试I/O设备状态,从而使DMA控制器设置主存地址计数器、传送长度计数器、传送方向、启动该设备等,CPU随后继续执行原来的程序。
- 当I/O设备准备好发送的数据(或接受的输出)时,I/O设备向DMA控制器发送DMA请求,再有DMA控制器向CPU发送总线请求,用以传送数据。
-
数据传送 (硬件方式、传输):
- 完全由DMA(硬件)控制;以字/数据块为基本单位。
- 对于以数据块为单位的传送(如硬盘),DMA占用总线后的数据输入和输出操作都是通过循环(由DMA控制器实现,而非CPU执行程序)来实现的
-
后处理 (中断方式、校验):
- DMA控制器向CPU发出中断请求,CPU执行中断服务程序做DMA结束处理(包括校验送入主存的数据正确性、测试传送过程是否出错、及决定是否继续使用DMA传送其它数据块)
DMA数据传送方式:I/O设备和CPU同时访问主存时,可能发生冲突。
- 停止CPU访问主存:需要DMA接口向CPU发出信号,申请使用权。CPU立即放弃使用权,让DMA接口获得总线控制权。
- DMA与CPU交替访存(CPU周期分割):适用于CPU工作周期比主存存取周期长的情况,将一个CPU周期分化为专供DMA访存和CPU访存的周期;总线使用权不需要申请、建立、归还,而是通过分时控制。
- 周期挪用(周期窃取):DMA接口向CPU发出请求后,
- 若CPU不在访存,则未发生冲突
- 若CPU正在访存,必须待存取周期结束后,CPU将总线占有权让出
- 若CPU或I/O同时请求访存,CPU要暂时放弃总线占有权,由I/O设备挪用一个或几个存储周期。
通道方式
通道:一种外围设备处理器,每个通道都挂接若干外设,CPU在执行I/O命令时,只需启动有关通道,通道将执行通道程序,通道操控设备控制器,进而完成设备的I/O操作。
通道、设备控制器、设备的关系:
- 通道通过控制I/O接口(设备控制器),进而控制设备完成I/O操作。
- 一个通道可为多个设备控制器服务,一个设备控制器可对应多个设备(虽然往往是一个)。
通道执行:
- 通道与CPU共享内存:通道没有自己的内存,而是从主存中取出通道程序,并在通道内执行。
- 通道指令不属于CPU指令系统内。
四种I/O方式的区别
- 传送数据方式:
- 中断方式靠程序传送数据
- DMA方式靠硬件传送数据
- CPU占用:
- 中断程序是程序的切换,需要保护和恢复现场
- DMA方式除了预处理和后处理,其他时候不占用CPU的任何资源
- 响应时机:
- 中断请求的响应只能发生在每条指令执行完毕时(即指令的执行周期后)
- DMA请求的响应可以发生在每个机器周期结束时(在取指周期、间址周期、执行周期后均可),只要CPU不占用总线就可被响应
- 优先级:
- DMA请求的优先级 > 中断请求的优先级
- 传送数据量:
- 中断方式每次传送一个字长
- DMA方式每次传送一个数据块
- 通道方式可以*控制传输的数据块大小
- 硬件数量:
- 一个DMA控制器控制一台设备与内存的数据交换
- 一个通道可以控制多台设备与内存的数据交换
设备分配与回收
设备分配原则:I/O设备的固有属性、I/O设备的分配算法、I/O设备分配安全性、I/O设备独立性
逻辑设备表
逻辑设备表(LUT):将逻辑设备名映射为物理设备名,表项为逻辑设备名、物理设备名、驱动程序地址。实现了设备独立性。
- 整个系统只设置一张LUT:不允许相同的逻辑设备名,适用于单用户系统
- 每个用户设置一张LUT:用户登录时,系统为该用户建立一个进程同时建立一张LUT并放入该进程的PCB中
设备分配数据结构
- 系统设备表(SDT):整个系统只有一张SDT,记录连接到系统所有物理设备的情况。
- 每个物理设备占有一个表目。
- 表目中表项:设备类、设备标识符、DCT、驱动程序入口
- 设备控制表(DCT):表征一个设备,代表设备的各个属性。
- 表项:设备标识符、设备类型、设备状态、控制器表(COCT)指针、设备队列的队首指针
- 控制器控制表(COCT):表征一个控制器,代表控制器各个属性。
- 表项:控制器标识符、控制器状态、通道表(CHCT)指针、控制器队列队首队尾指针
- 通道控制表(CHCT):表征一个通道,代表通道各个属性。
- 表项:通道标识符、通道状态、控制器表(COCT)首址、通道队列队首队尾指针
- 一张设备控制表对应一张控制器控制表(一个设备对应一个设备控制器),一张控制器表对应一张通道控制表(一个通道可为多个设备控制器服务)
- 设备分配过程中,先后访问SDT->DCT->COCT->CHCT,即要求设备可用,控制器可用,通道可用。
- 设备控制器可以控制设备与内存交换数据,有需要时可请求通道为它服务。
设备分配策略(静态分配、动态分配)
- 静态分配:主要用于对独占设备的分配,在用户作业开始执行前由系统一次性分配改作业要求的全部设备、控制器(如通道等),一旦分配,这些设备、控制器(和通道)就一直被该作业所占用,知到作业被撤销;无死锁,但使用效率低;
- 动态分配:在进程执行过程中根据执行需要进行。有利于提高设备利用率,但分配算法不当,可能造成死锁。常见动态分配算法有先请求先分配、优先级高者优先等。
对于独占设备,既可以采用动态分配,又可以静态分配,但往往采用静态分配方式;
对于共享设备,一般采用动态分配方式,但在每个I/O传输的单位时间内只被一个设备占有。
设备分配安全性
- 安全分配方式:进程发出I/O请求后进入阻塞态,直到其I/O操作完成时才被唤醒。
- 优点:设备分配安全
- 缺点:对同一进程而言,CPU和I/O设备是串行工作的
- 不安全分配方式:进程发出I/O请求后继续运行,需要时又发出第二、三..个I/O请求。仅当进程所请求设备已被另一进程占用时,才进入阻塞态。
- 优点:进程可同时操作多个设备,从而迅速推进进程
- 缺点:可能产生死锁
分配过程
- 逻辑设备映射物理设备:根据I/O请求,从逻辑设备表LUT映射出并得到物理设备名。
- 分配设备:根据物理设备名,查找系统设备表(SDT),找到该设备的DCT,再检查DCT状态信息。若忙,便请求I/O进程的PCB挂到设备队列中;若空闲,按照一定算法计算设备分配安全性,若安全,将设备分配给请求进程。
- 分配控制器:设备分配给进程后,再到其DCT中找出与该设备连接的控制器的COCT,检查COCT状态信息;若忙,则请求I/O进程的PCB挂到该控制器的等待队列上;若空闲,控制器分配给请求进程。
- 分配通道:控制器分配后,再找出与该控制器连接的通道的CHCT,检查CHCT状态信息;若忙,则请求I/O进程的PCB挂到该通道的等待队列上;若空闲,通道0分配给请求进程。
- 分配成功:可启动该I/O设备进行数据传送
改进:
- 增加设备独立性,分配同类设备:使用逻辑设备名请求分配,这样系统可从SDT找出第一个该类设备的DCT,若忙又可查找下一个该类设备的DCT...仅当该类设备都忙时,才挂到该类设备等待队列。
- 防止I/O系统“瓶颈”现象,多通路I/O系统结构路:若设备(控制器)所连接的第一个控制器(通道)忙时,查看其连接的第二个控制器(通道)...仅当所有连接的控制器(通道)都忙时,才挂等待队列。
SPOOLing技术(假脱机技术)
输入数据:输入设备=>输入缓冲区【内存】=>输入井【磁盘】=>内存
输出数据:内存=>输出井【磁盘】=>输出缓冲器【内存】=>输出设备
用户进程请求打印时,SPOOLING系统:
- 输出进程在磁盘的输出井中申请空闲磁盘块区,并把打印数据送入其中,然后CPU可以做别的事情。
- 输出进程再为用户进程申请一张空白的用户请求打印表,并将用户打印要求填入其中,再将该表挂到请求打印队列上。
- 待打印机不被占用时再把输出井数据读到输出缓冲区,再打印出来。
-
主要特点:提高I/O速度;将独占设备改造为共享设备,提高了独占设备利用率;实现了虚拟设备功能。
-
磁盘是高速设备优于打印机、键盘、鼠标等中低速设备,因此CPU向磁盘传输速度比CPU向其他设备传输速度要快得多,节省了CPU时间。
中断和异常
发生中断或异常时,运行用户态的CPU会立即进入核心态(硬件实现):
- 实现CPU与I/O设备的并行工作
- 处理硬件故障和软件错误
- 实现人机交互,用户干预机器需要用到终端系统
- 实现多道程序、分时操作,多道程序的切换需要借助于中断系统
- 实时处理需要借助中断系统来实现快速响应
- “软中断”,即实现应用程序和操作系统(管态程序)的切换
- 多处理器系统中各处理之间的信息交流和任务切换
中断(外中断)和异常(内中断)概述
中断(外中断):指处理器和内存以外的部件引起的中断
包括:
- 硬件中断(指外部硬件,也包含了可屏蔽中断、非屏蔽中断)
- I/O中断
- 定时器引起的时钟中断(修改系统时间、时间片、延时、使用CPU时间、各种定时器)
异常(内中断、例外、陷入):主要是处理器和内存内部发生的中断
包含:
- 软件中断
- 使用访管(陷入)指令
- 缺页异常
- 用户程序执行特权指令
- 程序运算引起的各种错误、地址非法、校验错、溢出
- 分时系统中时间片中断
一旦出现应立即处理,且异常不能被屏蔽。
中断分类
- 硬件中断和软件中断:
- 硬件中断:属于外中断,通过外部硬件产生的中断。
- 软件中断:属于内中断,通过某条指令产生的中断,可编程实现。
- 非屏蔽中断和可屏蔽中断:
- 非屏蔽中断:是一种硬件中断,不受中断标识符IF的影响,即在关中断(IF=0)的情况下也会被响应。
- 可屏蔽中断:是一种硬件中断,通过中断请求标记触发器INTR控制,受中断标志位IF的影响,即在关中断情况下不被响应。
中断相关概念
- 中断隐指令:CPU响应中断后,经过某些操作,转去执行中断服务程序。由硬件直接实现,中断隐指令并不是指令系统中的一条真正指令,所以它是一种不允许也不可能被用户使用的特殊指令
- 中断向量(中断服务程序入口地址):不同设备有不同的中断服务程序,每个中断程序都有一个入口地址(即中断向量)
- 中断向量表(中断服务程序入口地址表):系统中全部中断向量集中存放的存储器某个区域
- 硬件向量法:硬件产生中断类型号,而中断类型号指出中断向量存放的地址,再由中断向量地址找到中断向量
中断请求、中断响应、中断处理
中断请求
中断系统需要对每个中断源设置中断请求标记触发器INTR,其状态为“1”时,表示中断源有请求。这些触发器可组成中断请求标记寄存器,可集中在CPU中,也可分散各个中断源中。
中断响应
由于中断请求时间随机,需要中断判优逻辑确定先响应哪个中断源请求。
- 可用硬件实现(硬件排队器,可设置在CPU又可以分散在各个中断源),也可用软件实现(通过查询程序)
- 优先级:
- 硬件故障 > 软件中断(如访管)> 外部中断
- 非屏蔽中断 > 可屏蔽中断
- DMA请求 > I/O中断
- 高速设备 > 低速设备
- 输入设备 > 输出设备
- 实时设备 > 普通设备
响应外中断的条件:
- 中断源有中断请求(中断请求标记触发器INTR为1)
- CPU允许中断,即开中断(中断标记位IF=1)
- 一条指令执行完毕,且没有其它优先度更高的任务(中断屏蔽寄存器开放)
中断响应优先级:硬件排队线路或中断查询程序查询顺序决定(请求到来的顺序)
中断处理
中断处理优先级(中断优先级):由中断屏蔽字决定处理顺序(处理请求的优先级)
中断处理过程
硬件完成(执行中断隐指令):
- 关中断:保护中断现场期间不被新的中断所打断,保证被中断的程序在中断服务程序执行完毕后能接着正确地执行。
- 保存断点:保证中断服务程序执行完毕后能正确返回到原来程序,必须将原来程序断点(PC的内容)保存起来。可以压入堆栈,也可以存入主存特定单元。
- 引出中断服务程序:取出中断服务程序的入口地址(实际上是中断类型号)并传给PC。常用硬件向量法、软件查询法。
中断程序完成:
- 保存现场和屏蔽字:现场信息一般指程序状态字、中断屏蔽寄存器和CPU中某些寄存器的内容。
- 开中断:允许更高级中断请求得到响应。
- 执行中断服务程序
- 关中断:保证恢复现场和屏蔽字时不被打断。
- 恢复现场和屏蔽字
- 开中断
- 中断返回
多重中断技术、中断屏蔽技术
多重中断(中断嵌套)技术
出现更高优先级请求时,暂停现行中断服务程序,转去处理新的中断请求。
- 需要求在中断服务程序中提前设置开中断指令
- 优先级高的中断源有权中断优先级低的中断源
中断屏蔽技术
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源请求,0表示可以正常申请。所有屏蔽触发器组合在一起便构成一个屏蔽字寄存器(这样就可以区分中断优先级了)。
杂项
冯诺依曼结构、现代计算机结构
- 计算机系统组成:运算器、控制器、存储器、输入设备、输出设备
冯诺依曼:
- 以运算器为中心,I/O设备通过运算器与存储器传送数据
现代计算机结构:
- 以存储器为中心,I/O设备可直接与存储器传送数据
- 把运算器和控制器集成在一个芯片上,合称为CPU(*处理器)
性能指标
字长:
- 机器字长:CPU一次能处理数据的位数。(决定计算机运算精度)
- 存储字长:存储器中一个存储单元所存储的位数(即MDR的位数)
- 指令字长:一个指令字的位数
- 数据字长:计算机数据存储所占用的位数
周期:
- CPU时钟周期(节拍、T周期):时钟脉冲频率(主频)的倒数,CPU操作的最基本单位
- CPU时钟频率(主频):主时钟的频率
- 机器周期(CPU周期):可分为定长、不定长的机器周期,包含若干时钟周期(常以存取周期作为基准时间)
- 指令周期:CPU从主存中取出并执行一条指令的时间,包含若干机器周期
- 存取时间:启动一次存储器操作到完成操作所需时间
- 存取周期:连续两次独立访问存储器读/写操作之间所需要的最小时间间隔,往往大于存取时间
速度:
- CPI:执行一条指令所需要的时钟周期数
- MIPS:每秒执行多少百万条指令 = 指令条数/(执行时间*10^6)= 主频/CPI
- MFLOPS、GFLOPS、TFLOPS、ETLOPS、ZTLOPS:每秒执行多少106次、109次、1012、1015、10^18次浮点运算