文章目录
- @[toc]
- 计算机系统概述
- 计算机系统层次结构
- 计算机硬件的基本组成
- 计算机软件的分类
- 计算机的工作过程
- 计算机系统的多级层次结构
- 课后习题
- 计算机的性能指标
- 计算机的主要性能指标
- 几个专业术语
- 课后习题
- 总结
- 数据的表示和运算
- 数制与编码
- 进位计数制及其相互转换
- 定点数的表示与运算
- 定点数的编码表示
- 运算方法和运算电路
- 基本运算部件
- 定点数的移位运算
- 定点数的加减运算
- 定点数的乘除运算
- C语言中的整数类型及类型转换
- 数据的存储和排列
- 课后习题
- 错题集
- 浮点数的表示与运算
- 浮点数的加减运算
- 课后习题
- 总结
- 存储系统
- 存储器概述
- 存储器的分类
- 存储器的性能指标(**存储容量、单位成本、存储速度**)
- 存储器的层次化结构
- 课后习题
- 主存储器
- SRAM和DRAM
- 只读存储器(`ROM`)
- 主存储器的基本组成
- 多模块存储器
- 课后习题
- 主存储器与CPU的连接
- 连接原理
- 主存容量的扩展
- 存储芯片的地址分配和片选
- 存储器与CPU的连接
- 课后习题
- 双端口RAM和多模块存储器
- 双端口RAM
- 多模块存储器
- 外部存储器
- 磁盘存储器
- 固态硬盘
- 课后习题
- 高速缓冲存储器
- 程序访问的局部性原理
- Cache的基本工作原理
- **Cache**和**主存**的映射方式
- Cache中主存块的替换算法
- Cache写策略
- 虚拟存储器
- 虚拟存储器的概念
- 页式虚拟存储器
- 段式虚拟存储器
- 段页式虚拟存储器
- 虚拟存储器与Cache的比较
- 总结
- 指令系统
- 指令格式
- 定长操作码指令格式
- 扩展操作码指令格式
- 指令的操作类型
- 指令的寻址方式
- 指令寻址和数据寻址
- 常见的数据寻址方式
- 程序的机器级代码表示
- 常用汇编指令介绍
- 过程调用的机器级表示
- 选择语句的机器级表示
- 循环语句的机器级表示
- 课后习题
- 复杂指令系统计算机(CISC)
- 精简指令系统计算机(RISC)
- CISC和RISC的比较
- 课后习题
- 总结
- 中央处理器
- CPU的功能和基本结构
- CPU的功能
- CPU的基本结构
- 课后习题
- 指令执行过程
- 指令周期
- 指令周期的数据流
- 指令执行方案
- 课后习题
- 数据通路的功能和基本结构
- 数据通路的功能
- 数据通路的基本结构
- 课后习题
- 控制器的功能和工作原理
- 控制器的结构和功能
- 硬布线控制器
- 微程序控制器
- 课后习题
- 异常和中断机制
- 异常和中断的基本概念
- 异常和中断的分类
- 异常和中断响应过程
- 课后习题
- 指令流水线
- 指令流水线的基本概念
- 流水线的基本实现
- 流水线的冒险与处理
- 流水线的性能指标
- 高级流水线技术
- 课后习题
- 多处理器的基本概念
- SISD、SIMD、MIMD的基本概念
- 硬件多线程的基本概念
- 多核处理器的基本概念
- 共享内存多处理器的基本概念
- 课后习题
- 总结
- 总线
- 总线概述
- 总线基本概念
- 总线的分类
- 系统总线的结构
- 常见的总线标准
- 总线的性能指标
- 课后习题
- 总线操作和定时
- 总线事务
- 同步定时方式
- 异步定时方式
- 课后习题
- 总结
- 输入/输出系统
- I/O接口
- I/O接口的功能
- I/O接口的基本结构
- I/O接口的类型
- I/O端口及其编址
- 课后习题
- I/O方式
- 程序查询方式
- 程序中断方式
- DMA方式(**Direct Memory Access**,直接存储器访问)
- 课后习题
- 总结
文章目录
- @[toc]
- 计算机系统概述
- 计算机系统层次结构
- 计算机硬件的基本组成
- 计算机软件的分类
- 计算机的工作过程
- 计算机系统的多级层次结构
- 课后习题
- 计算机的性能指标
- 计算机的主要性能指标
- 几个专业术语
- 课后习题
- 总结
- 数据的表示和运算
- 数制与编码
- 进位计数制及其相互转换
- 定点数的表示与运算
- 定点数的编码表示
- 运算方法和运算电路
- 基本运算部件
- 定点数的移位运算
- 定点数的加减运算
- 定点数的乘除运算
- C语言中的整数类型及类型转换
- 数据的存储和排列
- 课后习题
- 错题集
- 浮点数的表示与运算
- 浮点数的加减运算
- 课后习题
- 总结
- 存储系统
- 存储器概述
- 存储器的分类
- 存储器的性能指标(**存储容量、单位成本、存储速度**)
- 存储器的层次化结构
- 课后习题
- 主存储器
- SRAM和DRAM
- 只读存储器(`ROM`)
- 主存储器的基本组成
- 多模块存储器
- 课后习题
- 主存储器与CPU的连接
- 连接原理
- 主存容量的扩展
- 存储芯片的地址分配和片选
- 存储器与CPU的连接
- 课后习题
- 双端口RAM和多模块存储器
- 双端口RAM
- 多模块存储器
- 外部存储器
- 磁盘存储器
- 固态硬盘
- 课后习题
- 高速缓冲存储器
- 程序访问的局部性原理
- Cache的基本工作原理
- **Cache**和**主存**的映射方式
- Cache中主存块的替换算法
- Cache写策略
- 虚拟存储器
- 虚拟存储器的概念
- 页式虚拟存储器
- 段式虚拟存储器
- 段页式虚拟存储器
- 虚拟存储器与Cache的比较
- 总结
- 指令系统
- 指令格式
- 定长操作码指令格式
- 扩展操作码指令格式
- 指令的操作类型
- 指令的寻址方式
- 指令寻址和数据寻址
- 常见的数据寻址方式
- 程序的机器级代码表示
- 常用汇编指令介绍
- 过程调用的机器级表示
- 选择语句的机器级表示
- 循环语句的机器级表示
- 课后习题
- 复杂指令系统计算机(CISC)
- 精简指令系统计算机(RISC)
- CISC和RISC的比较
- 课后习题
- 总结
- 中央处理器
- CPU的功能和基本结构
- CPU的功能
- CPU的基本结构
- 课后习题
- 指令执行过程
- 指令周期
- 指令周期的数据流
- 指令执行方案
- 课后习题
- 数据通路的功能和基本结构
- 数据通路的功能
- 数据通路的基本结构
- 课后习题
- 控制器的功能和工作原理
- 控制器的结构和功能
- 硬布线控制器
- 微程序控制器
- 课后习题
- 异常和中断机制
- 异常和中断的基本概念
- 异常和中断的分类
- 异常和中断响应过程
- 课后习题
- 指令流水线
- 指令流水线的基本概念
- 流水线的基本实现
- 流水线的冒险与处理
- 流水线的性能指标
- 高级流水线技术
- 课后习题
- 多处理器的基本概念
- SISD、SIMD、MIMD的基本概念
- 硬件多线程的基本概念
- 多核处理器的基本概念
- 共享内存多处理器的基本概念
- 课后习题
- 总结
- 总线
- 总线概述
- 总线基本概念
- 总线的分类
- 系统总线的结构
- 常见的总线标准
- 总线的性能指标
- 课后习题
- 总线操作和定时
- 总线事务
- 同步定时方式
- 异步定时方式
- 课后习题
- 总结
- 输入/输出系统
- I/O接口
- I/O接口的功能
- I/O接口的基本结构
- I/O接口的类型
- I/O端口及其编址
- 课后习题
- I/O方式
- 程序查询方式
- 程序中断方式
- DMA方式(**Direct Memory Access**,直接存储器访问)
- 课后习题
- 总结
计算机系统概述
计算机系统层次结构
计算机硬件的基本组成
-
早期的冯诺依曼机
-
存储程序的思想奠定了现代计算机的基本结构,以此概念为基础的各类计算机通称为冯诺依曼机
-
特点如下
-
计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备5大部件组成
-
指令和数据以同等地位存储在存储器中,并可按地址寻访
-
指令和数据均用二进制代码表示
-
指令由操作码和地址码组成
- 操作码指出操作的类型
- 地址码指出操作数的地址
-
指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下可根据运算结果或根据设定的条件改变执行顺序
-
早期的冯诺依曼机以运算器为中心,输入/输出设备通过运算器与存储器传送数据
-
-
-
现在计算机的组织结构
- 微处理器出现之前,运算器和控制器分离,且存储器容量很小
- 现代计算机已发展为以存储器为中心,使I/O操作尽可能地绕过CPU,直接在I/O设备和存储器之间完成,以提高系统的整体运行效率
-
计算机的功能部件
-
输入设备
-
输出设备
-
存储器
-
用来存放程序和数据
- 主存储器
- CPU能够直接访问
- 由存储单元组成
- 由存储元件组成
- 由一位二进制代码组成
- 存储单元存储的二进制代码,称为存储字
- 存储单元存储的二进制代码的位数,称为存储字长
- 存储字长,可以是1B或字节的偶数倍
- 由存储元件组成
- 辅助存储器
- 用于帮助主存储器记忆更多的信息,辅助存储器的信息必须调入主存后,才能被CPU访问
- 按存储单元的地址进行存取
- 相联存储器是按内容访问
- 主存储器
-
组成
-
MAR (Memory Address Register) 地址寄存器
- 存放访存地址,经过地址译码后找到所选的存储单元,用于寻址
- 用于寻址,其位数对应着存储单元的个数
- 如MAR为10位,则有 2 10 = 1024 2^{10}=1024 210=1024个存储单元,记为1K
- MAR的长度与PC的长度相等
- MDR的位数和存储字长相等,一般为字节的二次幂的整数倍
MAR与MDR虽然是存储器的一部分,但在现代CPU中却是存在于CPU中的,另外,高速缓存Cache也一样
-
MDR (Memory Data Register) 数据寄存器
- 暂存要从存储器中读或写的信息
-
时许控制器
- 产生存储器操作所需要的各种时序信号
-
-
-
运算器
- ALU (Arithmetic And Logical Unit) 算术逻辑单元 - 运算器的核心
- 主要功能是二位元的算术运算,如加减乘,不包括整数除法
- 基本上,在现代CPU体系结构中,二进制都以补码的形式来表示
- 包含以下寄存器
- ACC (Accumulator) 累加器
- 用来储存计算产生的中间结果
- MQ (Multiple-Quotient Register) 乘商寄存器
- 负责数据的乘除法运算,并可保存运算结果
- X 操作数寄存器
- IX 变址寄存器
- 主要用于存放存储单元在段内的偏移量
- BR 基址寄存器
- 用来存放操作数或中间结果,以减少对存储器的访问次数
- PSW(Program Status Word) 程序状态寄存器/标志寄存器
- 用于OS在管态(系统态)和目态(用户态)之间的转换
- ACC (Accumulator) 累加器
- ALU (Arithmetic And Logical Unit) 算术逻辑单元 - 运算器的核心
-
控制器
- PC (Program Counter) 程序计数器
- 存放当前欲执行指令的地址,可以自动加1以形成下一条指令的地址
- 与主存的MAR有一条直接通路
- IR (Instruction Register) 指令寄存器
- 存放当前的指令,数据来自主存的MDR
- 指令中的操作码OP(IR)送至CU,用于分析指令并发出各种微操作命令序列
- 指令中的地址码Ad(IR)送往MAR,用于取操作数
- CU (Control unit) 控制单元
- PC (Program Counter) 程序计数器
-
冯诺依曼模型机
-
CPU和主存之间通过一组总线相连,总线中有地址、控制、数据3组信号线
- MAR中的地址信息会直接送到地址线上,用于指向读/写操作的主存存储单元
- 控制线中有读/写信号线,指出数据是从CPU写入主存还是从主存读出到CPU,根据是读操作还是写操作来控制将MDR中的数据是直接送到数据线上,还是将数据线上的数据接收到MDR中
-
计算机软件的分类
-
系统软件和应用软件
-
系统软件
- 基础软件,通常作为系统资源提供给用户使用
- 主要有操作系统(OS)、数据库管理系统(DBMS)、语言处理程序、分布式软件系统、网络软件系统、标准库程序、服务性程序等
-
应用软件
- 用户编制的程序
数据库管理系统(DBMS)和数据库系统(DBS)是有区别的
- DBMS是系统软件,位于用户和操作系统之间的一层数据管理软件
- DBS是系统,不是系统软件,由数据库、数据库管理系统、数据库管理员、应用系统构成
-
-
三个级别的语言
机器语言
- 二进制代码语言,是计算机唯一可以直接识别和执行的语言
汇编语言
- 用英文单词或其缩写代替二进制的指令代码,使用汇编语言编辑的程序,必须经过一个称为汇编程序的系统软件的翻译,将其转换为机器语言后,才能执行
高级语言
- 需要经过编译程序编译成汇编语言程序,再经过汇编操作得到机器语言程序
- 或者直接由高级语言翻译成机器语言程序
-
翻译程序
- 汇编程序。将汇编语言程序翻译成机器语言程序
- 解释程序。将源程序中的语言按执行顺序逐条翻译成机器指令并立即执行
- 编译程序。将高级语言程序翻译成汇编语言或机器语言程序
计算机的工作过程
-
计算机的工作过程分为如下三个步骤
- 把程序和数据装入主存储器
- 将源程序转换成可执行文件
- 从可执行文件的首地址开始逐条执行指令
-
从源程序到可执行文件
预处理
- 对以**字符#**开头的命令进行处理
- 输出i文件
编译
- 生成汇编语言源程序,即s文件
汇编
- 翻译成机器语言指令,并将指令打包成可重定位目标文件的o文件,是二进制文件
链接
- 将多个可重定位目标文件和标准库函数合并为一个可执行目标文件
-
指令执行过程的描述
-
第一条指令置于PC中,根据PC取出第一条指令
-
经过译码、执行步骤,完成这条指令的功能,并计算下一条指令的地址
-
举例取数指令的执行过程
取指令
- PC -> MAR -> M -> MDR -> IR
- 将PC的内容送至MAR
- MAR中的内容直接送地址线
- 控制器将读信号送读/写信号线
- 主存根据地址线上的地址和读信号,从指定存储单元读出指令,送到数据线上
- MDR从数据线接收指令信息
- 传送到IR中
分析指令
- 控制器根据IR中指令的操作码,生成相应的控制信号,送到不同的执行部件
- 本例子中,IR是取数指令,因此读控制信号被送到总线的控制线上
执行指令
- 将IR中指令的地址码送MAR
- MAR中的内容送地址线
- 控制器将读信号送读/写信号线,从主存指定存储单元读出操作数,并通过数据线送至MDR,再传送到ACC中
- 每取完一条指令,还须为取下一条指令做准备,形成下一条指令的地址,即**(PC)+1 -> PC**
(PC)指程序计数器PC中存放的内容。PC->MAR应理解为**(PC)->MAR**,即程序计数器中的值经过数据通路送到MAR,即表示数据通路时括号可省略(因为指示表示数据流经的途径,而不强调数据本身的流动)。但运算时括号不能省略,即**(PC)+1->PC不能写为PC+1->PC**
-
-
用新的到的指令地址,继续读出第二条指令并执行,直到程序结束为止
-
计算机系统的多级层次结构
微程序机器层
- 硬件层,由机器硬件直接执行微指令
传统机器语言层
- 机器层,由微程序解释机器指令系统
操作系统层
- 操作系统层,由操作系统程序实现
- 操作系统程序由机器指令和广义指令组成
- 广义指令是为了扩展机器功能而设置的,是由操作系统定义和解释的软件指令
- 操作系统程序由机器指令和广义指令组成
- 又称混合层
- 操作系统层,由操作系统程序实现
汇编语言层
- 为用户提供一种符号化的语言,借此可编写汇编语言源程序
- 由汇编程序支持和运行
高级语言层
- 面向用户,为方便用户编写应用程序而设置的
- 应用程序层
- 高级语言之上,还可以有应用程序层,如文字处理软件
课后习题
- 地址寄存器MAR存放访存地址,因此位数与地址码长度相同
- 地址寄存器MAR位于CPU内,但并未集成到运算器、控制器中
- 地址寄存器用来保存当前CPU所访问的内存单元的地址
- 8位表示计算机字长为8位,即一次可以处理8位的数据
- 16位表示地址码的长度,因此机器有 2 16 2^{16} 216个地址空间
- 解释程序也是将高级语言转换为机器语言的,虽然只是翻译,但是可以理解成转换
- 硬件描述语言程序不能让机器直接执行
计算机的性能指标
计算机的主要性能指标
-
字长
- 指计算机进行一次整数运算(即定点整数运算)所能处理的二进制数据的位数,通常与CPU的寄存器位数、加法器有关
- 字长一般等于内部寄存器的大小
- 字长越长,数的表示范围越大,计算精度越高。
- 计算机字长通常选定为字节(8位)的整数倍
-
数据通路带宽
- 指数据总线一次所能并行传送信息的位数
- 这里指的是外部数据总线的宽度,与CPU内部的数据总线宽度(内部寄存器的大小)有可能不同
- 各个子系统通过数据总线连接形成的数据传送路径称为数据通路
-
主存容量
- 主存储器所能存储信息的最大容量,通常以字节衡量,也可用字数 * 字长(如 512K * 16位)来表示
- MAR的位数反映储存单元的个数,反映可寻址范围的最大值(不一定是实际存储器的存储容量)
- MAR为16位,表示有 2 16 = 65536 2^{16}=65536 216=65536个存储单元,可称为64K内存
- MDR为32位,表示每个存储单元有32个存储元件,即32个二进制位
- 所以存储容量为 64K*32位运算速度
-
运算速度
-
吞吐量和响应时间
-
吞吐量
- 主要取决于主存的存取周期
-
响应时间
- 包括CPU时间(运行一个程序所花费的时间)与等待时间(用于磁盘访问、存储器访问、I/O操作、操作系统开销等时间)
-
主频和CPU时钟周期
-
CPU时钟周期
- 即主频的倒数,是CPU中最小的时间单位,执行指令的每个动作至少需要1个时钟周期
- CPU时钟周期 = 1 / CPU主频
- 通常为节拍脉冲/T周期
-
主频
(CPU时钟频率)- 主频通常以Hz为单位,1Hz表示每秒1次。
-
CPI (Clock cycle Per Instruction)
- 执行一条指令所需的时钟周期数
- 不同指令的时钟周期数可能不同,对一个程序或机器来说,其CPI指该程序或该机器指令集中所有的指令执行所需的平均时钟周期数,此时CPI是一个平均值
-
CPU执行时间
C P U 执行时间 = C P U 时钟周期数 ∗ C P U 时钟周期 C P U 执行时间 = C P U 时钟周期数 / 主频 C P U 执行时间 = ( 指令条数 ∗ C P I ) / 主频 C P U 执行时间 = ( 指令条数 ∗ C P I ) ∗ C P U 时钟周期 \begin{aligned} & \rm CPU执行时间 = CPU时钟周期数 * CPU时钟周期 \newline & \rm CPU执行时间 = CPU时钟周期数 / 主频 \newline & \rm CPU执行时间 = (指令条数 * CPI) / 主频 \newline & \rm CPU执行时间 = (指令条数 * CPI) * CPU时钟周期 \end{aligned} CPU执行时间=CPU时钟周期数∗CPU时钟周期CPU执行时间=CPU时钟周期数/主频CPU执行时间=(指令条数∗CPI)/主频CPU执行时间=(指令条数∗CPI)∗CPU时钟周期 -
MIPS (Million Instructions Per Second)
- 每秒执行多少百万条指令
- MIPS = 指令条数 / (执行时间 * 1 0 6 10^6 106) = 主频 / (CPI * 1 0 6 10^6 106)
-
MFLOPS (Mega Floating-point Operations Per Second)
- 每秒执行多少百万次浮点运算
-
GFLOPS (Giga Floating-point Operations Per Second)
- 每秒执行多少十亿次浮点运算
-
TFLOPS (Tera Floating-point Operations Per Second)
- 每秒执行多少万亿次浮点运算
-
-
基准程序 (Benchmarks)
- 专门用来进行性能评价的一组程序
几个专业术语
系列机
- 具有基本相同的体系结构,使用相同基本指令系统的多个不同型号的计算机组成的一个产品系列
兼容
- 软件或硬件的通用性
软件可移植性
- 把使用在某个系列的计算机中的软件直接或进行很少的修改可能运行在另一个系列计算机的可能性
固件
- 将程序固化在ROM中组成的部件称为固件。
- 具有软件特定的硬件,吸收了软/硬件各自的优点,其执行速度快于软件,灵活性优于硬件
课后习题
- 汇编程序员可以通过指定待执行指令的地址来设置PC的值,状态寄存器、通用寄存器只有汇编程序员可见,而IR、MAR、MDR是CPU内部工作寄存器,对程序员透明
- 时钟周期是最基本的时间单位,CPU周期又称机器周期,由多个时钟周期组成
- CPI是执行一条指令所需的时钟周期数,系统结构、指令集、计算机组织都会影响CPI,而时钟频率不会影响CPI,只可加快指令的执行速度
- 主频、主存容量、指令系统并不是综合性能的体现,吞吐率指系统在单位时间内处理请求的数量,是评价计算机系统性能的综合参数
- 提升CPU主频、扩大主存容量对性能提升是有限的,采用并行技术才是实现高性能计算的重要途径
- 运行时间 = 指令数 * CPI / 主频
- MIPS = 主频 / (CPI * 1 0 6 10^6 106)
- MIPS是每秒执行几百万条指令,而CPI是执行一条指令需要几个时钟周期,在时钟周期和时间秒数之间,还需要一个主频来沟通
总结
-
主频高的CPU一定比主频低的CPU快吗?
- 不一定,还需要看CPU的流水线的各方面的性能指标(架构、缓存、指令集、CPU的位数、Cache大小等)
-
在描述存储容量、文件大小等时,K、M、G、T通常用2的幂次表示,如1Kb = 2^10b;在描述速率、频率等时,k、M、G、T通常用10的幂次表示,如 1kb/s = 10^3 b/s。通常前者用大写的K,后者用小写的k,但其他前缀均为大写,表示的含义取决于所用的场景。
-
翻译程序:把高级语言源程序翻译成机器语言程序(目标代码)的软件。有两种
编译程序
:将高级语言源程序一次全部翻译成目标程序,每次执行程序时,只需执行目标程序。解释型程序
:将源程序的一条语句翻译成对应的机器目标代码,并立即执行,然后翻译下一条源程序语句并执行,直至所有源程序语句全部被翻译并执行完。(不会生成目标程序)
-
编译程序与汇编程序的区别:若源程序是 C,C++,Java 等高级语言,而目标语言是 汇编语言,或机器语言 之类的低级语言,则称这样的翻译程序为编译程序。若源语言是 汇编语言,而目标语言是 机器语言,则这样的翻译程序称为 汇编程序。
-
在CPU中,IR,MAR和MDR对各类程序员都是透明的
-
机器字长 VS 指令字长 VS 存储字长
- 机器字长:计算机能直接处理的二进制数据的位数,机器字长一般等于内部寄存器的大小,它决定了计算机的运算精度。
- 指令字长:一个指令字中包含的二进制代码的位数。
- 存储字长:一个存储单元存储的二进制代码的长度。
- 指令字长一般取存储字长的整数倍,若指令字长等于存储字长的2倍,则需要2次访存来取出一条指令。
-
基准程序执行的越快,说明机器的性能越好吗?
- 一般情况下能反映出来,但是基准程序中的语言存在频度的差异,因此运行结果并不能完全说明问题
数据的表示和运算
数制与编码
-
常用2的次方值表
7 8 9 10 15 16 20 128 256 512 1024 32768 65536 1048576
进位计数制及其相互转换
-
进位计数法
-
一个r进制数( K n K n − 1 . . . K 0 K − 1 . . . K − m K_nK_{n-1}...K_0K_{-1}...K_{-m} KnKn−1...K0K−1...K−m)的数值可表示为
K n r n + K n − 1 r n − 1 + . . . + K 0 r 0 + K − 1 r − 1 + . . . + K − m r − m = ∑ i = n − m K i r i K_nr^n+K_{n-1}r^{n-1}+...+K_0r^0+K_{-1}r^{-1}+...+K_{-m}r^{-m}=\sum_{i=n}^{-m}K_ir^i Knrn+Kn−1rn−1+...+K0r0+K−1r−1+...+K−mr−m=i=n∑−mKiri- r是基数, r i r^i ri是第i位的位权
- 整数位最低位规定为第0位
八进制
- 因为r=3,所以只要把二进制中的3位数码编为一组就是一位八进制数码
十六进制
- 同理,4位二进制数码与1位十六进制数码相对应
-
-
真值和机器数
- 真值:带“+”或“-”符号的数称为真值
- 机器数:把符号“数字化”的数称为机器数
- 0 ~ 9 的ASCII码值为 48 (011 0000) ~ 57 (011 1001),即去掉高3位,只保留低4位,正好是二进制形式的 0~9
- 7E5H,H代表16进制
-
进制转换
-
二进制转八进制、十六进制
- 以小数点为界,将一串二进制数分为3位一组或4位一组。整数部分,从左边开始补0,小数部分,从右边开始补0。
-
八进制、十六进制转二进制
- 只需将每位改为3位或4位二进制数即可
-
任意进制转十进制
保底法
- 如果存在小数部分,则根据二进制、八进制、十六进制,乘以对应的基数,每乘一次,左移一位,直到全部是整数。这时候就通过位置法计算出十进制,然后再除以之前乘的数
按权展开相加法
- 将任意进制数的各位数码与它们的权值相乘,再把乘积相加,就得到了一个十进制数。这种方法称为按权展开相加法。
-
十进制转任意进制
- 整数部分用
除基取余法
,小数部分用乘基取整法
,最后将整数部分和小数部分的转换结果拼接起来 除基取余法
- 整数部分除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位(即除基取余,先余为低,后余为高),
商为0
时结束。
- 整数部分除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位(即除基取余,先余为低,后余为高),
乘基取整法
- 小数部分(乘基后如果出现整数部分,则整数部分不参与下一次乘基计算)乘基取整,最先取得的整数为数的最高位,最后取得的整数为数的最低位(即乘基取整,先整为高,后整为低),乘积为1.0(或满足精度要求)时结束。
- 乘积取整法和除基取余法。本质就是二进制的左移和右移操作。整数部分,通过左移,即除基,不断获得对应的二进制位。小数部分,也通过左移,即乘基,不断获得对应的二进制位
计算机中,整数可以连续表示,但小数是离散的,所以并不是每个小数都可以准确地用二进制表示
- 整数部分用
-
定点数的表示与运算
定点数的编码表示
-
在现代计算机中,通常用定点补码整数表示整数,用定点原码小数表示浮点数的尾数部分,用移码表示浮点数的阶码部分
-
真值零的原码表示有 正零 和 负零 两种形式
-
原码表示的优点是与真值的对应关系简单、直观,与真值的转换简单,并且用原码实现乘除运算比较简便。缺点是0的表示不唯一,更重要的是原码加减运算比较复杂
- 原码加减运算规则比较复杂,对于两个不同符号的加法或同符号的减法,需要比较两个数的绝对值大小,然后用绝对值大的数减去绝对值小的数,最后还要给结果选择合适的符号
- 补码表示法中的加减运算统一采用加法操作实现
-
变形补码(模4补码)
- 双符号位的补码
-
补码与真值转换 (仅负数)
- 真值转补码
- 符号位置1,其余各位取反,最后末位加1
- 补码转真值
- 符号位不变,末位减1,最后各位取反
- 真值转补码
-
移码表示法
-
常用来表示浮点数的阶码,只能表示整数
-
移码就是在真值X上加上一个常数(偏置值),通常这个常数取 2 n 2^n 2n,相当于X在数轴上向正方向偏移了若干单位
-
特点
-
移码中的零表示唯一
-
一个真值的移码和补码仅差一个符号位,补码符号位取反就是移码
- 移码的符号位1表示正数,0表示负数
-
移码全0表示最小的整数** − 2 n -2^n −2n,全1表示最大的整数 2 n − 1 2^n-1 2n−1**
-
移码保持了数据原有的大小顺序,移码大真值就大,移码小真值就小
- 移码没有标准
- 通常对于n位二进制数,偏移量** K = 2 n − 1 K=2^{n-1} K=2n−1,如8位二进制数,偏置值为128**,这也叫标准移码,所以有0000 0000表示**-128**,1111 1111表示127,这样就可以通过补码符号位取反来获得移码,因为这种标准偏置值刚好能使得符号位+1
- 在IEEE 754浮点数标准中的移码是非标准的,它的偏置值为** 2 e − 1 − 1 2^{e-1}-1 2e−1−1,也就是说对于单精度浮点数的偏置值为127**
-
-
-
四种编码总结
-
原码、补码、反码的符号位相同,正数的机器码相同
-
原码、反码的表示在数轴上对称,二者都存在**+0和-0**两个零
-
补码、移码的表示在数轴上不对称,零的表示唯一,它们比原码、反码多表示一个数
-
整数的补码、移码的符号位相反,数值位相同
-
负数的反码、补码末位相差1
-
原码很容易判断大小。而负数的反码、补码很难直接判断大小
-
-
各种编码数字排序分布(从上至下,从大到小,以8位带符号数举例)
类型 原码(两种0) 补码(多了一个最小负数) 反码(对应原码) 移码(对应补码) 最大值 0111 1111 0111 1111 0111 1111 1111 1111 0111 1110 0111 1110 0111 1110 1111 1110 … … … … 零 0000 0000 0000 0000 0000 0000 1000 0000 零 1000 0000 1111 1111 -1 1000 0001 1111 1111 1111 1110 0111 1111 -2 1000 0010 1111 1110 1111 1101 0111 1110 -3 1000 0011 1111 1101 1111 1110 0111 1101 … … … … 最小值 1111 1111 1000 0000 1000 0000 0000 0000 二进制顺序 $ +0 \rightarrow max \rightarrow -0 \rightarrow min$ 0 → m a x → m i n → − 1 0 \rightarrow max \rightarrow min \rightarrow -1 0→max→min→−1 + 0 → m a x → m i n → − 0 +0 \rightarrow max \rightarrow min \rightarrow -0 +0→max→min→−0 m i n → m a x min \rightarrow max min→max 特点 去掉符号位,基于0双向增大 去掉符号位,从0增大,从最小值增大 二进制顺序与补码一致 补码符号位取反,特点是真正意义上的,整个数轴从二进制0到二进制最大值
运算方法和运算电路
基本运算部件
- 运算器由算术逻辑单元ALU、移位器、状态寄存器、通用寄存器组成。基本功能包括加减乘除、与或非、异或、移位,求补等操作。ALU的核心部件是加法器
定点数的移位运算
算术移位
- 对有符号数来说,移位过程中,符号位保持不变
正数
- 由于 [ x ] 原 = [ x ] 补 = [ x ] 反 = 真值 [x]_原=[x]_补=[x]_反=真值 [x]原=[x]补=[x]反=真值,因此移位后出现的空位均以0添之
负数
(负数左移是变小一倍,右移是变大一倍),推算时,用实例举证,如**-4**原码
- -4为1000 0100,-8为1000 1000,-2为1000 0010
- 所以左移、右移都补0
补码
- -4为1111 1100,-8为1111 1000,-2为1111 1110
- 所以左移补0,右移补1
反码
- -4为1111 1011,-8为1111 0111,-2为1111 1101
- 所以左移、右移都补1
逻辑移位
- 将操作数视为无符号数
- 左移、右移都补0
定点数的加减运算
-
补码的加减法运算(设机器字长为n+1)
- 遵循二进制运算规则,逢二进一
- 若做加法,两数的补码直接相加。若做减法,则将被减数与减数的机器负数相加
- 符号位与数值位一起参与运算,加减运算结果的符号位也在运算中直接得出
- 最终运算结果的高位丢弃,保留n+1位,运算结果亦为补码
-
溢出判别方法
- 仅当两个符号相同的数相加(减法通常转换成加法)才可能产生溢出
采用一位符号位
- 由于减法运算在机器中是用加法器实现的,所以减法要转换成加法,只要参加加法运算操作的两个数符号相同,结果又与原操作数符号不同,则表示结果溢出
- 原理
- 符号位相同的数相加,结果的符号位与操作数不同,说明结果超出影响了符号位,已溢出
采用双符号位
(模4补码)- 运算结果的两个符号位相同,表示未溢出,两个符号位不同则表示溢出,此时最高位符号位代表真正的符号
- 双符号位规则:00表示正数,11表示负数
- 原理
- 双符号位为00或11,表示加法运算结果在合法范围内,无溢出
- 双符号位为01,只能是两个00符号位的数相加,导致溢出,故称正溢出
- 双符号位为10,只能是两个11符号位的数相加,导致溢出,故称负溢出
采用一位符号位,根据数据位的进位情况
判断溢出- 若符号位的进位与最高数位的进位相同,则没有溢出,否则发生溢出
- 原理
- 两个0符号位的数相加,符号位进位只能为0,所以最高数位进位不为0,说明结果正溢出
- 两个1符号位的数相加,符号位进位只能为1,所以最高数位进位不为1,说明是两个很小的负数相加,导致结果负溢出
定点数的乘除运算
-
乘法运算由累加、右移操作实现,可分为原码一位乘法和补码一位乘法
-
原码一位乘法
-
符号位与数值位分开求,乘积符号由两个数的符号位
异或
形成,数值部分则是两个数的绝对值相乘之积
-
由竖式乘法运算演变而来
- 初始部分积记为00.0000
- 被乘数、乘数均取绝对值参加运算,看作无符号数
- 使用双符号位(部分积和乘数做加法时,可能出现部分积大于1的情况,产生进位,但此刻并非溢出)
- 每次加法运算后都要右移,最后一步也不例外
-
-
补码一位乘法
(Booth算法)-
有符号数的乘法,采用相加、相减操作计算补码数据的乘积
-
booth算法本质
-
0的存在,可以降低运算次数,因为0和任何数相乘都为0,就无需再计算
-
-
-
定点数的除法运算
-
符号扩展
-
算术运算中,有时必须把带符号的定点数转换成具有不同位数的表示形式
-
正数
- 符号位不变,新表示形式的所有扩展位用0进行填充
-
负数
-
原码
- 与正数相同,但是符号位为1
-
补码
- 原有形式的符号位移动到新形式的符号位上,新表示形式的所有附加位都用**1(对于整数)或0(对于小数)**进行填充
-
-
-
原码除法
(不恢复余数法、原码加减交替除法)- 商符和商值分开进行,减法操作用补码加法实现,商符由两个操作数的符号异或形成
- 只在最终余数为负时,才需要恢复余数
-
补码除法
(加减交替法)- 异号相除是看够不够减,然后上商,够减商0,不够减商1
-
C语言中的整数类型及类型转换
- 整数类型及类型转换(数据使用补码存储)
- C语言数据类型长度
- int - 32位,short - 16位,long - 64位
- 有符号数和无符号数的转换
- 强制类型转换的结果保持位值不变,仅改变了解释这些位的方式
- 不同字长整数之间的转换
- 当大字长变量向小字长变量强制类型转换时,系统把多余的高位字长部分直接截断,低位直接赋值,因此也是一种保持位值的处理方法。
- 短字长整数到长字长整数的转换,不仅要使相应的位值相等,高位部分还会扩展为原数字的符号位
- 原数字是无符号整数,则进行零扩展,扩展后的高位部分用0填充
- 原数字是有符号整数,则进行符号扩展,扩展后的高位部分用原数字符号位填充
- C语言数据类型长度
数据的存储和排列
-
数据存储的 大端方式 VS 小端方式
-
大端方式
- 按从最高有效字节到最低有效字节的顺序存储数据,即最高有效字节存放在前面
-
小端方式
(地址存放数据从右到左)- 按从最低有效字节到最高有效字节的顺序存储数据,即最低有效字节存放在前面
-
举例
- 在32位计算机中,一个int型变量的机器数为01 23 45 67H,其最高有效字节是01H,最低有效字节是67H
2. 操作数为0x 8 04 94 64,地址存放的是64H、94H、04H、08H,说明是小端方式,即立即数存放的字节序列恰好与操作数的字节顺序相反
- 在32位计算机中,一个int型变量的机器数为01 23 45 67H,其最高有效字节是01H,最低有效字节是67H
-
数据按 边界对齐 方式存储
-
对于机器字长为32位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4的整数倍。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样无论所取的数据是字节、半字还是字,均可一次访存取出,提高取指令和取数的速度。
-
边界对齐是一种空间换时间的思想。RISC如 ARM 采用边界对齐,而CISC如 x86 对齐和不对齐都支持,因为对齐方式取指令时间相同,因此能适应指令流水。
课后习题
- 补码一位乘法中,最多需要n次移位,n+1次加法运算。原码乘法移位和加法运算最多均为n次
- 补码一位乘法中,一共向右移位N次,加上原先的N位,一共是2N位数值位,因为乘积结果需要加上符号位,因此共2N+1位
- 低位进位用来判断是否进行减法用,不管是补码减法,还是无符号数减法,都是用被减数加上减数的负数的补码来实现的,根据求补公式,减数y的负数的补码为 [ − y ] 补 = Y ‾ + 1 [-y]_补=\overline Y + 1 [−y]补=Y+1,因此,在加法器的输入端用一个反向器实现,当低位进位为1时,表示做减法。为0时则做加法
错题集
- 54页
- 选择题:4、5、10、15、21、24、25、29、30、43、45
- 综合题: 1、2、4、6
浮点数的表示与运算
-
阶码 控制 小数点的位置,阶码每加一,整个数值增大到2倍,小数点向右移一位,阶码每减一,整个数值减少2倍,小数点向左移一位
-
15张图带你了解浮点数
注意,上图中阶码多了一个1,实际上应该是 0111 1100,按照标准移码来说,这是**-4**,但浮点数使用的是非标准移码,即偏置值为127,因为** [ X ] 移 = [ X ] 原 + 偏置值 [X]_移=[X]_原+偏置值 [X]移=[X]原+偏置值,即对浮点数的阶码来说,0111 1111才是0**,所以阶码的0111 1100表示**-3**
-
浮点数的一般格式
N = ( − 1 ) S × M × R E \rm N=(-1)^S \times M \times R^E N=(−1)S×M×RE -
S取值0或1,用来决定浮点数的符号
-
M是一个二进制定点小数,称为尾数,一般用定点原码小数表示
-
E是一个二进制定点整数,称为阶码或指数,用非标准移码表示
-
R是基数(隐含),可以约定为2、4、16等
-
可见浮点数由数符、尾数、阶码三部分组成
-
下图是32位短浮点数格式
-
第0位为数符S
-
第1~7位为移码表示的阶码E(偏置值为64,这里是7位阶码,注意IEEE 754标准里面是8位阶码)
-
第8~31位为24位二进制原码小数表示的尾数M
-
阶码的值表示浮点数的小数点的实际位置,位数反映浮点数的表示范围
-
尾数的位数反映浮点数的精度
-
浮点数的表示范围
-
原码是关于原点对称的,所以浮点数的范围也是关于原点对称的
- 数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理
2. 数据下溢时,浮点数值趋于0,计算机仅将其当做机器零处理
- 数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理
![image-20220928195322114](https://img-blog.csdnimg.cn/img_convert/a987e34ca43fa9bd5d828a29f5f65448.png)
-
规格化浮点数
-
尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高。为了在浮点数运算过程中,尽可能多的保留有效数字的位数,使有效数字尽量占满尾数数位,必须在运算过程中对浮点数进行规格化操作
-
通过调整一个 非规格化浮点数 的 尾数、阶码 的大小,使非零的浮点数在 尾数的最高数位上保证是一个有效值。
- 左规
- 当运算结果的尾数的最高数位不是有效位,即出现** ± 0.0...0 × . . . × \pm0.0...0 \times ... \times ±0.0...0×...×** 的形式时,需要进行左规
- 当浮点数运算的结果为非规格化时,要进行规格化处理,将尾数算术左移一位、阶码减一(基数为2时) 的方法。 可能要进行多次。
- 右规
- 当运算结果的尾数的有效位进到小数点前面时,需要进行右规
- 当浮点数运算的结果 尾数出现溢出(双符号位为01或10)时,将尾数算术右移一位、阶码加一(基数为2时) 的方法。 需要右规时,只需进行一次。
- 左规
-
原码表示的规格化尾数M的绝对值应满足 1 R ≤ ∣ M ∣ ≤ 1 \frac{1}{R} \le |M| \le 1 R1≤∣M∣≤1。若R=2,则有 1 2 ≤ ∣ M ∣ ≤ 1 \frac{1}{2} \le |M| \le 1 21≤∣M∣≤1
- 基数不同,浮点数的规格化形式也不同
- 基数为2时,原码规格化的尾数最高位一定是1
- 基数为4时,原码规格化的尾数最高两位不全为0
- 基数不同,浮点数的规格化形式也不同
-
IEEE 754 标准
IEEE 754标准与普通浮点数格式要求要区分开。
-
IEEE 754标准的浮点数(除临时浮点数外),是尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数
-
以短浮点数为例,最高位为 数符位;其后是 8位阶码,以 2 为底(即基数为2),用 移码 表示,阶码的 偏置值 为 2 8 − 1 − 1 = 127 2^{8-1} -1=127 28−1−1=127;其后 23 位是原码表示的 尾数数值位。对于 规格化 的二进制浮点数,数值的最高位总是 1,为了能使 尾数多表示一位有效位,将这个“1”隐含,因此尾数数值实际上是24位。隐含的“1”是一位整数。在浮点格式中表示的23位尾数是纯小数。例如,(12)的十进制 = (1100)的二进制,将它规格化后结果为 1.1 ∗ 2 3 1.1*2^3 1.1∗23,其中 整数部分的“1”将不会存储在23位尾数内。
> **短浮点数**与 **长浮点数**都采用 **隐藏尾数最高数位**的方法,因此可多表示一位**尾数**,但这是IEEE 754标准,不是普通浮点数标准
- IEEE 754 浮点数格式
| 类型 | 数符 | 阶码 | 尾数数值 | 总位数 | (16进制)偏置值 | (10进制)偏置值 |
| ------------------------------ | :--: | :--: | :------: | :----: | :--------------: | :---------------: |
| 普通浮点数标准 | 1 | 7 | 24 | 32 | | 64 |
| 短浮点数(**单精度,float**) | 1 | 8 | 23 | 32 | 7FH | $2^{8-1}-1$=127 |
| 长浮点数(**双精度,double**) | 1 | 11 | 52 | 64 | 3FFH | $2^{11-1}-1$=1023 |
| 临时浮点数 | 1 | 15 | 64 | 80 | 3FFFH | 16383 |
- IEEE 754 浮点数范围
![image-20220521110915260](https://img-blog.csdnimg.cn/img_convert/0e8d0dffe54809764affcaebfa71f404.png)
- 定点、浮点表示的区别
-
数值的表示范围
- 字长相同,浮点 所能表示的数值范围将远远大于 定点
-
精度
- 一个数所含有效数值位的位数。对于字长相同的定点数和浮点数来说,浮点数 扩大了数的表示范围,但降低了精度
-
数的运算
- 浮点数包括 阶码 和 尾数 两部分,运算时要同时做两部分的运算,而且要求运算结果 规格化,所以浮点运算更复杂
-
溢出问题
- 定点运算,结果 超出数的表示范围 时,发生溢出;
- 浮点运算,结果 超出数的表示范围却不一定溢出,只有规格化阶码超出所能表示的范围 时,才发生溢出。
-
浮点数的偏置值(IEEE754标准和普通浮点数标准都需要偏置值)
-
IEEE754规定:偏置值为 2 e − 1 − 1 2^{e-1}-1 2e−1−1。其中e为阶码的位数
-
阶码用非标准移码表示,(在8位阶码位数下,偏置值不是128)所以阶码初始数据范围为[0, 255],减去偏置值127后,实际数据范围是[-126, 127]
- -127和128用于特殊值
- 指数位全为0,即移码最小值,如-127这种情况,代表当前数是非规格数,即零值
- 指数位全为1,即移码最大值,如128这种情况,代表当前数是特殊数,即无穷大
浮点数的加减运算
对阶
- 使两个操作数的小数点位置对齐
- 原则是小阶向大阶看齐
- 将阶码小的尾数右移一位,阶加一,直到两个数的阶码相等为止
- 尾数右移时,舍弃掉有效位会产生误差,影响精度
尾数求和
- 将尾数按定点数加减运算规则运算
规格化
- IEEE 754规格化尾数的形式为** ± 1. x . . . x \rm \pm 1.x...x ±1.x...x**
右规
- 当结果为** ± 1 x . x . . . x \rm \pm 1x.x...x ±1x.x...x时,需要右规**,尾数右移一位,阶码加一
- 尾数右移时,最高位1被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入
- 右规最多只需要一次
左规
- 当结果为** ± 0.0...01 x . . . x \rm \pm 0.0...01 x...x ±0.0...01x...x时,需要进行左规**,尾数每左移一位,阶码减一
- 左规可能需要多次,直到将第一位1移到小数点左边
- IEEE 754规格化尾数的形式为** ± 1. x . . . x \rm \pm 1.x...x ±1.x...x**
舍入
- 在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的两位保留下来,参加中间过程的运算,最后将运算结果进入舍入,还原表示成IEEE 754格式
0舍1入法
- 运算结果保留位(即将要被移走的低位)的最高数位为0,则舍去
- 最高数位为1,则在尾数的末位(即将要被移走的低位的前一位)加1
- 可能导致尾数溢出,需要做一次右规
恒置1法
- 只要因移位而丢失的位中有1,就把尾数末位置1,而不管原来是1或0
- 因为是置1,而不是加1,所以不会导致尾数溢出,不需要右规
- 只要因移位而丢失的位中有1,就把尾数末位置1,而不管原来是1或0
截断法
- 直接截取所需位数,丢弃后面的所有位,这个舍入处理最简单
- 在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的两位保留下来,参加中间过程的运算,最后将运算结果进入舍入,还原表示成IEEE 754格式
溢出判断
(浮点数的溢出判断,是根据指数溢出来判断的,而非尾数溢出,尾数溢出就右规即可)- 在尾数规格化和尾数舍入时,可能会对阶码执行加减运算(尾数规格化、舍入都需要右移尾数,尾数右移一定需要阶码加1),因此,需要考虑指数溢出问题
- 若正指数超过了最大允许值(127或1023),则发生指数上溢,产生异常
- 若负指数超过了最小允许值(-149或-1074),则发生指数下溢,通常把结果按机器零处理
- 当指数全为0,并且尾数达到最小,即0.000…1的格式,就是 2 − 23 2^{-23} 2−23次方,指数还是 2 − 126 2^{-126} 2−126,所以更小的正数就是 2 − 149 2^{-149} 2−149,64位的情况下同理得**-1074**
- 右规和尾数舍入
- 需要尾数右移,跟随着阶码+1,阶码可能指数上溢
- 左规
- 需要尾数左移,跟随着阶码-1,阶码可能指数下溢
- 在尾数规格化和尾数舍入时,可能会对阶码执行加减运算(尾数规格化、舍入都需要右移尾数,尾数右移一定需要阶码加1),因此,需要考虑指数溢出问题
- C语言中的浮点数类型
- int转float,不会溢出,但是可能精度减少
- int、float转double,不会溢出,不会减少精度
- double转float,可能溢出,也可能精度减少
- float、double转int,可能溢出,可能精度减少
课后习题
- 选择题: 9、17、21、22、20、25、29
总结
-
字 VS 字节 VS 位
- 1位 = 1比特
- 1字节 = 8位
- 1字 = 2字节 (一般情况下)
- 1字 = 16位 (在1字 = 2字节的情况下,即常说的字长几位)
-
用移码表示浮点数的阶码有什么好处?
-
浮点数进行加减运算时,时常要比较阶码的大小,相对于原码和补码,移码比较大小更方便
移码是补码的符号位取反,通过取反这个动作,把负数符号位变成0,正数符号位变成1,相当于所有位都当做数值位直接进行比较即可,比原码补码用1表示负数符号位要方便很多
-
校验移码的特殊值(0和max)时比较容易。阶码以移码编码时的特殊值如下。
- 0:表示指数为负无穷大,相当于分数分母无穷大,整个数无穷接近0,在尾数也为0时可用来表示0;尾数不为零表示未正规化的数。
- max:表示指数正无穷大,若尾数为0,则表示浮点数超出表示范围(正负无穷大);尾数不为0,则表示浮点数运算错误。
-
-
计算机中的数值数据都是二进制数吗?
- 直接用二进制数表示。分为无符号数和有符号数,有符号数又分为定点数表示和浮点数表示
- 无符号数用来表示无符号整数,如地址
- 定点数用来表示整数
- 浮点数用来表示实数
- 二进制编码的十进制数,一般采用8421码(亦称BCD码),用来表示整数
- 直接用二进制数表示。分为无符号数和有符号数,有符号数又分为定点数表示和浮点数表示
-
C语言中的int型和unsigned型变量的存储方式没有区别,都按照补码的形式存储,在不溢出范围内的加减法运算也是相同的,只是int型变量的最高位代表符号位,而unsigned型中的最高位表示数值位,两者在C语言中的区别体现在输出时到底是采用**%d还是%u**。
-
什么是无符号整数的溢出?
- 若寄存器位数不够,则计算机运算过程中一般保留低n位,弃高位
- 保留的低n位数不能正确表示运算结果。在这种情况下,意味着运算结果超出了计算机所能表达的范围,有效数值进到了第n+1位,称此时发生了溢出现象
- 保留的低n位数能正确表达计算结果,即高位的舍去不影响其运算结果
-
如何判断一个浮点数是否是规格化数?
为了使浮点数能尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。规格化浮点数的尾数小数点后的第一位一定是个非零数。
原码编码的尾数,看尾数的第一位是否为1就行。
补码表示的尾数,看符号位和尾数最高位是否相反。
-
对于位数相同的定点数和浮点数,可表示的浮点数个数比定点数个数多吗?
不是,可表示的数据个数取决于编码所采用的位数。编码位数一定,编码出来的数据个数就是一定的。n位编码只能表示 2 n 2^n 2n个数,所以对于相同位数的定点数和浮点数来说,可表示的数据个数应该一样多。(有时可能由于一个值有两个或多个编码对应,编码个数会有少量差异)
-
IEEE 754浮点数舍入方式
就近舍入
:舍入为最近可表示的数,若结果值正好落在两个可表示数的中间,则一般选择舍入结果为偶数正向舍入
:朝** + ∞ +\infty +∞方向舍入,即取右边的数**负向舍入
:朝** − ∞ -\infty −∞方向舍入,即取左边的数**截去
:朝0方向舍入,即取绝对值较小的那个数
-
现代计算机是否要考虑原码加减运算?
现在计算机采用IEEE 754标准,两个浮点数加减运算时,尾数用原码的加减运算
原码的加减运算实现方式如下两种:
- 转换为补码后,用补码加减实现,结果再转换回原码
- 直接用原码进行加减运算,符号和数值部分分开进行
-
各编码方式的数值范围(长度为 n + 1 n+1 n+1的定点数)
用8421法来转二进制成十进制时,需注意 整数部分从右边数,第n位表示为 2 n − 1 2^{n-1} 2n−1;小数部分从左边往数,第n位表示为 2 − n 2^{-n} 2−n
编码方式 最小值编码 最小值 最大值编码 最大值 数值范围 无符号定点整数 0000 ⋯ 0000 0000 \cdots 0000 0000⋯0000 0 1111 ⋯ 1111 1111 \cdots 1111 1111⋯1111 2 n + 1 − 1 2^{n+1}-1 2n+1−1 0 ≤ x ≤ 2 n + 1 − 1 0 \le x \le 2^{n+1}-1 0≤x≤2n+1−1 无符号定点小数 0.000 ⋯ 0000 0.000 \cdots 0000 0.000⋯0000 0 0.111 ⋯ 1111 0.111 \cdots 1111 0.111⋯1111 1 − 2 − n 1-2^{-n} 1−2−n 0 ≤ x ≤ 1 − 2 − n 0 \le x \le 1-2^{-n} 0≤x≤1−2−n 原码定点整数 1111 ⋯ 1111 1111 \cdots 1111 1111⋯1111 1 − 2 n 1-2^n 1−2n 0111 ⋯ 1111 0111 \cdots 1111 0111⋯1111 2 n − 1 2^n-1 2n−1 1 − 2 n ≤ x ≤ 2 n − 1 1-2^n \le x \le 2^n-1 1−2n≤x≤2n−1 原码定点小数 1.111 ⋯ 1111 1.111 \cdots 1111 1.111⋯1111 2 1 − n − 1 2^{1-n}-1 21−n−1 0.111 ⋯ 1111 0.111 \cdots 1111 0.111⋯1111 1 − 2 n − 1 1-2^{n-1} 1−2n−1 2 1 − n − 1 ≤ x ≤ 1 − 2 n − 1 2^{1-n}-1 \le x \le 1-2^{n-1} 21−n−1≤x≤1−2n−1 补码定点整数 1000 ⋯ 0000 1000 \cdots 0000 1000⋯0000 − 2 n -2^n −2n 0111 ⋯ 1111 0111 \cdots 1111 0111⋯1111 2 n − 1 2^n-1 2n−1 − 2 n ≤ x ≤ 2 n − 1 -2^n \le x \le 2^n-1 −2n≤x≤2n−1 补码定点小数 1.000 ⋯ 0001 1.000 \cdots 0001 1.000⋯0001 2 1 − n − 1 2^{1-n}-1 21−n−1 0.111 ⋯ 1111 0.111 \cdots 1111 0.111⋯1111 1 − 2 n − 1 1-2^{n-1} 1−2n−1 2 1 − n − 1 ≤ x ≤ 1 − 2 n − 1 2^{1-n}-1 \le x \le 1-2^{n-1} 21−n−1≤x≤1−2n−1 反码定点整数 1000 ⋯ 0000 1000 \cdots 0000 1000⋯0000 1 − 2 n 1-2^n 1−2n 0111 ⋯ 1111 0111 \cdots 1111 0111⋯1111 2 n − 1 2^n-1 2n−1 1 − 2 n ≤ x ≤ 2 n − 1 1-2^n \le x \le 2^n-1 1−2n≤x≤2n−1 反码定点小数 1.000 ⋯ 0000 1.000 \cdots 0000 1.000⋯0000 2 1 − n − 1 2^{1-n}-1 21−n−1 0.000 ⋯ 0000 0.000 \cdots 0000 0.000⋯0000 1 − 2 n − 1 1-2^{n-1} 1−2n−1 2 1 − n − 1 ≤ x ≤ 1 − 2 n − 1 2^{1-n}-1 \le x \le 1-2^{n-1} 21−n−1≤x≤1−2n−1 移码定点整数 0000 ⋯ 0000 0000 \cdots 0000 0000⋯0000 − 2 n -2^n −2n 1111 ⋯ 1111 1111 \cdots 1111 1111⋯1111 2 n − 1 2^n-1 2n−1 − 2 n ≤ x ≤ 2 n − 1 -2^n \le x \le 2^n-1 −2n≤x≤2n−1 小数没有移码定义,所以上表没有移码定点小数
存储系统
存储器概述
存储器的分类
-
按在**计算机中的作用(层次)**分类
-
主存储器(
主存、内存
)- 存放计算机运行期间所需的大量程序和数据,CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。其特点是容量较小、存取速度较快、每位价格较高。
-
辅助存储器(
辅存、外存
)- 主存储器的后援存储器,用来存放当前暂时不用的程序和数据,以及一些需要永久性保存的信息,它不能与CPU直接交换信息。其特点是容量极大、存取速度较慢、单位成本低
-
高速缓冲存储器(
Cache
)- 位于主存和CPU之间,用来存放正在执行的程序段和数据,以便CPU能高速地使用它们。Cache的存取速度可与CPU的速度相匹配,但存储容量小、价格高。现在计算机通常将它们制作在CPU中。
-
-
按存储介质分类
- 磁表面存储器(
磁盘
、磁带
) - 磁心存储器
- 半导体存储器(
MOS型存储器
、双级型存储器
) - 光存储器(
光盘
)
- 磁表面存储器(
-
按存取方式分类
-
随机存储器(RAM)
- 任何一个存储单元的内容都可以随机存取,而且存取时间与存储单元的物理位置无关。其优点是读写方便、使用灵活,主要用作主存或高速缓冲存储器。RAM又分为静态RAM和动态RAM
-
只读存储器(ROM)
-
内容只能随机读出而不能写入。信息一旦写入存储器就固定不变,即使断电,内容也不会丢失。因此,通常用它存放固定不变的程序、常数和汉字字库等。
-
与随机存储器可共同作为主存的一部分,统一构成主存的地址域。
-
由ROM派生出的存储器也包含可反复重写的类型,ROM和RAM的存取方式均为随机存取。
注意广义上的只读存储器已可通过电擦除等方式进行写入,其“只读”的概念没有保留,但仍保留了断电内容保留、随机读取特性,但其写入速度比读取速度慢得多。
-
-
串行访问存储器
- 对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址,包括顺序存取存储器(如磁带)与直接存取存储器(如磁盘、 光盘(CD-ROM))
-
-
按信息的可保存性分类
-
易失性存储器
断电后,存储信息即消失的存储器,如RAM。
-
非易失性存储器
断电后信息仍保持的存储器,如ROM、磁表面存储器和光存储器。
-
若某个存储单元所存储的信息被读出时,原存储信息被破坏,则称为破坏性读出;若读出时,被读单元原存储信息不被破坏,则称为非破坏性读出。具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息。
-
存储器的性能指标(存储容量、单位成本、存储速度)
-
存储容量 = 存储字数 * 字长,如1M*8位。1B(Byte,字节) = 8b(bit,位)。存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量
-
单位成本:每位价格 = 总成本 / 总容量
-
存储速度:数据传输率 = 数据的宽度 / 存储周期
- 存取时间( T a T_a Ta):指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间
- 存取周期( T m T_m Tm,读写周期,或访问周期):指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔。
- 主存带宽( B m B_m Bm,数据传输率):每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)
-
存取时间不等于存储周期,通常存储周期大于存取时间。因为对任何一种存储器,在读写操作之后,总要有一段恢复内部状态的复原时间。对于破坏性读出的存储器,存取周期往往比存取时间大得多,甚至可达 T m = 2 T a T_m = 2T_a Tm=2Ta,因此存储器中的信息读出后需要马上进行再生。
存储器的层次化结构
- 为了解决存储系统大容量、高速度、低成本这3个相互制约的矛盾,在计算机系统中,通常采用了多级存储器结构。
-
实际上,存储系统层次结构主要体现在Cache-主存层次和主存-辅存层次
- 前者主要解决CPU和主存速度不匹配的问题
- 后者主要解决存储系统的容量问题
-
主要思想:上一层的存储器作为低一层存储器的高速缓存。在Cache-主存和主存-辅存层次中,上一层中的内容都只是下一层中的内容的副本,也即Cache(或主存)中的内容只是主存(或辅存)中的内容的一部分。
-
主存和Cache之间的数据调动是由硬件自动完成的,对所有程序员均是透明的;而主存和辅存之间的数据调动则是由硬件和操作系统共同完成的,对应用程序员是透明的。
-
在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统,在这个系统中程序员编程的地址范围与虚拟存储器的地址空间相对应。对具有虚拟存储器的计算机系统而言,编程时可用的地址空间远大于主存空间。
课后习题
- 选择题: 1、10、14
- 综合题2第1)
主存储器
-
主存储器由DRAM(Dynamic Random Access Memory)实现,靠处理器的那一层(Cache)则由SRAM(Static Random Access Memory)实现,它们都属于易失性存储器,主要电源被切断,原来保存的信息便会丢失。DRAM相较于SRAM,价格低,速度慢。
-
SRAM只要保持通电,里面存储的数据就可以恒常保持
-
DRAM每隔一段时间,要刷新充电一次,否则内部的数据即会消失。
-
SRAM主要用于二级高速缓存(Level2 Cache)
-
DRAM主要用于大容量主存系统
-
SRAM和DRAM
-
SRAM的工作原理
- 通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件。地址码相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体
- 静态随机存储器(SRAM)的信息被读出后,仍保持其原状态而不需要再生(非破坏性读出)
-
DRAM的工作原理
-
动态随机存储器(DRAM)比SRAM的密度要高很多。DRAM采用地址复用技术,地址线是原来的1/2,地址信号分行、列两次传送。
-
DRAM电容上的电荷一般只能维持1~2ms,因此即使电源不断电,信息也会自动消失。为此,每隔一定时间必须刷新,通常取2ms,称为刷新周期。常用的刷新方式有3种:
-
集中刷新
指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读写操作,称为死时间,又称访存死区。
优点:读写操作时,不受刷新工作的影响(读写操作时避开刷新期间)
缺点:在集中刷新期间(死区)不能访问存储器
-
分散刷新
把对每行的刷新分散到各个工作周期中。这样,一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持;后半部分用于刷新。
优点:没有死区
缺点:加长了系统的存取周期,降低了整机的速度
-
异步刷新
前两种方法的结合,既可缩短“死时间”,又能充分利用最大刷新间隔为2ms的特点。具体做法是:将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。这样可以避免使CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率
-
-
DRAM的刷新需注意以下问题:
- 刷新对CPU是透明的,即刷新不依赖于外部的访问
- 动态RAM的刷新单位是行,由芯片内部自行生成行地址
- 刷新操作类似于读操作,但又有所不同
- 刷新时不需要选片,即整个存储器中的所有芯片同时被刷新
-
-
存储器芯片的内部结构
-
存储器芯片由存储体、I/O读写电路、地址译码和控制电路等部分组成。
- 存储体(存储矩阵):存储单元的集合,由行选择线(X)和列选择线(Y)来选择所访问单元,存储体的相同行、列上的位同时被读出或写入
- 地址译码器:用来将地址转换为译码输出线上的高电平,以便驱动相应的读写电路。
- I/O控制电路:用以控制被选中的单元的读出或写入,具有放大信息的作用。
- 片选控制信号:单个芯片容量太小,往往满足不了计算机对存储器容量的要求,因此需用一定数量的芯片进行存储器的扩展。在访问某个字时,必须**“选中”该存储字所在的芯片,而其他芯片不被“选中”**,因此需要有片选控制信号。
- 读/写控制信号:根据CPU给出的是读命令还是写命令,控制被选中单元进行读或写。
-
-
存储器的读、写周期
-
RAM的读周期
-
读出时间( t A t_A tA):从给出有效地址开始,到读出所选中单元的内容并在外部数据总线上稳定地出现所需的时间。
-
地址片选信号 C S ‾ \rm \overline{CS} CS必须保持到数据稳定输出, t C O t_{CO} tCO为片选的保持时间,在读周期中 W E ‾ \rm \overline{WE} WE为高电平。
-
读周期与读出时间是两个不同的概念,读周期时间( t R C t_{RC} tRC)表示存储芯片进行两次连续读操作时所必须间隔的时间,它总是大于等于读出时间。
-
-
RAM的写周期
-
要实现写操作,要求片选信号 C S ‾ \rm \overline{CS} CS和写命令信号 W E ‾ \rm \overline{WE} WE都必须为低电平。为使数据总线上的信息能够可靠地写入存储器,要求 C S ‾ \rm \overline{CS} CS信号与 W E ‾ \rm \overline{WE} WE信号相“与”的宽度至少为 t W t_W tW。
-
为了保证在地址变化期间,不会发生错误写入而破坏存储器的内容, W E ‾ \rm \overline{WE} WE信号在地址变化期间必须为高电平。为了保证有效数据的可靠写入,地址有效地时间至少应为** t W C = t A W + t W + t W R t_{WC}=t_{AW}+t_W+t_{WR} tWC=tAW+tW+tWR**。
-
为了保证在 W E ‾ \rm \overline{WE} WE和 C S ‾ \rm \overline{CS} CS变为无效前能把数据可靠地写入,要求写入的数据必须在 t D W t_{DW} tDW以前在数据总线上已经稳定。
-
-
SRAM和DRAM的比较
类型/特点 SRAM DRAM 存储信息 触发器 电容 破坏性读出 非 是 需要刷新 不要 需要 送行列地址 同时送 分两次送 运行速度 快 慢 集成度 低 高 发热量(功耗) 大 小 存储成本 高 低 主要用途 高速缓存 主机内存
-
只读存储器(ROM
)
-
特点
- ROM和RAM都是支持随机存取的存储器,其中SRAM和DRAM均为易失性半导体存储器。而ROM中一旦有了信息,就不能轻易改变,即使掉电也不会丢失,它在计算机系统中是只供读出的存储器。ROM器件有两个显著的优点。
- 结构简单,所以位密度比可读写存储器的高
- 具有非易失性,所以可靠性高
- ROM和RAM都是支持随机存取的存储器,其中SRAM和DRAM均为易失性半导体存储器。而ROM中一旦有了信息,就不能轻易改变,即使掉电也不会丢失,它在计算机系统中是只供读出的存储器。ROM器件有两个显著的优点。
-
ROM类型
-
根据制造工艺不同,ROM可分为以下几种
-
掩模式只读存储器
(MROM)- 在芯片的生产过程中直接写入,写入以后任何人都无法改变其内容
- 优点是可靠性高,集成度高,价格便宜
- 缺点是灵活性差
-
一次可编程只读存储器
(PROM)- 可以实现一次性编程的只读存储器,允许用户利用专门的设备(编程器)写入自己的程序,一旦写入,内容就无法改变。
-
可擦除可编程只读存储器
(EPROM)- 不仅可以由用户利用编程器写入信息,而且可以对其内容进行多次改写。需要修改EPROM的内容时,先将其全部内容擦除,然后编程
- EPROM又分为两种,即紫外线擦除(UVEPROM)和电擦除( E 2 P R O M \rm{E^2PROM} E2PROM)
- EPROM虽然既可读又可写,但它不能取代RAM,因为EPROM的编程次数有限,且写入时间过长(没有RAM好)
-
闪速存储器
(Flash Memory)- 是在EPROM与 E 2 P R O M \rm{E^2PROM} E2PROM的基础上发展起来的,其主要特点是既可在不加电的情况下长期保存信息,又能在线进行快速擦除与重写
- 闪速存储器既有EPROM的价格便宜、集成度高的优点,又有 E 2 P R O M \rm{E^2PROM} E2PROM电可擦除重写的特点,且擦除重写的速度快。
-
固态硬盘
(Solid State Drives,SSD)
- 基于闪存的固态硬盘是用固态电子存储芯片阵列制成的硬盘,由控制单元和存储单元(FLASH芯片)组成。保留了Flash Memory长期保存信息、快速擦除与重写的特性。对比传统硬盘也具有读写速度快、低功耗的特性,缺点是价格较高。
-
-
主存储器的基本组成
-
如下为主存储器(Main Memory,MM)的基本组成框图,其中由一个个存储0或1的记忆单元(也称存储元件)构成的存储矩阵(也称存储体)是存储器的核心部分。
-
记忆单元是具有两种稳态的能表示二进制0和1的物理器件。为了存取存储体中的信息,必须对存储单元编号(也称编址)。编址单位是指具有相同地址的那些存储元件构成的一个单位,可以按字节编址,也可以按字编址。现代计算机通常采用字节编址方式,此时存储体内的一个地址中有1字节。
-
指令执行过程中需要访问主存时
-
CPU首先把被访问单元的地址送到MAR(Memory Address Register,地址寄存器)中
-
然后通过地址线将主存地址送到主存中的地址寄存器,以便地址译码器进行译码选中相应单元
-
同时CPU将读写信号通过控制线送到主存的读写控制电路。
-
如果是写操作
-
CPU同时将要写的信息送到MDR(Memory Data Register,主存数据寄存器)中
-
在读写控制电路的控制下,经数据线将信号写入选中的单元
-
-
如果是读操作,那么主存读出选中单元的内容送到数据线,然后送到MDR中。
-
-
数据线的宽度与MDR的宽度相同,地址线的宽度与MAR的宽度相同。
-
下图采用64位数据线,所以在按字节编址方式下,每次最多可以存取8个单元的内容。地址线的位数决定了主存地址空间的最大可寻址范围。例如,36位地址的最大寻址范围为$ 0\sim 2^{36}-1$,即地址从0开始编号。
数据线数和地址线数共同反映存储体容量的大小。上图芯片的容量= 2 36 ∗ 64 2^{36}*64 236∗64位。
多模块存储器
-
一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率,有以下分类
-
单体多字存储器
- 存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并且处于同一存储单元
- 在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/m存取周期,CPU向主存取一条指令。(提高单体存储器的工作速度)
- 缺点:指令和数据在主存内必须是连续存放的,一旦遇到了转移指令,或操作数不能连续存放,这种方法的效果就不明显
-
多体并行存储器
-
由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作,如下分两类
-
高位交叉编址
(顺序方式)- 高位地址表示体号,低位地址为体内地址
- 把低位的体内地址送到由高位体号确定的模块内进行译码。访问一个连续主存时,总是先在一个模块内访问,等到该模块访问完才转到下一个模块访问,CPU总是按顺序访问存储模块,各模块不能被并行访问,因而不能提高存储器的吞吐率
- 模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器仍是顺序存储器
-
低位交叉编址
(交叉方式)- 低位地址为体号,高位地址为体内地址
- 采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽
- 模块内的地址是分层的,存取方式是并行存取
- 设模块字长等于数据总线宽度,模块存取一个字的存取周期为T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于 m=T/r ,连续存取m个字所需的时间为 t = T + (m-1)r,而顺序方式连续读取m个字所需时间为mT
-
-
CPU的速度比存储器的快,若同时从存储器中取出n条指令,就可充分利用CPU资源,提高运行速度。多体交叉存储器就是基于这种思想提出的
-
课后习题
- 选择题: 1、4、9、11、12、14、16、17、18、21、22、25
- 综合题:前三大题
主存储器与CPU的连接
连接原理
-
主存储器通过数据总线、地址总线和控制总线与CPU连接
-
数据总线的位数与工作频率的乘积正比于数据传输率
-
地址总线的位数决定了可寻址的最大内存空间
-
**控制总线(读/写)**指出总线周期的类型和本次输入/输出操作完成的时刻
主存容量的扩展
由于单个存储芯片的容量是有限的,因此需要在字和位两方面进行扩充。通常采用位扩展法、字扩展法和字位同时扩展法来扩展主存容量。
-
位扩展法
-
CPU的数据线数与存储芯片的数据位数不一定相等,此时必须对存储芯片扩位(即进行位扩展,用多个存储器件对字长进行扩充,增加存储字长),使其数据位数与CPU的数据线数相等。
-
位扩展的连接方式是将多个存储芯片的地址端、片选端和读写控制端相应并联,数据端分别引出。
-
如下所示,用8片 8K*1位的RAM芯片组成8K*8位的存储器。8片RAM芯片的地址线 A 12 ∼ A 0 、 C S ‾ 、 W E ‾ A_{12} \sim A_0、\overline{CS}、\overline{WE} A12∼A0、CS、WE都分别连在一起,每片的数据线依次作为CPU数据线的一位。
仅采用位扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,在某一个时刻选中所有的芯片,所以片选信号 C S ‾ \rm \overline{CS} CS要连接到所有芯片。
-
-
字扩展法
-
增加存储器中的字的数量,而位数不变。字扩展将芯片的地址线、数据线、读写控制线相应并联,而由片选信号来区分各芯片的地址范围。
-
如下所示,用4片16K*8位的RAM芯片组成64K*8位的存储器。4片RAM芯片的数据线 D 0 ∼ D 7 和 W E ‾ D_0 \sim D_7和\overline{WE} D0∼D7和WE都分别连在一起。将 A 15 A 14 A_{15}A_{14} A15A14用作片选信号, A 15 A 14 = 00 A_{15}A_{14}=00 A15A14=00时,译码器输出端0有效,选中最左边的1号芯片; A 15 A 14 = 01 A_{15}A_{14}=01 A15A14=01时,译码器输出端1有效,选中2号芯片,以此类推(在同一时间只能有一个芯片被选中)。各芯片的地址分配如下
-
第1片,最低地址:0000 0000 0000 0000;最高地址:0000 0000 0000 0000 0000 (16位)
-
第2片,最低地址:0100 0000 0000 0000;最高地址:0100 0000 0000 0000
-
第3片,最低地址:1000 0000 0000 0000;最高地址:1000 0000 0000 0000
-
第4片,最低地址:1100 0000 0000 0000;最高地址:1111 1111 1111 1111
仅采用字扩展时,各芯片连接地址线的方式相同,连接数据线的方式也相同,但在某一时刻只需选中部分芯片,所以通过片选信号 C S ‾ \rm \overline{CS} CS或采用译码器设计连接到相应的芯片。
-
-
-
字位同时扩展法
-
如下图所示,用8片16K*4位的RAM芯片组成64K*8位的存储器。每两片构成一组16K*8位的存储器(位扩展),4组便构成64K*8位的存储器(字扩展)。地址线 A 15 A 14 A_{15}A_{14} A15A14经译码器得到4个片选信号, A 15 A 14 = 00 A_{15}A_{14}=00 A15A14=00时,输出端0有效,选中第一组的芯片(①和 ②); A 15 A 14 = 01 A_{15}A_{14}=01 A15A14=01时,输出端1有效,选中第二组芯片( ③ 和④),以此类推。
采用字位同时扩展时,各芯片连接地址线的方式相同,但连接数据线的方式不同,而且需要通过片选信号 C S ‾ \rm \overline{CS} CS或采用译码器设计连接到相应的芯片
-
存储芯片的地址分配和片选
-
CPU要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后为选中的芯片依地址码选择相应的存储单元,以进行数据的存取,即进行字选。片内的字选通常是由CPU送出的N条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端(N由片内存储容量 2 N 2^N 2N决定)。片选信号的产生分为线选法和译码片选法
-
线选法
-
用除片内寻址外的高位地址线直接(或经反相器)分别接到各个存储芯片的片选端,当某地址线信息为**“0”时,就选中与之对应的存储芯片。这些片选地址线每次寻址时只能有一位有效**,不允许同时有多位有效,这样才能保证每次只选中一个芯片(或芯片组)。
-
假设4片2K*8位的存储芯片用线选法构成8K*8位存储器,各芯片的片选信号如下,其中低位地址线 A 10 ∼ A 0 A_{10} \sim A_0 A10∼A0作为字选线,用于片内寻址。
-
优点是:不需要地址译码器,线路简单
-
缺点是:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费
-
-
译码片选法
- 译码片选法用除片内寻址外的高位地址线通过地址译码器芯片产生片选信号。如用8片8K*8位的存储芯片组成64K*8位存储器(地址线16位,数据线8位),需要8个片选信号;若采用线选法,除去片内寻址的13位地址线,仅余高3位,不足以产生8个片选信号。因此,采用译码片选法,即用一片74LS38作为地址译码器,则 A 15 A 14 A 13 = 000 A_{15}A_{14}A_{13}=000 A15A14A13=000时选中第一片, A 15 A 14 A 13 = 001 A_{15}A_{14}A_{13}=001 A15A14A13=001时选中第二片,以此类推(即3位二进制编码)
-
存储器与CPU的连接
-
合理选择存储芯片
要组成一个主存系统,选择存储芯片是第一步,主要指存储芯片的类型(RAM或ROM)和数量的选择。通常选用ROM存放系统程序、标准子程序和各类常数,RAM则是为用户编程而设置的。此外,在考虑芯片数量时,要尽量使连线简单、方便
-
地址线的连接
存储芯片的容量不同,地址线数也不同,而CPU的地址线数往往比存储芯片的地址线数要多。通常将CPU地址线的低位与存储芯片的地址线相连,以选择芯片中的某一单元(字选),这部分的译码是由芯片的片内逻辑完成的。而CPU地址线的高位则在扩充存储芯片时使用,用来选择存储芯片(片选),这部分译码由外接译码器逻辑完成。
-
数据线的连接
CPU的数据线数与存储芯片的数据线数不一定相等,在相等时可直接相连;在不等时必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。
-
读/写命令线的连接
CPU读/写命令线一般可直接与存储芯片的读/写控制端相连,通常高电平为读,低电平为写。有些CPU的读/写命令线是分开的(读为 R D ‾ \rm \overline{RD} RD,写为 W E ‾ \rm \overline{WE} WE,均为低电平有效),此时CPU的读命令线应与存储芯片的允许读控制端相连,而CPU的写命令线则应与存储芯片的允许写控制端相连。
-
片选线的连接
- 片选线的连接是CPU与存储芯片连接的关键。存储器由许多存储芯片叠加而成,哪一片被选中完全取决于该存储芯片的片选控制端 C S ‾ \rm \overline{CS} CS是否能接受到来自CPU的片选有效信号。
- 片选有效信号与CPU的访存控制信号** M R E Q ‾ \rm \overline{MREQ} MREQ(低电平有效)**有关,因为只有当CPU要求访存时,才要求选中存储芯片。若CPU访问I/O,则 M R E Q ‾ \rm \overline{MREQ} MREQ为高,表示不要求存储器工作。
课后习题
- 选择题: 7、11、13、14、15
- 综合题: 1大题,范围。2大题,3小问。3大题,2小问。4大题,3小问
双端口RAM和多模块存储器
为了提高CPU访问存储器的速度,可以采用双端口存储器、多模块存储器等技术,它们同属并行技术,前者为空间并行,后者为时间并行。
双端口RAM
-
指同一存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步地访问存储单元。
-
如下图,当两个端口的地址不相同时,在两个端口上进行读写操作一定不会发生冲突
-
两个端口同时存取存储器的同一地址单元时,会因数据冲突造成数据存储或读取错误。两个端口对同一主存操作有以下4种情况
- 两个端口不同时对同一地址单元存取数据
- 两个端口同时对同一地址单元读出数据
- 两个端口同时对同一地址单元写入数据(会出现写入错误)
- 两个端口同时对同一地址单元操作,一个写入数据,一个读出数据(会出现读出错误)
解决方法:置**“忙”信号 B U S Y ‾ \rm \overline{BUSY} BUSY为0,由判断逻辑决定暂时关闭一个端口**(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
多模块存储器
为提高访存速度,常采用多模块存储器,常用的有单体多字存储器和多体低位交叉存储器。
CPU的速度比存储器的快,若同时从存储器中取出n条指令,就可充分利用CPU资源,提高运行速度。多体交叉存储器就是基于这种思想提出的。
-
单体多字存储器
- 单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储m个字,总线宽度也为m个字。一次并行读出m个字,地址必须顺序排列并处于同一存储单元。
- 单体多字系统在一个存取周期内,从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1/m存取周期,CPU向主存取一条指令。显然,这增大了存储器的带宽,提高了单体存储器的工作速度。
- 缺点是:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显
-
多体并行存储器
-
多体并行存储器由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。
-
多体并存存储器分为**高位交叉编址(顺序方式)和低位交叉编址(交叉方式)**两种
-
高位交叉编址
:高位地址表示体号,低位地址为体内地址。如下图,存储器共有4个模块 M 0 ∼ M 3 M_0 \sim M_3 M0∼M3,每个模块有n个单元,各模块的地址范围如下图。高位交叉编址方式下,总是把低位的体内地址送到由高位体号确定的模块内进行译码。访问一个连续主存块时,总是先在一个模块内访问,等到该模块访问完才转到下一个模块访问,CPU总是按顺序访问存储模块,存储模块不能被并行访问,因而不能提高存储器的吞吐率。
模块内的地址是连续的,存取方式仍是串行存取,因此这种存储器仍是顺序存储器。
-
低位交叉编址
:低位地址为体号,高位地址为体内地址。如下图,每个模块按**“模m”**交叉编址,模块号=单元地址%m,假定有m个模块,每个模块有k个单元,则0,m,···,(k-1)m单元位于 M 0 M_0 M0;第1,m+1,···,(k-1)m+1单元位于 M 1 M_1 M1;以此类推。低位交叉编址方式下,总是把高位的体内地址送到由低位体号确定的模块内进行译码。程序连续存放在相邻模块中,因此称采用此编址方式的存储器为交叉存储器。采用低位交叉编址后,可在不改变每个模块存取周期的前提下,采用流水线的方式并行存取,提高存储器的带宽。
设模块字长等于数据总线宽度,模块存取一个字的存取周期为T,总线传送周期为r,为实现流水线方式存取,存储器交叉模块数应大于等于
m = T / r m=T/r m=T/r
式中,m称为交叉存取度。每经过r时间延迟后,启动下一个模块,交叉存储器要求其模块数必须大于等于m,以保证启动某模块后经过m*r的时间后再次启动该模块时,其上次的存取操作已经完成(即流水线不间断)。这样,连续存取m个字所需的时间为
t 1 = T + ( m − 1 ) r t_1=T+(m-1)r t1=T+(m−1)r
而顺序方式连续读取m个字所需时间为** t 2 = m T t_2=mT t2=mT**。可见低位交叉存储器的带宽大大提高。模块数为4的流水线方式存取示意图如下
-
-
外部存储器
磁盘存储器
-
优点
- 存储容量大,便宜
- 记录介质可重复使用
- 记录信息可长期保存而不丢失,可脱机存档
- 非破坏性读出,读出时不需要再生
-
缺点
- 存取速度慢,机械结构复杂,对工作环境要求较高
-
磁盘存储器
-
组成
- 硬盘存储器的组成
磁盘驱动器
- 核心部件是磁头组件和盘片组件,温彻斯特盘是一种可移动磁头固定盘片的硬盘存储器
磁盘控制器
- 硬盘存储器和主机的接口,主流的标准有IDE、SCSI、SATA等
盘片
- 存储区域
- 一块硬盘含有若干记录面,每个记录面划分为若干磁道,而每条磁道又划分为若干扇区,扇区(也称块)是磁盘读写的最小单位,即磁盘按块存取
磁头数
(Heads)- 记录面数,表示硬盘共有多少个磁头,磁头用于读写盘片上记录面的信息,一个记录面对应一个磁头
柱面数
(Cylinders)- 表示硬盘每面盘片上有多少条磁道,在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面
扇区数
(Sectors)- 表示每条磁道上有多少个扇区
- 硬盘存储器的组成
-
磁记录原理
原理
- 磁头和磁性记录介质相对运动时,通过电磁转换完成读写操作
编码方法
- 按某种方案,把一连串的二进制信息变换成存储介质磁层中一个磁化翻转状态的序列,并使读写控制电路容易、可靠地实现转换
磁记录方式
- 通常采用**调频制(FM)和改进型调频制(MFM)**的记录方式
-
磁盘的性能指标
-
记录密度
- 盘片单位面积上记录的二进制信息量,通常以道密度、位密度、面密度表示
- 道密度:磁盘半径方向,单位长度上的磁道数
- 位密度:磁道单位长度,能记录的二进制代码位数
- 面密度:位密度与道密度的乘积
- 盘片单位面积上记录的二进制信息量,通常以道密度、位密度、面密度表示
-
磁盘的容量
- 格式化容量:按照某种特定的记录格式所能存储信息的总量
- 非格式化容量:磁记录表面可利用的磁化单元总数,由道密度和位密度计算而来
- 格式化后的容量比非格式化容量要小
-
平均存取时间
- 由 寻道时间(磁头移动到目的磁道的时间)、旋转延迟时间(磁头定位到要读写扇区的时间)、传输时间(传输数据所花费的时间)构成
- 由于寻道和找扇区的距离远近不一,故寻道时间和旋转延迟时间通常取平均值
-
数据传输率
- 磁盘存储器在单位时间内向主机传送数据的字节数,假设磁盘转数为r转/秒,每条磁道容量为N字节,则数据传输率为
D r = r N D_r=rN Dr=rN
- 磁盘存储器在单位时间内向主机传送数据的字节数,假设磁盘转数为r转/秒,每条磁道容量为N字节,则数据传输率为
-
-
磁盘地址
-
主机向磁盘控制器发送寻址信息,磁盘的地址一般如下
-
-
硬盘的工作过程
- 主要操作是寻址、读盘、写盘。每个操作对应一个控制字,硬盘工作时,先取控制字,再执行控制字
- 硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻同时读写,也不可能在同一时刻读两组数据或写两组数据
-
-
磁盘阵列
- RAID(独立冗余磁盘阵列)指将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性、安全性
- RAID的分级如下
- RAID0:无冗余、无校验的磁盘阵列
- RAID1:镜像磁盘阵列
- RAID2~RAID5:其余磁盘阵列
- 在 RAID1~RAID5几种方案中,无论何时有磁盘损坏,都可随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏,提升了系统的可靠性
- RAID0把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAID0没有容错能力
- RAID1使用两个磁盘同时进行读写,互为备份,若一个磁盘出现故障,可从另一个磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一般,但是提高了可靠性
- 总结
- 同时使用多个磁盘 -> 提高传输率
- 在多个磁盘上并行存取 -> 提高存储系统的数据吞吐量
- 镜像功能 -> 提高安全可靠性
- 数据校验 -> 提供容错能力
固态硬盘
- 基于闪存技术的存储器,由一个或多个闪存芯片和闪存翻译层组成
- 闪存芯片替代传统旋转磁盘中的机械驱动器
- 闪存翻译层将来自CPU的逻辑块读写请求翻译成对底层物理设备的读写控制信号,充当磁盘控制器角色
- 通常,一个闪存由块组成,块由页组成,页的大小是512B4KB**,每块有**32128页
- 数据是以页为单位读写的,只有在一页所属的块整个被擦除后,才能写这一页。一旦一个块被擦除,块中的每个页都可以直接再写一次。某个块进行了约10万次重复写之后,就会磨损坏,不能使用
- 随机写速度慢,比访问页高一个数量级
- 闪存翻译层有一个平均磨损逻辑试图通过将擦除平均分布在所有的块上来最大化每个块的寿命
课后习题
- 选择题: 4、6
- 综合题:一大题2小问及以后
高速缓冲存储器
由于程序的转移概率不会很低,数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的。这就必须从系统结构上进行改进,即采用存储体系。通常将存储系统分为**“Cache-主存”层次和“主存-辅存”层次**。
程序访问的局部性原理
时间局部性
- 在最近的未来要用到的信息,很可能是现在正在使用的信息,因为程序中存在循环。
空间局部性
- 在最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放的、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的。
- 高速缓冲技术就是利用程序访问的局部性原理,把程序中正在使用的部分存放在一个高速的、容量较小的Cache中,使CPU的访存操作大多数针对Cache进行,从而大大提高程序的执行速度。
Cache的基本工作原理
-
Cache位于存储器层次结构的顶层,通常由SRAM构成,其基本结构如下
-
为便于Cache和主存之间交换信息,Cache和主存都被划分为相等的块,Cache块又称为Cache行,每块由若干字节组成,块的长度称为块长(Cache行长)
-
当CPU发出读请求时
-
若访存地址在Cache中命中,就将此地址转换成Cache的地址,直接对Cache进行读操作,与主存无关
-
若Cache不命中,则仍需访问主存,并把此字所在的块一次性地从主存调入Cache
-
若此时Cache已满,则需根据某种替换算法,用这个块替换Cache中原来的某块信息。
CPU与Cache之间的数据交换以字为单位,而Cache与主存之间的数据交换则以Cache块为单位。
-
-
当CPU发出写请求时,若Cache命中,有可能会遇到Cache与主存中的内容不一致的问题。所以若Cache命中,需要按照一定的写策略处理,常见的有全写法和写回法
-
CPU欲访问的信息已在Cache中的比率称为Cache的命中率。设一个程序执行期间,Cache的总命中次数为 N c N_c Nc,访问主存的总次数为 N m N_m Nm,则命中率H为
H = N c / ( N c + N m ) H=N_c/(N_c+N_m) H=Nc/(Nc+Nm)
可见,为提高访问效率,命中率H越接近1越好。设** t c t_c tc为命中时的Cache访问时间**, t m t_m tm为未命中时的访问时间,1-H表示未命中率,则**Cache-主存系统的平均访问时间 T a T_a Ta**为
T a = H t c + ( 1 − H ) t m T_a=Ht_c+(1-H)t_m Ta=Htc+(1−H)tm -
根据Cache的读写流程,实现Cache时需要解决以下关键问题
数据查找
:如何快速判断数据是否在Cache中地址映射
:主存块如何存放在Cache中,如何将主存地址转换为Cache地址替换策略
:Cache满后,使用何种策略对Cache块进行替换或淘汰写入策略
:如何既保证主存块和Cache块的数据一致性,又尽量提升效率
Cache和主存的映射方式
-
Cache行中的信息是主存中某个块的副本,地址映射是指把主存地址空间映射到Cache地址空间,即把存放在主存中的信息按照某种规则装入Cache。
-
由于Cache行数比主存块数少得多,因此主存中只有一部分块的信息可放在Cache中,因此在Cache中要为每块加一个标记,指明它是主存中哪一块的副本。该标记的内容相当于主存中块的编号。
-
为了说明Cache行中的信息是否有效,每个Cache行需要一个有效位。
-
地址映射的方法共3种
-
直接映射
-
主存中的每一块只能装入Cache中的唯一位置。若这个位置已有内容,则产生块冲突,原来的块将无条件地被替换出去(无须使用替换算法)。直接映射实现简单,但不够灵活,即使Cache的其他许多地址空着也不能占用,这使得直接映射的块冲突概率最高,空间利用率最低。
-
直接映射的关系可定义为
C a c h e 行号 = 主存块号 m o d C a c h e 总行数 \rm Cache行号=主存块号 \mod Cache总行数 Cache行号=主存块号modCache总行数-
主存块号的低c位正好是它要装入的Cache行号。给每个Cache行设置一个长为t = m - c的标记(tag),当主存某块调入Cache后,就将其块号的高t位设置在对应Cache行的标记中
-
直接映射的地址结构为
-
Cache行中,仅包含t位标记 + 数据,以下为主存地址结构
-
Cache行号存放在主存地址中,方便根据主存地址找Cache行,根据Cache大小来划分位数
-
标记在Cache和主存都存在,用来判断该Cache是否对应该主存
-
块内地址放在主存中,当不存在Cache时,才去主存中找
-
这个地址结构没有列出有效位,实际上有效位放在第一位,之后是标记
-
块内地址,即与Cache块大小相同的块
-
-
-
CPU访存过程如下图
- 根据访存地址中间的c位,找到对应的Cache行
- 将对应Cache行中的标记和主存地址的高t位标记进行比较
- 若相等且有效位为1,则访问Cache命中,此时根据主存地址中低位的块内地址,在对应的Cache行中存取信息
- 若不相等或有效位为0,则不命中,此时CPU从主存中读出该地址所在的一块信息送到对应的Cache行中,将有效位置1,并将标记设置为地址中的高t位,同时将该地址中的内容送CPU
-
-
-
全相联映射
- 主存中的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时,需要与所有Cache行的标记进行比较。
- 优点:比较灵活,Cache块的冲突概率低,空间利用率高,命中率也高
- 缺点:标记的比较速度较慢,实现成本较高,通常需采用昂贵的按内容寻址的相联存储器进行地址映射。
-
全相联映射的地址结构
- 整个主存块号当做全相联映射方式的标记,与直接映射和组相联映射不同,它们只存放了高位部分,低位部分不存,是因为可以直接从主存地址那边找过来,再通过高位比较对应。全相联映射全部存放,表示直接从主存地址那里进行查找,找到就是对应,无须另外判断
- 主存中的每一块可以装入Cache中的任何位置,每行的标记用于指出该行取自主存的哪一块,所以CPU访存时,需要与所有Cache行的标记进行比较。
-
组相联映射
-
将Cache空间分成大小相同的组,主存的一个数据块可以装入一组内的任何一个位置,即组间采取直接映射,而组内采取全相联映射
-
假设每组有r个Cache行,则称之为r路组相联
-
组相联映射的关系可定义为
- Cache组号 = 主存块号
mod
Cache组数
- Cache组号 = 主存块号
-
路数越大,即每组Cache行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂。选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射。
-
组相联映射的地址结构
- 原理与直接映射类似
-
CPU访存过程
-
根据访存地址中间的组号找到对应的Cache组
-
将对应Cache组中每个行的标记与主存地址的高位标记进行比较
-
若有一个相等且有效位为1,则访问Cache命中。此时根据主存地址中的块内地址,在对应Cache行中存取信息
-
若都不相等或虽相等但有效位为0,则不命中,此时CPU从主存中读出该地址所在的一块信息送到对应Cache组的任意一个空闲行中,将有效位置1,并设置标记,同时将该地址中的内容送CPU
-
-
-
-
当Cache大小、主存块大小一定时
- 直接映射的命中率最低,全相联映射的命中率最高
- 直接映射的判断开销最小、所需时间最短,全相联映射的判断开销最大、所需时间最长
- 直接映射标记所占的额外空间开销最少,全相联映射标记所占的额外空间开销最大
Cache中主存块的替换算法
-
采用全相联映射或组相联映射方式时,从主存向Cache传送一个新块,当Cache或Cache组中的空间已被占满时,就需要使用替换算法置换Cache行。
-
采用直接映射时,一个给定的主存块只能放到唯一的固定Cache行中,所以在对应Cache行已有一个主存块的情况下,新的主存块毫无选择地把原先已有的那个主存块替换掉,因而无须考虑替换算法。
-
常用的替换算法有随机算法(RAND)、先进先出算法(FIFO)、近期最少使用算法(LRU,最常考查)和最不经常使用算法(LFU)
-
随机算法
- 随机地确定替换的Cache块,实现比较简单,但未依据程序访问的局部性原理,因此可能命中率较低
-
先进先出算法
- 选择最早调入的行进行替换。实现比较容易,但未依据程序访问的局部性原理,因为最早进入的主存块也可能是目前经常要用到的
-
近期最少使用算法
-
依据程序访问的局部性原理,选择近期内长久未访问过的Cache行作为替换的行,平均命中率要比FIFO的高,是堆桟类算法
-
LRU算法对每个Cache行设置一个计数器,用计数值来记录主存块的使用情况,并根据计数值选择淘汰某个块,计数值的位数与Cache组大小有关,2路时有1位LRU位,4位时有2位LRU位。
-
采用4路组相联,有5个主存块{1,2,3,4,5}映射到Cache的同一组,对于主存访问序列**{1,2,3,4,1,2,5,1,2,3,4,5},采用LRU**算法的替换过程如下。
-
左边数字对应Cache行的计数值
-
右边数字是存放在该行中的主存块号。
-
计数器规则
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
- 保证最老的计数值永远为3,而不会超出,一旦超出,判断最老块就需要大小比较,会导致多余步骤
- 未命中且还有空闲行时,新装入的行的计数器置0,其余全加1
- 未命中且无空闲行时,计数值为3的行的信息块被淘汰,新装行的块的计数器置0,其余全加1
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
-
抖动
- 当集中访问的存储区超过Cache组的大小时,命中率可能变得很低,如上图的访问序列为{1,2,3,4,5,1,2,3,4,5,1…}时,而Cache每组只有4行,那么命中率为0,这种现象称为抖动
-
-
-
最不经常使用算法
- 将一段时间内被访问次数最少的存储行换出。每行也设置一个计数器,新行建立后从0开始计数,每访问一次,被访问的行计数器加1,需要替换时比较各特定行的计数值,将计数值最小的行换出。
- 这种算法与LRU类似,但不完全相同
-
Cache写策略
-
因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况
-
全写法
(写直通法,Write-Through)-
当CPU对Cache写命中时,必须把数据同时写入Cache和主存。当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖即可
-
这种方法实现简单,能随时保持主存数据的正确性。缺点是增加了访存次数,降低了Cache的效率
-
写缓冲:为减少全写法直接写入主存的时间损耗,在Cache和主存之间加一个写缓冲(Write Buffer),如下图,CPU同时写数据到Cache和写缓冲中,写缓冲再控制将内容写入主存。写缓冲是一个FIFO队列,可以解决速度不匹配的问题。但若出现频繁写时,会使写缓冲饱和溢出。
-
-
回写法
(Write-Back)- 当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存。
- 这种方法减少了访存次数,但存在不一致的隐患。采用这种策略时,每个Cache行必须设置一个标志位(脏位),以反映此块是否被CPU修改过
-
-
全写法和写回法都对应于Cache写命中(要被修改的单元在Cache中)时的情况。对于Cache写不命中,有以下两种处理方法
写分配法
- 加载主存中的块到Cache中,然后更新这个Cache块。它试图利用程序的空间局部性,但缺点是每次不命中都需要从主存中读取一块
非写分配法
- 只写入主存,不进行调块
-
非写分配法通常与全写法合用,写分配法通常和写回法合用
-
指令预取,需要将指令Cache和数据Cache分开设计。由于指令预取时,要从同一Cache读指令,会引发冲突。采用分离Cache结构可以解决这个问题
-
现代计算机的Cache通常设立多级Cache(通常是3级),假定设3级Cache,按离CPU的远近可各自命名为L1 Cache、L2 Cache、L3 Cache,离CPU越远,访问速度越慢,容量越大。指令Cache与数据Cache分离一般在L1级,此时通常为写分配法与写回法合用。
-
如下图是含有两级Cache的系统,L1 Cache对L2 Cache使用全写法,L2 Cache对主存使用写回法,由于L2 Cache存在,其访问速度大于主存,因此避免了因频繁写时造成的写缓冲饱和溢出。
-
- 课后习题
- 选择题:7、9、10、14、20
- 综合题:二大题二小题、三大题及以后
虚拟存储器
主存和联机工作的辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。
虚拟存储器的概念
-
虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。
-
用户编程允许涉及的地址称为虚地址或逻辑地址,虚地址对应的存储空间称为虚拟空间或程序空间。实际的主存单元地址称为实地址或物理地址,实地址对应的是主存地址空间,也称实地址空间。
-
虚地址比实地址要大很多
-
CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。
- 若已在主存中,则通过地址变换,CPU可直接访问主存指示的实际单元
- 若不在主存中,则把包含这个字的一页或一段调入主存后再由CPU访问
- 若主存已满,则采用替换算法置换主存中的一页或一段
-
虚拟存储器也采用和Cache类似的技术,将辅存中经常访问的数据副本存放到主存中,但是缺页访问辅存的代价很大,因此虚拟存储机制采用全相联映射,每个虚页面可以存放到对应主存区域的任何一个空闲页位置。此外,当进行写操作时,不能每次写操作都同时写回磁盘,因而,在处理一致性问题时,采用回写法
页式虚拟存储器
-
以页为基本单位的虚拟存储器
-
虚拟空间和主存空间都被划分成同样大小的页,主存的页称为实页、页框,虚存的页称为虚页
-
把虚拟地址分为两个字段:虚页号和业内地址
- 虚拟地址到物理地址的转换是由页表实现的
- 页表是一张存放在主存中的虚页号和实页号的对照表
- 页表一般长久地保存在内存中
-
页表
-
有效位也称装入位,用来表示对应页面是否在主存
- 若为1,则表示该虚拟页已从外存调入主存,此时页表项存放该页的物理页号
- 若为0,则表示没有调入主存,此时页表项可以存放该页的磁盘地址
-
脏位也称修改位,用来表示页面是否被修改过,虚拟机制中采用回写策略,利用脏位可判断替换时是否需要写回磁盘
-
引用位也称使用位,用来配合替换策略进行设置,例如是否**实现最先调入(FIFO位)或最近最少用(LRU位)**策略等。
-
CPU执行指令时,需要先将虚拟地址转为主存物理地址。每个进程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项
-
若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址
-
若装入位为0,则说明缺页,需要操作系统进行缺页处理。如下为地址变换过程
-
-
页式虚拟存储器
- 优点
- 页面的长度固定,页表简单,调入方便
- 缺点
- 由于程序不可能正好是页面的整数倍,最后一页的零头将无法利用造成浪费,并且页不是逻辑上独立的实体,所以处理、保护和共享都不及段式虚拟存储器方便
- 优点
-
-
快表
(TLB,Translation Lookaside Buffer,转换检测缓冲区)- 由地址转换过程可知,访存时,先访问一次主存去查页表,再访问主存才能取得数据。如果缺页,那么还要进行页面替换、页面修改等,因此采用虚拟存储机制后,访问主存的次数更多了
- 依据程序执行的局部性原理,在一段时间内总是经常访问某些页时,若把这些页对应的页表项存放在高速缓冲器组成的快表(TLB)中,则可以明显提高效率。相应地把放在主存中的页表称为慢表(Page)。在地址转换时,首先查找快表,若命中,则无须访问主存中的页表
- 快表通常采用全相联或组相联方式,每个TLB项由页表表项内容加上一个TLB标记字段组成,TLB标记用来表示该表项取自页表中哪个虚页号对应的页表项
- TLB标记的内容在全相联方式下就是该页表项对应的虚页号
- 组相联方式下则是对应虚页号的高位部分,而虚页号的低位部分用于选择TLB组的组索引
-
具有TLB和Cache的多级存储系统
-
如下图是一个具有TLB和Cache的多级存储系统,其中Cache采用二路组相联方式。CPU给出一个32位的虚拟地址,TLB采用全相联方式,每一项都有一个比较器,查找时将虚页号与每个TLB标记字段同时进行比较
- 若有某一项相等且对应有效位为1,则TLB命中,此时可直接通过TLB进行地址转换
- 若未命中,则TLB缺失,需要访问主存去查页表
-
图中所示的是两级页表方式,虚页号被分成页目录索引和页表索引两部分,由这两部分得到对应的页表项,从而进行地址转换,并将相应表项调入TLB,若TLB已满,则还需要采用替换策略。
-
完成由虚拟地址到物理地址的转换后,Cache机构根据映射方式将物理地址划分成多个字段,然后根据映射规则找到对应的Cache行或组,将对应Cache行中的标记与物理地址中的高位部分进行比较,若相等且对应有效位为1,则Cache命中,此时根据块内地址取出对应的字送CPU。
-
查找时,快表和慢表也可以同步进行,若快表中有此虚页号,则能很快地找到对应的实页号,并使慢表的查找作废,从而就能做到虽采用虚拟存储器但访问主存速度几乎没有下降。
-
在一个具有Cache和TLB的虚拟存储系统中,CPU一次访存操作可能涉及TLB、页表、Cache、主存和磁盘的访问,访问过程如下图。可以看出,CPU访存过程中存在三种缺失情况
TLB缺失
:要访问的页面对应的页表项不在TLB中Cache缺失
:要访问的主存块不在Cache中缺页(Page)
:要访问的页面不在主存中
-
三种缺失的几种可能组合如下
-
最好的情况是第1种组合,此时无须访问主存
-
第2和第3种组合都需要访问一次主存
-
第4种组合需要访问两次主存
-
第5种组合发生缺页异常,需要访问磁盘,并且至少访问两次主存
-
Cache缺失处理由硬件完成
-
缺页处理由软件完成
-
操作系统通过缺页异常处理程序来实现
-
TLB缺失既可以用硬件又可以用软件来处理,比如操作系统有专门的TLB缺失异常处理程序
-
-
-
段式虚拟存储器
-
段是按程序的逻辑结构划分的,各个段的长度因程序而异。
-
把虚拟地址分为两部分:段号和段内地址
-
虚拟地址到实地址之间的变换是由段表来实现的
-
段表是程序的逻辑段和在主存中存放位置的对照表
-
段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。
-
由于段的长度可变,所以段表中要给出各段的起始地址和段的长度
-
CPU根据虚拟地址访存时,首先根据段号与段表基地址拼接成对应的段表行,然后根据该段表行的装入位判断该段是否已调入主存(装入位为1,表示该段已调入主存;装入位为0,表示该段已不在主存中)。已调入主存时,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。
-
段式虚拟存储器的地址变换过程如下
-
段式虚拟存储器
- 优点是段的分界与程序的自然分界相对应,因而具有逻辑独立性,使得它易于编译、管理、修改和保护,也便于多道程序的共享
- 缺点是因为段长度可变,分配空间不便,容易在段间留下碎片,不好利用,造成浪费
段页式虚拟存储器
- 把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间页划分大小相等的页,程序对主存的调入、调出仍以页为基本传送单位,这样的虚拟存储器称为段页式虚拟存储器。
- 在段页式虚拟存储器中,每个程序对应一个段表,每段对应一个页表,段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
- 虚地址分为段号、段内页号、页内地址三部分。CPU根据虚地址访存时
- 首先根据段号得到段表地址
- 然后从段表中取出该段的页表起始地址,与虚地址段内页号合成,得到页表地址
- 最后从页表中取出实页号,与页内地址拼接形成主存实地址
- 段页式虚拟存储器的优点是,兼具页式和段式虚拟存储器的优点,可以按段实现共享和保护。缺点是地址变换过程中需要两次查表,系统开销较大。
虚拟存储器与Cache的比较
相同之处
- 目标都是为了提高系统性能,两者都有容量、速度、价格的梯度
- 都把数据划分为小信息块,并作为基本的传递单位,虚存系统的信息块更大
- 都有地址的映射、替换算法、更新策略等问题
- 依据程序的局部性原理应用“快速缓存的思想”,将活跃的数据放在相对高速的部件中
不同之处
- Cache主要解决系统速度,而虚拟存储器却是为了解决主存容量
- Cache全由硬件实现,是硬件存储器,对所有程序员透明;虚拟存储器由OS和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,但对应用程序员透明
- 对于不命中性能影响,因为CPU的速度约为Cache的10倍,主存的速度为硬盘的100倍以上,因此虚拟存储器系统不命中时对系统性能影响更大。
- CPU与Cache和主存都建立了直接访问的通路,而辅存与CPU没有直接通路。也就是说在Cache不命中时主存能和CPU直接通信,同时将数据调入Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和CPU通信
- 课后习题
- 选择题:2、7、12、14
- 综合题:所有,重要
总结
-
相联存储器:基本原理是把存储单元所存内容的某一部分作为检索项(即关键字项)去检索该存储器,并将存储器中与、该检索项符合的存储单元内容进行读出或写入。所以它是按内容或地址进行寻址的,价格较为昂贵,一般用来制作TLB(Translation Lookaside Buffer,CPU的一种缓存,转译后备缓冲器/页表缓存/转址旁路缓存),相联Cache等。
-
易失性存储器和刷新的区别
易失性存储器是指断电后数据丢失,SRAM和DRAM都满足断电内容消失,但需要刷新的只有DRAM,而SRAM不需要刷新。
-
C S ‾ \rm \overline{CS} CS是片选信号, W E ‾ \rm \overline{WE} WE是读写控制信号。
- CPU要实现对存储单元的访问,首先要选择存储芯片,即进行片选;然后再从选中的芯片中依地址码选择出相应的存储单元,以进行数据的存取,这称为字选。片内的字段是由CPU送出的N条低位地址线完成的,地址线直接接到所有存储芯片的地址输入端,而存储芯片的片选信号则大多是通过高位地址译码后产生的。
- 读写控制线可以由一根WE控制,低电平写入,高电平读出,也可以由OE和WE两线控制,OE低电平读出,WE低电平写入
-
存储器的层次结构主要体现在何处?为何要分这些层次?计算机如何管理这些层次?
- 层次结构主要体现在Cache-主存和主存-辅存这两个存储层次上
- Cache-主存层次在存储系统中,主要对CPU访存起加速作用,即从整体运行的效果分析,CPU访存速度加快,接近于Cache的速度,而寻址空间和价位却接近于主存
- 主存-辅存层次在存储系统中主要起扩容作用,即从程序员角度看,他所使用的存储器的容量和价位接近于辅存,而速度接近于主存
- 主存与Cache之间的信息调度功能全部由硬件自动完成。而主存与辅存层次的调度目前广泛采用虚拟存储技术实现,即将主存与辅存的一部分通过软/硬结合的技术组成虚拟存储器,程序员可用这个比主存实际空间(物理地址空间)大得多的虚拟地址空间(逻辑地址空间)编程,当程序运行时,再由软/硬件自动配合完成虚拟地址空间与主存实际物理空间的转换。因此,这两个层次上的调度或转换操作对于程序员来说都是透明的。
-
存取周期和存取时间有何区别
-
存取时间仅为完成一次操作的时间
-
存取周期不仅包含操作时间,而且包含操作后线路的恢复时间,即
存取周期 = 存取时间 + 恢复时间 存取周期=存取时间+恢复时间 存取周期=存取时间+恢复时间
-
-
在虚拟存储器中,页面是设置得大一些好还是小一些好
- 页面太小时,平均页内剩余空间较少,可节省存储空间,但会使页表增大,不能充分利用访存的空间局部性来提高命中率
- 页面太大时,可减少页表空间,但平均页内剩余空间较大,会浪费较多存储空间,页面太大还会使页面调入/调出的时间较长
-
存取时间就是存储周期吗?
不是
- 存取时间是执行一次读操作或写操作的时间,分为读出时间和写入时间
- 读出时间是从主存接收到有效地址开始到数据稳定为止的时间
- 写入时间是从主存接收到有效地址开始到数据写入被写单元为止的时间
- 存储周期是指存储器进行连续两次独立地读或写操作所需的最小时间间隔。
- 通常存储周期大于存取时间
- 存取时间是执行一次读操作或写操作的时间,分为读出时间和写入时间
-
Cache行大小和命中率之间有什么关系
- 行的长度较大,可以充分利用程序访问的空间局部性,使一个较大的局部空间被一起调到Cache中,因而可以增加命中机会。缺点是
- 行长较大,使失效损失变大。即若未命中,则需花更多时间从主存读块
- 行长太大,Cache项数变少,因而命中的可能性变小
- 行的长度较大,可以充分利用程序访问的空间局部性,使一个较大的局部空间被一起调到Cache中,因而可以增加命中机会。缺点是
-
发生取指令Cache缺失的处理过程是什么
- 程序计数器恢复当前指令的值
- 对主存进行读的操作
- 将读入的指令写入Cache中,更改有效位和标记位
- 重新执行当前指令
-
关于Cache的一些小知识
-
多级Cache
- 现代计算机系统一般采用多级Cache系统。CPU执行指令时,先到速度最快的一级Cache(L1 Cache)中寻找指令或数据,找不到时,再到速度次快的二级Cache(L2 Cache)中找,最后到主存中找
-
指令Cache和数据Cache
- 指令和数据可以分别存储在不同的Cache中(L1 Cache一般会这么做),这种结构也称哈佛Cache,其特点是允许CPU在同一个Cache存储周期内同时提取指令和数据,由于指令执行过程取指和取数据都有可能访问Cache,因此这一特性可以保证不同的指令同时访存
-
指令系统
指令格式
指令是指示计算机执行某种操作的命令。一台计算机所有指令的集合构成该机的指令系统,也称指令集。指令系统是计算机的主要属性,位于硬件和软件的交界面上
-
指令的基本格式
-
操作码+地址码
-
操作码指出指令中该指令应该执行什么性质的操作以及具有何种功能
-
操作码是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法等的关键信息
-
地址码给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。
-
指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。
-
把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。
-
一个指令系统中,若所有指令的长度都是相等的,则称为定长指令字结构。定字长指令的执行速度快,控制简单。若各种指令的长度随指令功能而异,则称为变长指令字结构。然而,因为主存一般是按字节编址的,所以指令字长多为字节的整数倍
-
根据指令中操作数地址码的数目的不同,可将指令分成以下几种格式
-
零地址指令
-
只给出操作码OP,没有显式地址。这种指令有两种可能
-
不需要操作数的指令,如空操作指令、停机指令、关中断指令等
-
零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈
-
-
-
一地址指令
-
有两种可能
-
只有目的操作数的单操作数指令,按 A 1 A_1 A1地址读取操作数,进行OP操作后,结果存回原地址。
- 指令含义: O P ( A 1 ) → A 1 OP(A_1) \rightarrow A_1 OP(A1)→A1
- 如操作码的含义是加1、减1、求反、求补等
- 指令含义: O P ( A 1 ) → A 1 OP(A_1) \rightarrow A_1 OP(A1)→A1
-
隐含约定目的地址的双操作数指令,按指令地址 A 1 A_1 A1可读取源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在ACC中。
-
指令含义: ( A C C ) O P ( A 1 ) → A C C (ACC)OP(A_1) \rightarrow ACC (ACC)OP(A1)→ACC
- 若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为 2 24 = 16 M 2^{24}=16M 224=16M
-
-
-
-
二地址指令
-
对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数还用于保存本次的运算结果。
-
指令含义: ( A 1 ) O P ( A 2 ) → A 1 (A_1)OP(A_2) \rightarrow A_1 (A1)OP(A2)→A1
- 若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为 2 12 = 4 K 2^{12}=4K 212=4K
-
-
-
三地址指令
-
若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为 2 8 = 256 2^8=256 28=256。若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)
- 指令含义: ( A 1 ) O P ( A 2 ) → A 3 (A_1)OP(A_2) \rightarrow A_3 (A1)OP(A2)→A3
-
-
四地址指令
-
若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的直接寻址范围为 2 6 = 64 2^6=64 26=64
-
指令含义: ( A 1 ) O P ( A 2 ) → A 3 , A 4 = 下一条将要执行指令的地址 (A_1)OP(A_2) \rightarrow A_3, A_4=下一条将要执行指令的地址 (A1)OP(A2)→A3,A4=下一条将要执行指令的地址
-
-
-
-
定长操作码指令格式
定长操作码指令在指令字的最高位部分分配固定的若干位(定长)表示操作码。一般n位操作码字段的指令系统最大能够表示 2 n 2^n 2n条指令。定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利。当计算机字长为32位或更长时,这是常规用法
扩展操作码指令格式
-
为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上,显然,这将增加指令译码和分析的难度,使控制器的设计复杂化。
-
最常见的变长操作码方法是扩展操作码,它使操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。下图为一种扩展操作码的安排方式(1111、1111 1111、1111 1111 1111留作扩展操作码之用,但1111 1111 1111 1111不用作扩展操作码,直接应用到指令)
-
除了以上这种安排之外,还有许多其他扩展方法,如形成15条三地址指令、12条二地址指令、63条一地址指令、16条零地址指令共106条指令
-
在设计扩展操作码指令格式时,必须注意以下两点
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
- 各指令的操作码一定不能重复
-
通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间
指令的操作类型
-
数据传送
- 寄存器之间的传送(MOV)
- 从内存单元读取数据到CPU寄存器(LOAD)
- 从CPU寄存器写数据到内存单元(STORE)等。
-
算术和逻辑运算
- 这类指令主要有**加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)**等
-
移位操作
- 主要有算法移位、逻辑移位、循环移位等
-
转移操作
- 主要有**无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)**等
- 无条件转移指令在任何情况下都执行转移操作
- 条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或者是几个标志位组合
- 调用指令和转移指令的区别
- 执行调用指令时必须保存下一条指令的地址(返回地址),当子程序执行结束时,根据返回地址返回到主程序继续执行
- 转移指令不返回执行
- 主要有**无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)**等
-
输入输出操作
这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。
-
课后习题
- 选择题:1、7、12
- 综合题:所有
指令的寻址方式
- 寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。
- 指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)
- (A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。对应的(A)就是寄存器中的数值,或相应内存单元的数值。例如,EA=(A)意思是有效地址是地址A中的数值
指令寻址和数据寻址
-
指令寻址
(寻找下一条将要执行的指令地址)-
顺序寻址
- 通过**程序计数器(PC)**加1(1个指令字长),自动形成下一条指令的地址
-
跳跃寻址
-
通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序计数器给出,而由本条指令给出下条指令地址的计算方式。
是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过**程序计数器(PC)**给出
-
-
-
数据寻址
(寻找操作数的地址)-
方式较多,为区别各种方式,通常在指令字中设一个字段,用来指明属于哪种寻址方式,由此可得指令的格式如下所示
-
常见的数据寻址方式
隐含寻址
-
不明显给出操作数的地址,而在指令中隐含操作数的地址
- 单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址,指令格式明显指出的仅是第一操作数的地址。因此,累加器(ACC)对单地址指令格式来说是隐含寻址
-
优点是有利于缩短指令字长,缺点是需增加存储操作数或隐含地址的硬件
立即(数)寻址
-
地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。下图中,**#**表示立即寻址特征,A就是操作数本身
-
数据采用补码形式存放
-
优点是指令在执行阶段不访问主存,指令执行时间最短,缺点是A的位数限制了立即数的范围
直接寻址
-
指令字中的形式地址A是操作数的真实地址EA,即EA=A,如下图
-
优点是简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址。缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
间接寻址
-
相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A),如下图
-
间接寻址可以是一次间接寻址,还可以是多次间接寻址。
-
如上图,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;主存字第一位为0时,表示取得的是操作数的地址。
-
间接寻址的优点是可扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可方便的完成子程序返回)。
-
间接寻址的缺点是指令在执行阶段要多次访存(一次间接寻址需两次访存,多次间接寻址需根据存储字的最高位确定访存次数)。由于访问速度过慢,这种寻址方式并不常用。
一般问到扩大寻址范围时,通常是寄存器间接寻址
寄存器寻址
- 在指令字中直接出给操作数所在的寄存器编号,即EA= R i \rm R_i Ri,其操作数在由 R i \rm R_i Ri所知的寄存器内,如下图所示
- 优点是指令在执行阶段不访问主存,只访问寄存器,因寄存器数量较少,对应地址码长度较小,使得指令字短且因不用访存,所以执行速度快,支持向量/矩阵运算
- 缺点是寄存器价格昂贵,计算机中的寄存器个数有限
寄存器间接寻址
-
在寄存器 R i R_i Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=( R i R_i Ri),如下图
- 寄存器间接寻址的特点是:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)
相对寻址
- 把程序计数器(PC)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于当前指令地址的位移量,可正可负,补码表示,如下图
-
A的位数决定操作数的寻址范围。
-
优点是操作数的地址不是固定的,随PC值的变化而变化,且与指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令。
对于转移指令JMP A,当CPU从存储器中取出一字节时,会自动执行 ( P C ) + 1 → P C (PC)+1 \rightarrow PC (PC)+1→PC。若转移指令的地址为X,且占2B,在取出该指令后,PC的值会增2,即 ( P C ) = X + 2 (PC)=X+2 (PC)=X+2,这样在执行完该指令后,会自动跳转到X+2+A的地址继续执行。
基址寻址
-
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(BR)+A。其中基址寄存器既可采用专用寄存器,又可采用通用寄存器。如下图
-
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。在程序执行过程中,基址寄存器的内容不变(作为基址),形式地址可变(作为偏移量)。采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
-
基址寻址的优点是可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。
变址寻址
-
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容之和,即EA=(IX)+A,其中IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。如下图
-
变址寄存器是面向用户的。在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。
-
变址寻址的优点是可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX)的位数足以表示整个存储空间。
-
变址寻址与基址寻址的有效地址形成过程极为相似。但从本质上讲,两者有较大的区别。
基址寻址
- 面向系统,主要用于为多道程序或数据分配存储空间,因此基址寄存器的内容通常由操作系统或管理程序确定,在程序的执行过程中其值不可变,而指令字中的A是可变的
变址寻址
- 立足于用户,主要用于处理数组问题,在变址寻址中,变址寄存器的内容由用户设定,在程序执行过程中其值可变,而指令字中的A是不可变的。
堆栈寻址
- 存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。堆栈可分为硬堆栈和软堆栈两种
硬堆栈
(寄存器堆栈)- 成本较高,不适合做大容量的堆栈
软堆栈
- 从主存中划出一段区域来做堆栈是最合算、最常用的方法
- 采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了SP。通常情况下,在读/写堆栈中的一个单元的前后都伴有自动完成对SP内容的增量或减量操作
- 下图总结了寻址方式、有效地址、访存次数(不包含为了取本条指令而做的访存)
寻址方式 | 有效地址 | 访存次数 |
---|---|---|
隐含寻址 | 程序指定 | 0 |
立即寻址 | A即是操作数 | 0 |
直接寻址 | EA=A | 1 |
一次间接寻址 | EA=(A) | 2 |
寄存器寻址 | EA= R i R_i Ri | 0 |
寄存器间接一次寻址 | EA=( R i R_i Ri) | 1 |
相对寻址 | EA=(PC)+A | 1 |
基址寻址 | EA=(BR)+A | 1 |
变址寻址 | EA=(IX)+A | 1 |
- 课后习题
- 选择题:1、3、7、8、10、14、17、21、24、25、26、28
- 综合题:所有
程序的机器级代码表示
常用汇编指令介绍
-
相关寄存器
-
x86处理器中有8个32位的通用寄存器,为了向后兼容,EAX、EBX、ECX和EDX的高两位字节和低两位字节可以独立使用,E为Extended,表示32位的寄存器
-
除了EBP和ESP外,其他几个寄存器的用途是比较任意的
-
-
汇编指令格式
-
一般有两种不同的汇编格式,AT&T和Intel,主要区别如下
- AT&T指令只能小写字母;Intel对大小写不敏感
- AT&T第一个为源操作数,第二个为目标操作数;Intel则相反
- AT&T的寄存器需要加前缀**%,立即数需要加前缀$;Intel的寄存器和立即数**都不需要
- 内存寻址中,AT&T使用**( );Intel使用[ ]**
- 在指定数据长度方面,AT&T操作码后面紧跟一个字符,表明操作数大小;Intel在操作码后面显示标注byte ptr,word ptr, dword ptr
由于32或64位体系结构都是由16位扩展而来,因此用word表示16位
-
AT&T和Intel指令格式对比
AT&T格式 Intel格式 含义 mov $100, %eax mov eax, 100 100 -> R[eax] mov %eax, %ebx mov ebx, eax R[eax] -> R[ebx] mov %eax, (%ebx) mov [ebx], eax R[eax] -> M[R[ebx]] mov %eax, -8(%ebp) mov [ebp-8], eax R[eax] -> M[R[ebp - 8]] lea 8 (%edx, %eax, 2) , %eax lea eax, [edx + eax * 2 + 8] R[edx] + R[eax]*2 + 8 -> R[eax] movl %eax, %ebx mov dword ptr ebx, eax 长度为4字节的R[eax] -> R[ebx]
-
-
常用指令
- 通常可以分为 数据传送指令、逻辑计算指令、控制流指令
- 常用标记
<reg>
任意寄存器- <reg32> 32位寄存器
- eax, ebx, ecx, edx, esi, edi, esp, ebp
- <reg16> 16位寄存器
- ax, bx, cx, dx
- <reg8> 8位寄存器
- ah、al、bh、bl、ch、cl、dh、dl
- <reg32> 32位寄存器
<mem>
内存地址- [eax]、[var+4]、dword ptr [eax + ebx]
<con>
常数- <con8> 8位常数
- <con16> 16位常数
- <con32> 32位常数
数据传送指令
- mov指令。将第二个操作数(寄存器的内容、内存中的内容或常数值)复制到第一个操作数(寄存器或内存)。但不能用于直接从内存复制到内存
- push指令。将操作数压入内存的栈,常用于函数调用。ESP是栈顶,压栈前先将ESP值减去4(栈增长方向与内存地址增长方向相反),然后将操作数压入ESP指示的地址
- pop指令。与push指令相反,pop指令执行的是出栈工作,出栈前先将ESP指示的地址中的内容出栈,然后将ESP值加4
算术和逻辑运算指令
- add/sub指令。add指令将两个操作数相加,相加的结果保存到第一个操作数中,sub指令用于两个操作数相减,相减的结果保存到第一个操作数中
- inc/dec指令。inc、dec指令分别表示将操作数自加1、自减1
- imul指令。带符号整数乘法指令,有两种格式
- 两个操作数,将两个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器
- 三个操作数,将第二个和第三个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器
- idiv指令。带符号整数除法指令,它只有一个操作数,即除数,而被除数则为edx:eax中的内容,操作结果有两部分:商、余数,商送到eax,余数送到edx
- and/or/xor指令。分别是逻辑与、逻辑或、逻辑异或操作指令,用于操作数的位操作,操作结果放在第一个操作数中
- not指令。位翻转指令。将操作数中的每一位翻转
- neg指令。取负指令
- shl/shr指令。逻辑移位指令,shl为逻辑左移,shr为逻辑右移,第一个操作数表示被操作数,第二个操作数指示移位的位数
- 控制流指令。x86处理器维持着一个指示当前执行指令的指令指针(IP),当一条指令执行后,此指针自动指向下一条指令。IP寄存器不能直接操作,但可以用控制流指令更新。通常用标签(label)指示程序中的指令地址,在x86汇编代码中,可在任何指令前加入标签
- jmp指令。jmp指令控制IP转移到label所指示的地址
- jcondition指令。条件转移指令,依据CPU状态字中的一系列条件状态转移。CPU状态字中包括指示最后一个算术运算结果是否为0,运算结果是否为负数等
- cmp/test指令。cmp指令用于比较两个操作数的值,test指令对两个操作数进行逐位与运算,这两类指令都不保存操作结果,仅根据运算结果设置CPU状态字中的条件码
- call/ret指令。分别用于实现子程序(过程、函数等)的调用及返回
- call指令首先将当前执行指令地址入栈,然后无条件转移到由标签指示的指令
- call指令保存调用之前的地址信息。当call指令结束后,返回调用之前的地址
- ret指令实现子程序的返回机制,ret指令弹出栈中保存的指令地址,然后无条件转移到保存的指令地址执行
- call、ret是程序(函数)调用中最关键的两条指令
- call指令首先将当前执行指令地址入栈,然后无条件转移到由标签指示的指令
x86中的指令机器码长度为1字节,对同一指令的不同用途有多种编码方式,比如mov指令就有28
种机内编码,用于不同操作数类型或用于特定寄存器
过程调用的机器级表示
- call、ret主要用于过程调用,它们都属于一种无条件转移指令
- 过程P调用过程Q,过程调用的执行步骤如下
- P将入口参数(实参)放在Q能访问到的地方
- P将返回地址存到特定的地方,然后将控制转移到Q
- Q保存P的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间
- 执行过程Q
- Q恢复P的现场,将返回结果放到P能访问到的地方,并释放局部变量所占空间
- Q取出返回地址,将控制转移到P
- 每个过程都有自己的栈区,称为栈帧,因此,一个栈由若干栈帧组成。帧指针寄存器EBP指示栈帧的起始位置(栈底),栈指针寄存器ESP指示栈顶,栈从高地址向低地址增长,因此,当前栈帧的范围在帧指针EBP和ESP指向的区域之间
选择语句的机器级表示
- 常见的选择结构语句有if-then、if-then-else、case等。编译器通过条件码(标志位)设置指令和各类转移指令来实现程序中的选择结构语句
条件码
(标志位)- 除了整数寄存器,CPU还维护了一组条件码(标志位)寄存器,它们描述了最近的算术或逻辑运算操作的属性。可以检测这些寄存器来执行条件分支指令,最常用的条件码如下
CF
:进位/借位标志。最近无符号整数加减运算后的进/借位情况。有进位/借位时,CF=1,否则CF=0ZF
:零标志。最近的操作的运算结果是否为0。若结果为0,ZF=1,否则ZF=0SF
:符号标志。最近的带符号数运算结果的符号。若为负,SF=1,否则SF=0OF
:溢出标志。最近的带符号数运算结果是否溢出。若溢出,OF=1,否则OF=0- OF和 SF对无符号数运算来说没有意义,而 CF对带符号数运算来说没有意义
- jcondition条件跳转指令,就是根据条件码ZF和SF来实现跳转的
- 除了整数寄存器,CPU还维护了一组条件码(标志位)寄存器,它们描述了最近的算术或逻辑运算操作的属性。可以检测这些寄存器来执行条件分支指令,最常用的条件码如下
循环语句的机器级表示
- 常见的循环结构语句有while、for、do-while。汇编中没有相应的指令存在,可以用条件测试和转跳组合起来实现循环的效果,大多数编译器将这三种循环结构都转换为do-whilte形式来产生机器代码。在循环结构中,通常使用条件转移指令来判断循环条件的结束
课后习题
- 全没做
CISC和RISC的基本概念
CISC
(Complex Instruction Set Computer)- 增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化
- 典型的有采用X86架构的计算机
- 增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化
RISC
(Reduced Instruction Set Computer)- 减少指令种类和简化指令功能,提高指令的执行速度
- 典型的有ARM、MIPS架构的计算机
- 减少指令种类和简化指令功能,提高指令的执行速度
复杂指令系统计算机(CISC)
- 特点
- 指令系统复
- 杂庞大,指令数目一般为200条以上
- 指令的长度不固定,指令格式多,寻址方式多
- 可以访存的指令不受限制
- 各种指令使用频率相差很大
- 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
- 控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制
- 难以用优化编译生成高效的目标代码程序
精简指令系统计算机(RISC)
- 特点
- 选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现
- 指令长度固定,指令格式种类少,寻址方式种类少
- 只有**Load/Store(取数/存数)**指令访存,其余指令的操作都在寄存器之间进行
- CPU中通用寄存器的数量相当多
- RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成
- 以硬布线控制为主,不用或少用微程序控制
- 特别重视编译优化工作,以减少程序执行时间
CISC和RISC的比较
-
RISC相对于CISC的优点
- RISC更能充分利用VLSI芯片的面积。CISC的控制器大多采用微程序控制,其控制存储器在CPU芯片内所占的面积达50%以上,而RISC控制器采用组合逻辑控制,其硬布线逻辑只占CPU芯片面积的10%左右
- RISC更能提高运算速度,RISC的指令数、寻址方式和指令格式种类少,又设有多个通用寄存器,采用流水线技术,所以运算速度更快,大多数指令在一个时钟周期内完成
- RISC便于设计,可降低成本,提高可靠性。RISC指令系统简单,因此机器设计周期短;其逻辑简单,因此可靠性高
- RISC有利于编译程序代码优化。RISC指令类型少,寻址方式少,使编译程序容易选择更有效的指令和寻址方式,并适当地调整指令顺序,使得代码执行更高效化
-
CISC和RISC的对比
对比项目 CISC RISC 指令系统
复杂、庞大 简单、精简 指令数目
一般大于200条 一般小于100条 指令字长
不固定 定长 可访存指令
不加限制 只有Load/Store指令 各种指令执行时间
相差较大 绝大多数在一个周期内完成 各种指令使用频度
相差很大 都比较常用 通用寄存器数量
较少 多 目标代码
难以用优化编译生成高效的目标代码程序 采用优化的编译程序,生成代码较为高效 控制方式
绝大多数为微程序控制 绝大多数为组合逻辑控制 指令流水线
可以通过一定方式实现 必须实现
课后习题
- 选择题:3、5
总结
- 指令分为哪几部分
- 一条指令通常包括操作码字段和地址码字段
- 操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,是识别指令、了解指令功能、区分操作数地址内容的组成和使用方法的关键信息。
- 地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址
- 一条指令通常包括操作码字段和地址码字段
- 寻址方式多和少有什么影响
- 寻址方式多样化能让用户编程更为方便,但多重寻址方式会造成CPU结构的复杂化,也不利于指令流水线的运行
- 寻址方式太少虽然能提高CPU的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户需求。
- 常见指令寻址方式的特点和适用情况
- 立即寻址操作数获取便捷,通常用于给寄存器赋初值
- 直接寻址相对于立即寻址,缩短了指令长度
- 间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回
- 寄存器寻址的指令字较短,指令执行速度较快
- 寄存器间接寻址扩大了寻址范围
- 基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间
- 变址寻址主要用于处理数组问题,适合编制循环程序
- 相对寻址用户控制程序的执行顺序、转移等
- 基址寻址和变址寻址的区别。
- 两种方式有效地址的形式都是寄存器内容+偏移地址
- 基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态的
- 变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的
- 一个操作数在内存中可能占多个单元,怎样在指令中给出操作数的地址?
- 现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息。一个操作数(如char、int、float、double)可能是8位,16位,32位,64位等,因此可能占用1个、2个、3个、4个内存单元。也就是说,一个操作数可能有多个内存地址对应
- 有两种不同的地址指定方式:大端方式和小端方式
大端方式
- 指令中给出的地址是操作数最高有效字节(MSB)所在的地址
小端方式
- 指令中给出的地址是操作数最低有效字节(LSB)所在的地址
- 装入\存储(Load/Store)型指令有什么特点?
- 装入\存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。这种指令风格在RISC指令系统中较为常见。
- 为了规整指令格式,使指令具有相同的长度,规定只有Load/Store指令才能访问内存。而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为寄存器编号较短,而主存地址位数较长,通过某种方式可使运算指令和访存指令的长度一致。
- 这种风格的指令系统最大特点是:指令格式规整,指令长度一致,一般为32位。由于只有Load/Store指令才能访问内存,程序中可能会包含许多装入指令和存储指令,与一般通用寄存器型指令风格相比,其程序长度会更长。
中央处理器
CPU的功能和基本结构
CPU的功能
- 由运算器和控制器组成。
- 控制器,负责协调并控制计算机各部件执行程序的指令序列,包括取指令、分析指令、执行指令
- 运算器,对数据进行加工
- CPU的具体功能
指令控制
- 完成取指令、分析指令、执行指令的操作,即程序的顺序控制
操作控制
- 一条指令的功能往往有若干操作信号的组合来实现。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作
时间控制
- 对各种操作加以时间上的控制,时间控制要为每条指令按时间顺序提供应有的控制信号
数据加工
- 对数据进行算术和逻辑运算
中断处理
- 对计算机运行过程中出现的异常情况和特殊请求进行处理
CPU的基本结构
-
运算器
- 接收从控制器送来的命令并执行相应的动作,对数据进行加工和处理。
- 是计算机对数据进行加工处理的中心
算术逻辑单元
:进行算术/逻辑运算暂存寄存器
- 用于暂存从主存读来的数据,该数据不能存放在通用寄存器中,否则会破坏其原有内容。
- 对应用程序员是透明的
累加寄存器
- 是一个通用寄存器,用于存放ALU运算的结果信息,可以作为加法运算的一个输入端
通用寄存器组
- 如AX,BX,CX,DX,SP等,用于存放操作数(源操作数、目的操作数、中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址
程序状态字寄存器
- 保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OF)、符号标志(SF)、零标志(ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成
移位器
- 对操作数或运算结果进行移位运算
计数器
- 控制乘除运算的操作步数
-
控制器
-
整个系统的指挥中枢,基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的
-
有硬布线控制器和微程序控制器两种类型
-
由程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统和微操作信号发生器等组成
-
程序计数器
- 指出下一条指令在主存中的存放位置。CPU根据PC的内容去主存中取指令。因程序中指令(通常)是顺序执行的,所以PC有自增功能
-
指令寄存器
- 保存当前正在执行的那条指令
-
指令译码器
- 仅对操作码字段进行译码,向控制器提供特定的操作信号
-
存储器地址寄存器
- 存放要访问的主存单元的地址
-
存储器数据寄存器
- 存放向主存写入的信息或从主存读出的信息
-
时序系统
- 产生各种时序信号,由统一时钟(CLOCK)分频得到
-
微操作信号发生器
- 根据IR的内容(指令),PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种
-
-
工作原理
- 根据指令操作码、指令的执行步骤(微命令序列)和条件信号来形成当前计算机各部件要用到的控制信号。计算机整机各硬件系统在这些控制信号的控制下协同运行,产生预期的执行结果。
CPU内部寄存器大致可分为两类,用户可见的寄存器,可对其编程,如通用寄存器组、程序状态字寄存器。另一类是用户不可见的寄存器,对用户透明,不可对其编程,如存储器地址寄存器、存储器数据寄存器、指令寄存器
-
课后习题
- 选择题:6、7、11、15、21、22、23
指令执行过程
指令周期
-
CPU从主存中取出并执行一条指令的时间,不同指令的指令周期可能不同
-
常用若干机器周期来表示,一个机器周期又包含若干时钟周期(也称节拍或T周期,是CPU操作的最基本单位)
-
每个指令周期内的机器周期数可以不等,每个机器周期内的节拍数/时钟周期也可以不等
-
无条件转移指令JMP X,在执行时不需要访问主存,只包含取指阶段(包括取指和分析)和执行阶段,所以其指令周期仅包含取指周期和执行周期
-
间接寻址指令,为了取操作数,需要先访问一次主存,取出有效地址,然后访问主存,取出操作数,因此包括了间址周期,间址周期介于取指周期和执行周期之间
-
当CPU采用中断方式实现主机和I/O设备的信息交换时,CPU在每条指令执行结束前,都要发中断查询信号,若有中断请求,则CPU进入中断响应阶段,又称中断周期
-
一个完整的指令周期应包括取指、间址、执行和中断共4个周期
-
4个工作周期都有CPU访存操作,只是访存的目的不同。取指周期是为了取指令,间址周期是为了取有效地址,执行周期是为了取操作数,中断周期是为了保存程序断点
-
为了区别不同的工作周期,在CPU内设置4个标志触发器FE(取指周期)、IND(间址周期)、EX(执行周期)、INT(中断周期),并以1状态表示有效,分别由** 1 → F E , 1 → I N D , 1 → E X , 1 → I N T \rm 1 \rightarrow FE, 1 \rightarrow IND, 1 \rightarrow EX, 1 \rightarrow INT 1→FE,1→IND,1→EX,1→INT**这四个信号控制
中断周期中的进栈操作是将SP减1,和传统意义上的进栈操作相反,原因是计算机的堆栈中都是向低地址增加,所以进栈操作是减1而不是加1
指令周期的数据流
-
根据指令要求依次访问的数据序列。不同的指令或者指令执行的不同阶段,要求的数据流不同
-
取指周期
-
根据PC中的内容从主存中取出指令代码并存放在IR中
-
PC存放的是指令的地址,根据此地址从内存单元中取出的是指令,并放在指令寄存器IR中,取指令的同时,PC加1
-
取指周期的数据流向如下
- PC到MAR到地址总线到主存
- CU发出控制信号到控制总线到主存
- 主存到数据总线到MDR到IR(存放指令)
- CU发出读命令,PC内容加1
-
-
间址周期
-
取操作数有效地址。
-
将指令中的地址码送到MAR并送至地址总线,此后CU向存储器发读命令,以获取有效地址并存至MDR
-
间址周期的数据流向如下
-
Ad(IR)(或MDR)到MAR到地址总线到主存。
-
CU发出读命令到控制总线到主存
-
主存到数据总线到MDR(存放有效地址)
Ad(IR)表示取出IR中存放的指令字的地址字段
-
-
-
执行周期
- 任务是取操作数,根据IR中的指令字的操作码通过ALU操作产生执行结果,不同指令的执行周期操作不同,因此没有统一的数据流向
-
中断周期
-
任务是处理中断请求
-
假设程序断点存入堆栈中,并用SP指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据
-
中断周期的数据流向如下
- CU控制将SP减1,SP到MAR到地址总线到主存
- CU发出写命令到控制总线到主存
- PC到MAR到数据总线到主存(程序断点存入主存)
- CU(中断服务程序的入口地址)到PC
-
指令执行方案
- 一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。出于性能和成本的考虑,可以选用3种不同的方案来安排指令的执行步骤
单指令周期
- 所有指令都选用相同的执行时间来完成,指令之间串行执行
- 指令周期取决于执行时间最长的指令的执行时间
- 对于那些本可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的运行速度
多指令周期
- 不同类型的指令选用不同的执行步骤来完成,指令之间串行执行
- 可选用不同个数的时钟周期来完成不同指令的执行过程,不再要求所有指令占用相同的执行时间
流水线方案
- 指令之间可以并行执行
- 通过在每个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中
课后习题
- 选择题:7、8、10、12、18
- 综合题:全部
数据通路的功能和基本结构
数据通路的功能
- 数据在功能部件之间传送的路径。路径上的部件称为数据通路部件,如ALU、通用寄存器、状态寄存器、异常和中断处理逻辑等
- 数据通路由控制部件控制,控制部件根据每条指令功能的不同生成对数据通路的控制信号,并正确控制指令的执行流程
- 实现CPU内部的运算器与寄存器及寄存器之间的数据交换
数据通路的基本结构
-
CPU内部单总线方式
- 将所有寄存器的输入端和输出端都连接到一条公共通路上,但数据传输存在较多的冲突现象,性能较低
-
CPU内部三总线方式
(数据总线、控制总线、地址总线)- 将所有寄存器的输入端和输出端都连接到多条公共通路上
- 相比之下,单总线中一个时钟内只允许传送一个数据,因而指令执行效率很低,而采用 多总线方式,同时在多个总线上传送不同的数据,提高效率
-
专用数据通路方式
- 根据指令执行过程中的数据和地址的流动方向安排连接线路,避免使用共享的总线,性能较高,但硬件量大
内部总线是指同一部件,如CPU内部连接各寄存器及运算部件之间的总线;
系统总线是指同一台计算机系统的各部件,如CPU、内存、通道和各类I/O接口间互相连接的总线
-
寄存器之间的数据传送
-
通过CPU内部总线完成
-
举例PC寄存器,把PC内容送至MAR,流程及控制信号如下
PC -> Bus // PCout有效,PC内容送总线Bus -> MAR // MARin有效,总线内容送MAR
-
-
-
主存与CPU之间的数据传送
-
通过CPU内部总线完成
-
举例CPU从主存读取指令,流程及控制信号如下
PC -> Bus -> MAR // PCout和MARin有效,现行指令地址 -> MAR1 -> R // CU发读命令MEM(MAR) -> MDR // MDRin有效MDR -> Bus -> IR // MDRout和IRin有效,现行指令 -> IR
-
-
-
执行算术或逻辑运算
-
由于ALU本身是没有内部存储功能的组合电路,因此如要执行加法运算,相加的两个数必须在ALU的两个输入端同时有效。
-
举例上图的暂存器Y,先将一个操作数经CPU内部总线送入暂存器Y保存,Y的内容在ALU的左输入端始终有效,再将另一个操作数经总线直接送到ALU的右输入端。这样两个数就都送入了ALU,运算结果暂存在暂存器Z中
Ad(IR) -> Bus -> MAR // MDRout和MARin有效1 -> R // CU发读命令MEM -> 数据线 -> MDR // 操作数从存储器 -> 数据线 -> MDRMDR -> Bus -> Y // MDRout和Yin有效,操作数 -> Y(ACC)+(Y) -> Z // ACCout和ALUin有效,CU向ALU发加命令,结果 -> ZZ -> ACC // Zout和ACCin有效,结果 -> ACC
-
-
-
数据通路结构直接影响CPU内各种信息的传送路径,数据通路不同,指令执行过程的微操作序列的安排也不同,关系着微操作信号形成部件的设计
课后习题
- 选择题:2、3、5
- 综合题:全没有
控制器的功能和工作原理
控制器的结构和功能
- 上图主要连接关系
- 运算器部件通过 数据总线 与内存储器、输入设备和输出设备传送数据
- 输入设备和输出设备通过接口电路与总线相连接
- 内存储器、输入设备和输出设备从地址总线接收地址信息,从控制总线得到控制信号,通过数据总线与其他部件传送数据
- 控制器部件从数据总线接收指令信息,从运算器部件接收指令转移地址,送出指令地址到地址总线,还要向系统中的部件提供它们运行所需要的控制信号
- 控制器是计算机系统的指挥中心,主要功能有
- 从主存中取出一条指令,并指出下一条指令在主存中的位置
- 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作
- 指挥并控制CPU、主存、输入和输出设备之间的数据流动方向
硬布线控制器
-
根据指令的要求、当前时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号
-
由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器
-
硬布线控制单元图
-
指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从CU中分离出来,便可得到简化的控制单元图
-
CU的输入信号来源如下
- 经指令译码器译码产生的指令信息。
- 现行指令的操作码决定了不同指令在执行周期所需完成的不同操作,因此指令的操作码字段是控制单元的输入信号,它与时钟配合产生不同的控制信号
- 时序系统产生的机器周期信号和节拍信号。
- 为了使控制单元按一定的先后顺序、一定的节奏发出各个控制信号,控制单元必须受时钟控制,即一个时钟脉冲使控制单元发送一个操作命令,或发送一组需要同时执行的操作命令
- 来自执行单元的反馈信息即标志
- 控制单元有时需依赖CPU当前所处的状态产生控制信号,如BAN指令,控制单元要根据上条指令的结果是否为负来产生不同的控制信号。
- 经指令译码器译码产生的指令信息。
-
上图中,节拍发生器产生各机器周期中的节拍信号,使不同的微操作命令 C i C_i Ci(控制信号)按时间的先后发出。个别指令的操作不仅受操作码控制,还受状态标志控制,因此CU的输入来自操作码译码电路ID、节拍发生器及状态标志,其输出到CPU内部或外部控制总线上。
控制单元还接收来自系统总线(控制总线)的控制信号,如中断请求、DMA请求
-
-
硬布线控制器的时序系统及微操作
-
时钟周期
- 用时钟信号控制节拍发生器,可以产生节拍,每个节拍宽度正好对应一个时钟周期。在每个节拍内机器可完成一个或几个需同时执行的操作
-
机器周期
- 所有指令执行过程中的一个基准时间
- 不同指令的操作不同,指令周期也不同
- 访问一次存储器的时间是固定的,因此通常用存取周期作为基准时间,即内存中读取一个指令字的最短时间作为机器周期。
- 在存储字长等于指令字长的前提下,取指周期也可视为机器周期
- 在一个机器周期里可完成若干微操作,每个微操作都需一定的时间,可用时钟信号来控制每个微操作命令
-
指令周期
- 详见 指令周期
-
微操作命令分析
-
控制单元具有发出各种操作命令(控制信号)序列的功能。这些命令与指令有关,而且必须按照一定次序发出,才能使机器有序工作。
-
执行程序的过程中,对于不同的指令,控制单元需发出各种不同的微操作命令,一条指令分为3个工作周期:取指周期、间址周期、执行周期。下面分析各子周期的微操作命令
-
取指周期
- PC(现行指令地址) -> MAR
- 1 -> R,命令存储器读
- M(MAR) -> MDR,现行指令从存储器读至MDR
- MDR -> IR,现行指令 -> IR
- OP(IR) -> CU,指令的操作码 -> CU译码
- (PC) + 1 -> PC,形成下一条指令的地址
-
间址周期
(完成取操作数地址的任务)- Ad(IR) -> MAR,将指令字中的地址码(形式地址)-> MAR
- 1 -> R,命令存储器读
- M(MAR) -> MDR,将有效地址从存储器读至MDR
-
执行周期
-
-
-
-
CPU的控制方式
同步控制方式
- 系统有一个统一的时钟,所有的控制信号均来自这个统一的时钟信号
- 通常以最长的微操作序列和最繁琐的微操作作为标准,采取完全统一的、具有相同时间间隔和相同数目的节拍作为机器周期来运行不同的指令
- 优点是控制电路简单,缺点是运行速度慢
异步控制方式
- 不存在基准时标信号,各部件按自身固有的速度工作,通过应答方式进行联络
- 优点是运行速度快,缺点是控制电路比较复杂
联合控制方式
- 对各种不同的指令的微操作实行大部分采用同步控制、小部分采用异步控制的办法
-
硬布线控制单元设计步骤
- 列出微操作命令的操作时间表
- 进行微操作信号综合
- 画出微操作命令的逻辑图
微程序控制器
-
采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生
-
设计思想就是将每条机器指令编写成一个微程序,每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序指令的办法来寻址每个微程序的微指令
目前,大多数计算机都采用微程序设计技术
-
基本术语
微命令与微操作
- 一条机器指令可以分解成一个微操作序列,这些微操作是计算机中最基本、不可再分解的操作
- 在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为微命令,是构成控制序列的最小单位
- 微命令是微操作的控制信号,微操作是微命令的执行过程
微指令与微周期
- 微指令是若干微命令的集合,存放微指令的控制存储器的单元地址称为微地址,一条微地址通常至少包含两大部分信息
操作控制
字段(微操作码字段)- 用于产生某一步操作所需的各种操作控制信号
顺序控制
字段(微地址码字段)- 用于控制产生下一条将要执行的微指令地址
- 微周期通常指从控制存储器中读取一条微指令并执行相应的微操作所需的时间
- 微指令是若干微命令的集合,存放微指令的控制存储器的单元地址称为微地址,一条微地址通常至少包含两大部分信息
主存储器
与控制存储器
- 主存储器用于存放程序和数据,在CPU外部,用RAM实现
- 控制存储器(CM)用于存放微程序,在CPU内部,用ROM实现
程序与微程序
- 程序是指令的有序集合,用于完成特定的功能
- 微程序是微指令的有序集合,一条指令的功能由一段微程序来实现
-
微程序和程序是两个不同的概念。微程序是由微指令组成的,用于描述机器指令。微程序实际上是机器指令的实时解释器,由计算机设计者事先编制好并存放在控制存储器中的,一般不提供给用户。对程序员来说,计算机系统中的微程序的结构和功能是透明的,无须知道。而程序最终由机器指令组成,是由软件设计人员事先编制好并存放在主存或辅存中的
-
区分以下寄存器
地址寄存器
- 存放主存的读/写地址
微地址寄存器
- 存放控制存储器的读/写微指令的地址
指令寄存器
- 存放从主存中读出的指令
微指令寄存器
- 存放从控制存储器中读出的微指令
-
微程序控制器的组成和工作过程
-
基本组成
控制存储器
- 微程序控制器的核心部件,用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成
微指令寄存器
- 用于存放从CM中取出的微指令,它的位数同微指令字长相等
微地址形成部件
- 用于产生初始微地址和后继微地址,以保证微指令的连续执行
微地址寄存器
- 接收微地址形成部件送来的微地址,为在CM中读取微指令作准备
-
工作过程
- 实际上就是在微程序控制器的控制下,计算机执行机器指令的过程,可如下描述
- 执行取微指令公共操作
- 在机器开始运行时,自动将取指微程序的入口地址送入CMAR,并从CM中读出相应的微指令送入CMDR。取指微程序的入口地址一般为CM的0号单元,当取指微程序执行完后,从主存中取出的机器指令就已存入指令寄存器中。
- 由机器指令的操作码字段通过微地址形成部件产生该机器指令所对应的微程序的入口地址,并送入CMAR
- 从CM中逐条取出对应的微指令并执行
- 执行完对应一条机器指令的一个微程序后,又回到取指微程序的入口地址,继续第1步,以完成取下一条机器指令的公共操作
- 执行取微指令公共操作
- 实际上就是在微程序控制器的控制下,计算机执行机器指令的过程,可如下描述
-
微程序和机器指令
- 通常,一条机器指令对应一个微程序,由于任何一条机器指令的取指令操作都是相同的,因此可将取指令操作的微命令统一编成一个微程序,这个微程序只负责将指令从主存单元中取出并送至指令寄存器
- 此外也可,编出对应间址周期的微程序和中断周期的微程序,这样,控制存储器中的微程序个数,应为机器指令数加上对应取指、间址和中断周期等共用的微程序数
若指令系统中具有n种机器指令,则控制存储器中的微程序数至少是n+1(1为公共的取指微程序)
-
-
微指令的编码方式
-
又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是保证速度的情况下,尽量缩短微指令字长
-
直接编码(直接控制方式)
-
直接编码法无须进行译码,微指令的微命令字段中,每位都代表一个微命令。设计微指令时,选用或不选用某个微命令,只要将表示该微命令的对应位设置成1或0即可。每个微命令对应并控制数据通路中的一个微操作。
-
优点是简单、直观、执行速度快、操作并行性好,缺点是微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控制存储器容量极大
-
-
字段直接编码方式
-
将微指令的微命令字段分成若干小字段,把互斥性微命令组合在同一字段中,把相容性微命令组合在不同字段中,每个字段独立编码,每种编码代表一个微命令,且各字段编码含义单独定义,与其他字段无关
-
这种方式可以缩短指令字长,但因为要通过译码电路后再发出微命令,因此比直接编码方式慢
-
微命令字段分段原则
- 互斥性微命令分在同一段内,相容性微命令分在不同段内
- 每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间
- 一般每个小段还要留出一个状态,表示本字段不发出任何微命令。
- 因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作
-
-
字段间接编码方式
- 一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,因此称为字段间接编码(又称隐式编码)
- 优点是可进一步缩短微指令字长,但因削弱了微指令的并行控制能力,因此通常作为字段直接编码方式的一种辅助手段
-
-
微指令的地址形成方式
-
两大基本类型
-
直接由微指令的下地址字段指出(又称断定方式)
- 微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址
-
根据机器指令的操作码形成
- 机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成
-
-
其他类型
-
增量计数器法
- 即**(CMAR) + 1 -> CMAR**,适用于后继微指令的地址连续的情况
-
根据各种标志决定微指令分支转移的地址
-
通过网络测试形成
-
由硬件直接产生微程序入口地址
-
-
电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向CMAR输入微指令地址,这个地址即为取指周期微程序的入口地址
-
-
微指令的格式
-
与微指令的编码方式有关,通常分水平型和垂直型两种
-
水平型
-
从编码方式看,直接编码、字段直接编码、字段间接编码、混合编码都是
-
基本指令格式如下,指令字中的一位对应一个控制信号,有输出时为1,否则为0
-
优点是微程序短,执行速度快,缺点是微指令长,编写微程序较麻烦
-
-
垂直型
-
特点是采用类似机器指令操作码的方式,在微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能
-
基本的指令格式如下,一条微指令只能定义并执行一种基本操作
-
- 优点是微指令短、简单、规整、便于编写微程序,缺点是微程序长,执行速度慢,工作效率低
混合型微指令
- 在垂直型的基础上增加一些不太复杂的并行操作。微指令较短,仍便于编写;微程序也不长,执行速度加快
水平型微指令和垂直型微指令的比较如下
- 水平型微指令并行操作能力强、效率高、灵活性强,垂直型微指令则较差
- 水平型微指令执行一条指令的时间短,垂直型执行的时间长
- 水平型微指令解释指令的微程序,具有微指令字较长但微程序短的特点,垂直型则与之相反,其微指令字短而微程序长
- 水平型微指令用户较难掌握,而垂直型微指令与指令比较相似,相对容易掌握
-
-
-
微程序控制单元的设计步骤
-
写出对应机器指令的微操作命令及节拍安排
-
确定微指令格式
- 包括微指令的编码方式、后继微指令地址的形成方式、微指令字长
-
编写微指令码点
-
-
动态微程序设计和毫微程序设计
-
动态微程序设计
- 在一台微程序控制的计算机中,如果能根据用户的要求改变微程序,则这台机器就具有动态微程序设计功能
- 需要可写控制寄存器的支持,否则难以改变微程序的内容。可采用可擦除可编程只读存储器(EPROM)
-
毫微程序设计
- 普通的微程序计算机中,从主存取出的每条指令是由放在控制存储器中的微程序来解释执行的,通过控制线对硬件直接控制。若硬件不由微程序直接控制,而是通过存放在第二级控制存储器的毫微程序来解释的,这个第二级控制存储器就称为毫微存储器,直接控制硬件的是毫微微指令
-
-
硬布线和微程序控制器的特点
-
硬布线控制器
- 优点是由于控制器的速度取决于电路延迟,所以速度快;缺点是由于将控制部件视为专门产生固定时序控制信号的逻辑电路,所以把用最少元件和取得最高速度作为设计目标,一旦设计完成,就不可能通过其他额外修改添加新功能
-
微程序控制器
- 优点是同组合逻辑控制器相比,微程序控制器具有规整性、灵活性、可维护性等一系列优点;缺点是由于微程序控制器采用了存储程序原理,所以每条指令都要从控制存储中取一次,影响速度
-
两者的对比表格
对比项目 微程序控制器 硬布线控制器 工作原理 微操作控制信号以微程序的形式存放在控制存储器中,执行指令时读出即可 微操作控制信号由组合逻辑电路根据当前的指令码、状态、时序即时产生 执行速度 慢 快 规整性 较规整 烦琐、不规整 应用场合 CISC RISC 易扩充性 易扩充修改 困难
-
课后习题
- 选择题:3、7、8、12、14、15、17、19、24
- 综合题:全没有
异常和中断机制
异常和中断的基本概念
- 由CPU内部产生的意外事件称为 异常/内中断,来自 CPU外部的设备向CPU发出的中断请求称为 中断/外中断,通常用于信息的输入和输出
- 异常是CPU执行一条指令时,由CPU在其内部检测到的、与正在执行的指令相关的同步事件
- 中断是一种典型的由外部设备触发的、与当前正在执行的指令 无关的异步事件
异常和中断的分类
-
异常的分类
-
按 类型分
- 硬故障中断
- 由硬连线出现异常引起的,如 存储器校验错、总线错误
- 程序性异常(软件中断)
- 在CPU内部因执行指令而引起的 异常事件,如 整除0、溢出、断点、单步跟踪、非法指令、栈溢出、地址越界、缺页
- 硬故障中断
-
按 异常发生原因和 返回方式分
-
故障(Fault)
- 在引起故障的指令 启动后、执行结束前被检测到的异常事件,
- 指令译码时,出现 非法操作码
- 取数据时,发生 缺段 或 缺页
- 经处理后,可将所需的 段或 页面从磁盘调入内存,回到发生故障的指令继续执行,断点为当前发生故障的指令
- 执行整数除法指令时,发现 除数为0
- 因为无法通过 异常处理程序恢复故障,因此不能回到原断点执行,必须终止进程的执行
- 在引起故障的指令 启动后、执行结束前被检测到的异常事件,
-
自陷(Trap)
- 是 预先安排的一种异常事件。事先在程序中用一条 特殊指令或通过某种方式 设定特殊控制标志来人为设置一个陷阱,当执行到被设置了陷阱的指令时,CPU在执行完 自陷指令后,自动进行相应处理,然后返回到 自陷指令的 下一条指令执行
- 当 自陷指令是 转移指令时,并不是返回到下一条指令执行,而是返回到 转移目标指令执行
- 用于 程序调试断点和 单步跟踪的功能就是通过 陷阱机制实现的
故障和 自陷属于 程序性异常,即 软件中断
-
终止(Abort)
- 如果在执行指令的过程中发生了使计算机无法继续执行的 硬件故障,如 控制器出错、存储器校验错等,那么程序将无法继续执行,只能 终止,此时,调出 中断服务程序来重启系统。这种异常与 故障和 自陷不同,不是由特定指令产生的,而是随机产生的
- 终止异常和 外中断属于 硬件中断
-
-
-
中断的分类
- 可屏蔽中断
- 通过 可屏蔽中断请求线INTR向CPU发出的中断请求。CPU可以通过在中断控制器中设置相应的屏蔽字来屏蔽它或不屏蔽它,被屏蔽的中断请求将不被送到CPU
- 不可屏蔽中断
- 通过 不可屏蔽中断请求线NMI向CPU发出的中断请求,通常是非常紧急的硬件故障,如电源掉电
- 可屏蔽中断
-
中断和 异常在本质上是一样的,区别如下
- 缺页或 溢出等异常事件是由特定指令在执行过程中产生的;而 中断不和任何指令相关联,也不阻止任何指令的完成
- 异常的检测由CPU自身完成,不必通过外部的某个信号通知CPU;对于 中断,CPU必须通过中断请求线获取中断源的信息,才能知道哪个设备发生了何种中断
异常和中断响应过程
- 关中断
- 在 保存断点和 程序状态期间,不能被新的中断打断,因此要禁止响应新的中断
- 通常通过设置 中断允许(IF)触发器来实现,若 IF为1,表示 开中断,允许响应中断
- 在 保存断点和 程序状态期间,不能被新的中断打断,因此要禁止响应新的中断
- 保存断点和程序状态
- 通常保存在 栈中,这是为了支持 异常或中断的嵌套
- 被中断时的 程序状态字寄存器 PSWR的内容也需要保存在 栈或特定寄存器中,在异常和中断返回时恢复到PSWR中
- 识别异常和中断并转到相应的处理程序
- 识别方式
- 软件识别
- 硬件识别
- 异常大多采用 软件识别方式,中断 可以采用 软件识别或 硬件识别
- 软件识别指CPU设置一个异常状态寄存器,用于记录异常原因。操作系统用一个统一的 异常或中断查询程序,按优先级顺序查询 异常状态寄存器,以检测 异常和中断类型,先查询到的先被处理,然后转到内核中相应的 处理程序
- 硬件识别方式又称 向量中断,异常或中断处理程序的首地址称为 中断向量,所有 中断向量都存放在中断向量表中。每个 异常或中断都被指定一个 中断类型号。在 中断向量表中,类型号和 中断向量 一一对应,因而可以根据 类型号快速找到对应的 处理程序
- 整个 响应过程是不可被打断的。中断响应过程结束后,CPU就从PC中取出 中断服务程序的第一条指令开始执行,直至中断返回,这部分任务是由CPU通过执行 中断服务程序 完成的,整个 中断处理过程是由 软/硬件协同实现的
- 识别方式
课后习题
- 选择题:4、8、9
指令流水线
指令流水线的基本概念
- 可从 两方面提高处理机的并行性
- 时间,将一个任务分解为几个不同的子阶段,每个阶段在不同的功能部件上并行执行,该方法称为 流水线技术
- 空间,在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,这样的处理机被称为 超标量处理机
- 一条指令的执行过程可分解为若干阶段,每个阶段由相应的功能部件来完成。如果将各阶段视为相应的流水线,则指令的执行过程就构成了一条指令流水线。采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此称为计算机中普遍使用的一种并行处理技术
-
指令流水的定义
-
根据计算机的不同,具体的分法也不同
取指
(IF)- 从 指令存储器或 Cache中取指令
译码/读寄存器
(ID)- 操作 控制器对 指令进行译码,同时从寄存器堆中取操作数
执行/计算地址
(EX)- 执行 运算操作或 计算地址
访存
(MEM)- 对 存储器进行读写操作
写回
(WB)- 将指令执行结果写回 寄存器堆
-
当多条指令在处理器中执行时,可采用以下两种方式
-
顺序执行方式
(串行执行方式)-
前一条指令执行完后,才启动下一条指令
-
假设取指、分析、执行三个阶段的时间都相等,用t表示,顺序执行n条指令所用时间T为
T = 3 n t T=3nt T=3nt -
传统冯·诺依曼机采用顺序执行方式
-
优点是控制简单,硬件代价小;缺点是执行指令的速度较慢,在任何时刻,处理机中,只有一条指令在执行,各功能部件的利用率很低
- 例如,取指时内存是忙碌的,而指令执行部件是空闲的
-
-
-
流水线执行方式
-
为了提高指令的执行速度,可以把取k+1条指令提前到分析第k条指令的期间完成,而将分析第k+1条指令与执行第k条指令同时进行
- 采用此种方式,执行n条指令所用的时间为
T = ( 2 + n ) t T=(2+n)t T=(2+n)t
- 采用此种方式,执行n条指令所用的时间为
-
与顺序执行方式相比,采用流水线执行方式能使指令的执行时间缩短近2/3,各功能部件的利用率明显提高。但硬件上要付出较大开销的代价,控制过程也更复杂。
-
理想情况下,每个时钟周期都有一条指令进入流水线,处理机中同时有3条指令在执行,每个时钟周期都有一条指令完成,每条指令的时钟周期数(即CPI)都为1。
-
为了进一步获得更高的执行速度,还可以将流水段进一步细分。如将一条指令的执行过程分为取指令(IF)、指令译码(ID)、(取操作数(OF))、执行(EX)、写回(WB)四个阶段,就形成了四级流水(或五级流水)
-
流水线设计原则
- 指令流水段个数以最复杂指令所用的功能段个数为准
- 流水段的长度以最复杂的操作所花的时间为准
- 假设某条指令的3个阶段所花时间如下,不考虑数据通路中的各种延迟,该指令总执行时间为450ps,按照流水线设计原则,每个流水段的长度为200ps,所以每条指令的执行时间为600ps,反正比串行执行时增加了150ps。因此,流水线方式并不能缩短一条指令的执行时间,但是,对整个程序来说,可以大大增加指令执行的吞吐率
- 取指:200ps
- 分析:100ps
- 执行:150ps
- 假设某条指令的3个阶段所花时间如下,不考虑数据通路中的各种延迟,该指令总执行时间为450ps,按照流水线设计原则,每个流水段的长度为200ps,所以每条指令的执行时间为600ps,反正比串行执行时增加了150ps。因此,流水线方式并不能缩短一条指令的执行时间,但是,对整个程序来说,可以大大增加指令执行的吞吐率
-
为了利于实现指令流水线,指令集应具有如下特征
- 指令长度应尽量一致,有利于简化取指令和指令译码操作。否则,取指令所花时间长短不一,使取指部件部件极其复杂,且也不利于指令译码
- 指令格式应尽量规整,尽量保证源寄存器的位置相同,有利于在指令未知时就可取寄存器操作数,否则须译码后才能确定指令中各寄存器编号的位置。
- 采用Load/Store指令,其他指令(如运算指令)都不能访问存储器,这样可把Load/Store指令的地址计算和运算指令的执行步骤规整在同一个周期中,有利于减少操作步骤
- 数据和指令在存储器中“对齐”存放。这样,有利于减少访存次数,使所需数据在一个流水段内就能从存储器得到
-
-
-
-
流水线的表示方法
-
通常用时空图来直观地描述流水线的工作过程,横坐标表示时间,即输入流水线中的各个任务在流水线中所经过的时间。流水线中各个流水段的执行时间都相等时,横坐标就被分割成相等长度的时间段。纵坐标表示空间,即流水线的每个流水段(对应各执行部件)
-
-
流水线方式的特点
- 与传统的串行执行方式相比,采用流水线方式具有如下特点
- 把一个任务(一条指令或一个操作)分解为几个有联系的子任务,每个子任务由一个专门的功能部件来执行,并依靠多个功能部件并行工作来缩短程序的执行时间
- 流水线每个功能段部件后面都要有一个缓冲寄存器,或称锁存器,其作用是保存本流水段的执行结果,供给下一流水段使用
- 流水线中各功能段的时间应尽量相等,否则将引起堵塞、断流
- 只有连续不断地提供同一种任务时,才能发挥流水线的效率,所以在流水线中处理的必须是连续任务。在采用流水线方式工作的处理机中,要在软件和硬件设计等多方面尽量为流水线提供连续的任务
- 流水线需要有装入时间和排空时间
装入时间
- 第一个任务进入流水线到输出流水线的时间
排空时间
- 最后一个任务进入流水线到输出流水线的时间
- 与传统的串行执行方式相比,采用流水线方式具有如下特点
流水线的基本实现
-
虽然不是 所有指令都必须经历完整的 5个阶段,但只能以 执行速度最慢的指令作为设计其 时钟周期的依据,单周期CPU的时钟频率取决于 数据通路中的关键路径(最长路径),因此单周期CPU执行效率不佳
-
流水线的数据通路
-
流水线的控制信号
-
某一时刻,每个 流水段执行不同指令的 某个阶段,每个 流水段还需要正在执行指令的对应 功能段 的 控制信号
-
控制信号分类
-
每个 流水寄存器中保存的信息包括
- 后面 流水段需要用到的所有数据信息
- 包括 PC+4、指令、立即数、目的寄存器、ALU运算结果、标志信息
- 前面传递的,后面各 流水段需要用到的所有 控制信号
- 后面 流水段需要用到的所有数据信息
-
-
流水线的执行过程
- 由于 流水线的特殊结构,所有指令都需要完整经过 流水线的各功能段,只不过某些指令在某些功能段内没有任何实质性的操作,只是等待一个时钟周期,这也意味着 单条指令的执行时间还是 5个功能段时间延迟的总和
取值
(IF)- 将 PC值作为 地址从 指令寄存器中取出第一条 指令字
- 计算 PC+4,送入 PC输入端,以便在下一个 时钟周期取下条指令
译码/读寄存器
(ID)- 由 控制器根据 IF/ID流水寄存器中的 指令字生成后续各段需要的 控制信号
执行/计算地址
(EX)- EX段功能由 具体指令确定,不同指令经 ID段译码后得到不同的 控制信号
访存
(MEM)- MEM段的功能也由 具体指令确定
写回
(WB)- WB段的功能也由 具体指令确定
- 由于 流水线的特殊结构,所有指令都需要完整经过 流水线的各功能段,只不过某些指令在某些功能段内没有任何实质性的操作,只是等待一个时钟周期,这也意味着 单条指令的执行时间还是 5个功能段时间延迟的总和
流水线的冒险与处理
-
在 指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线 阻塞或 停顿,这种现象称为 流水线冒险
-
结构冒险
- 由于 多条指令在同一时刻争用 同一资源而形成的冲突,也称为 资源冲突
- 解决办法
- 前一指令访存时,使 后一条相关指令(以及其后续指令)暂停一个 时钟周期
- 单独设置 数据存储器和 指令存储器,使 取数和 取指令操作各自在不同的 存储器中进行
-
数据冒险
- 在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突。当 多条指令重叠处理时就会发生冲突
写后读
(Read After Write,RAW)- 表示 当前指令将数据写入 寄存器后,下一条指令才能从该 寄存器读取数据
- 如果 先读后写,读到的就是 旧数据
读后写
(Write After Read,WAR)- 表示 当前指令读出后,下一条指令才能写 该寄存器
- 如果 先写后读,读到的就是 新数据
写后写
(Write After Write,WAW)- 表示 当前指令 写入 寄存器后,下一条指令才能写该寄存器
- 下一条指令在 当前指令之前写,将使 寄存器的值不是最新值
- 解决办法
- 把遇到数据相关的指令及其 后续指令都暂停一至几个 时钟周期,直到数据相关问题 消失后再继续执行,可分为 硬件阻塞(stall)和 软件插入(NOP)指令两种方法
- 设置 相关专用通路,即不等 前一条指令把计算结果写回寄存器组,下一条指令也不再读寄存器组,而直接把 前一条指令的ALU计算结果作为自己的输入数据开始计算过程,使本来需要暂停的操作变得可以继续执行,这称为 数据旁路技术
- 通过 编译器对数据相关的 指令编译优化的方法,调整 指令顺序来解决 数据相关
- 在一个程序中,下一条指令会用到当前指令计算出的结果,此时这两条指令发生数据冲突。当 多条指令重叠处理时就会发生冲突
-
控制冒险
-
指令通常是 顺序执行的,但是在遇到 改变指令顺序的情况,如 执行转移、调用、返回等指令,会 改变PC值,会造成 断流,从而引起 控制冒险
-
解决办法
- 对 转移指令进行 分支预测,尽早生成 转移目标地址。分支预测分为 简单(静态)预测和 动态预测
- 静态预测总是预测 条件不满足,即继续执行分支指令的 后续指令
- 动态预测总是根据程序执行的历史情况,进行动态预测调整,有较高的预测准确率
- 预取 转移成功和 不成功两个 控制流方向上的目标指令
- 加快和提前形成 条件码
- 提高转移方向的 猜准率
Cache缺失的处理过程也会引起 流水线阻塞。在不过多增加硬件成本的情况下,如何尽可能地 提高指令流水线的运行效率是选用 指令流水线技术必须解决的关键问题
- 对 转移指令进行 分支预测,尽早生成 转移目标地址。分支预测分为 简单(静态)预测和 动态预测
-
流水线的性能指标
衡量流水线性能的主要指标有吞吐率、加速比,下面以线性流水线为例分析,分析方法和有关公式也适用于非线性流水线
-
流水线的吞吐率
-
在指令级流水线中,吞吐率是指在单位时间内流水线所完成的任务数量,或输出结果的数量。计算流水线吞吐率(TP)的最基本的公式为
T P = n T k TP = \frac{n}{T_k} TP=Tkn
其中,n是任务数,** T k T_k Tk**是处理完n个任务所用的时间 -
设k为 流水段的段数,* Δ t \Delta t Δt*为 时钟周期。在输入流水线中的任务连续的理想情况下,一条 k段流水线能在 k+n-1个时钟周期内完成 n个任务,得出 流水线的吞吐率为
T P = n ( k + n − 1 ) Δ t TP=\frac{n}{(k+n-1)\Delta t } TP=(k+n−1)Δtn- 连续输入的任务数 * n → ∞ n \rightarrow \infty n→∞*时,得 最大吞吐率为 T P m a x = 1 / Δ t TP_{max}=1/\Delta t TPmax=1/Δt
-
-
流水线的加速比
-
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比
-
设** T 0 T_0 T0表示不使用流水线时的执行时间,即顺序执行所用的时间。 T k T_k Tk表示使用流水线时的执行时间,则计算流水线加速比(S)的基本公式为
S = T 0 T k S=\frac{T_0}{T_k} S=TkT0
若流水线各段执行的时间都相等,则一条k段流水线完成n个任务所需的时间为 T k = ( k + n − 1 ) Δ t T_k=(k+n-1)\Delta t Tk=(k+n−1)Δt。而不使用流水线,即顺序执行n个任务时,所需的时间为 T 0 = k n Δ t T_0=kn\Delta t T0=knΔt,将 T 0 T_0 T0和 T k T_k Tk的值代入上式,得实际加速比
S = k n Δ t ( k + n − 1 ) Δ t = k n k + n − 1 S=\frac{kn\Delta t}{(k+n-1)\Delta t}=\frac{kn}{k+n-1} S=(k+n−1)ΔtknΔt=k+n−1kn
连续输入的任务数 n → ∞ n \rightarrow \infty n→∞ 时,最大加速比为 S m a x = k S_{max}=k Smax=k**
-
高级流水线技术
- 有两种 增加指令级并行的策略
- 多发射技术,通过采用多个 内部功能部件,使 流水线功能段能同时处理多条指令,处理机一次可以发射多条指令进行 流水线执行
- 超流水线技术,通过增加流水线级数来使更多的指令同时在流水线中重叠执行
-
超标量流水线技术
(动态多发射技术)-
每个时钟周期可以并发多条独立指令,即以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件
-
超标量计算机不能调整指令的执行顺序,因此通过编译优化技术是,把可并行执行的指令搭配起来,挖掘更多的执行并行性
-
-
超长指令字技术
(静态多发射技术)- 由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件
-
超流水线技术
-
流水线功能段划分得越多,时钟周期就越短,指令吞吐率就越高,因此该技术通过提高流水线主频的方式来提升性能
-
流水线级数越多,用于流水寄存器的开销就越大,因而流水线级数有限制,不是越多越好
-
-
超流水线CPU在流水线充满后,每个时钟周期还是 执行一条指令,CPI=1,但其主频更高
-
多发射流水线CPU每个时钟周期可以处理多条指令,CPI<1,相对而言,多发射流水线成本更高,控制更复杂
课后习题
- 选择题:2、4、8、9、10、17
- 综合题:全没有
多处理器的基本概念
SISD、SIMD、MIMD的基本概念
-
基于指令流的数量和数据流的数量,将计算机体系结构分为 SISD、SIMD、MISD、MIMD四类。常规的单处理器属于SISD,常规的多处理器属于MIMD
-
单指令流单数据流
(SISD)- 仅包含一个处理器、一个存储器,处理器在一段时间内仅执行一条指令,按指令流规定的顺序串行执行指令流中的若干条指令
-
单指令流多数据流
(SIMD)- 一个指令流同时对多个数据流进行处理,一般称为数据级并行技术。通常由一个指令控制部件、多个处理单元组成。每个处理单元虽然执行的都是同一条指令,但是每个单元都有自己的地址寄存器
- 在处理for循环处理数组时最有效
-
多指令流单数据流
(MISD)- 同时执行多条指令,处理同一个数据,实际上不存在这样的计算机
-
多指令流多数据流
(MIMD)- 同时执行多条指令分别处理多个不同的数据,MIMD分为计算机系统和多处理器系统
-
向量处理器是SIMD的变体,是一种实现了直接操作一维数组(向量)指令集的CPU,而串行处理器只能处理单一数据集
-
SIMD和MIMD是两种并行计算模式,SIMD是一种数据级并行模式,而MIMD是一种并行程度更高的线程级并行或线程级以上并行计算模式
硬件多线程的基本概念
细粒度多线程
- 多个线程之间轮流交叉执行指令,多个线程之间的指令是不相关的,可以乱序并行执行
- 处理器能在每个时钟周期切换线程
粗粒度多线程
- 仅在一个线程出现了较大开销的阻塞时,才切换线程(如Cache缺失),这种方式下,当发生流水线阻塞时,必须清除被阻塞的流水线,新线程的指令开始执行前需要重载流水线,因此,线程切换的开销比细粒度多线程更大
同时多线程
- 上述两种多线程技术的变体,在实现指令级并行的同时,实现线程级并行,也就是说,它在同一个时钟周期中,发射多个不同线程中的多条指令执行
- Intel处理器的超线程就是同时多线程SMT,即在一个单处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件
多核处理器的基本概念
-
将多个处理单元集成到单个CPU中,每个处理单元称为一个核(core)。每个核可以有自己的Cache,也可以共享同一个Cache
共享内存多处理器的基本概念
-
具有共享的单一物理地址空间的多处理器被称为共享内存多处理器(SMP)。处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问任何存储器的位置
- 即使这些系统共享同一个物理地址空间,它们仍然可在自己的虚拟地址空间中单独地运行程序
-
单一地址空间的多处理器有两种类型
-
每个处理器对所有存储单元的访问时间是大致相同的,这类机器统称统一存储访问(UMA)多处理器
- 根据处理器与共享存储器之间的连接方式,分为基于总线、基于交叉开关网络、基于多级交换网络连接等几种处理器
-
某些访存请求要比其他的快,具体取决于哪个处理器提出了访问请求以及访问哪个字,这是由于主存被分配给了同一机器上的不同处理器或内存控制器,这类机器称为非统一存储访问(NUMA)多处理器
- 处理器中不带高速缓存时,被称为NC-NUMA;带有一致性高速缓存时,被称为CC-NUMA
-
课后习题
- 选择题:8
总结
-
各种字长关系
- 指令字长一般取存储字长的整数倍,若指令字长为存储字长的2倍,则需要两次访存,取指周期等于机器周期的2倍
- 指令字长取决于操作码的长度、操作数地址的长度和操作数地址的个数,与机器字长没有必然联系
-
CPU分为哪几部分?分别实现什么功能?
-
运算器
- 负责数据的加工,即对数据进行算术和逻辑运算
-
控制器
- 整个系统的指挥中枢,对整个计算机系统进行有效的控制,包括指令控制、操作控制、时间控制、中断处理
-
-
指令和数据均放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?
-
时间
- 取指令时间发生在取指周期,取数据时间发生在执行周期
-
空间
- 从内存读出的指令流流向控制器(指令寄存器),从内存读出的数据流流向运算器(通用寄存器)
-
-
什么是指令周期、机器周期、时钟周期?它们之间有什么关系?
-
指令周期
- CPU每取出并执行一条指令所需的全部时间
-
机器周期
- 在同步控制的机器中,执行指令周期中一步相对完整的操作(指令步)所需的时间,通常安排机器周期长度=主存周期
-
时钟周期
- 计算机主时钟的周期时间,它是计算机运行时最基本的时序单位,对应完成一个微操作所需的时间,通常时钟周期=计算机主频的倒数
-
-
指令周期是否有一个固定值?为什么?
- 由于计算机中各种指令执行所需的时间差异很大,因此为了提高CPU的运行效率,即使在同步控制的机器中,不同指令的指令周期长度都是不一致的
-
什么是微指令?
- 控制部件通过控制线向执行部件发出各种控制命令,通常把这种控制命令称为微命令,而一组实现一定操作功能的微命令的组合,构成一条微指令。许多条微指令组成的序列构成微程序,微程序完成对指令的解释执行。
- 指令,即机器指令,每条指令可以完成一个独立的算术运算或逻辑运算操作,在采用微程序控制器的CPU中,一条指令对应一个微程序,一个微程序由许多微指令构成,一条微指令会发出很多不同的微命令
-
什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?
- 指令流水线是把指令分解为若干子过程,通过将每个子过程与其他子过程并行执行,来提高计算机的吞吐率的技术。采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此成为计算机中普遍使用的一种并行处理技术,通过在同一个时间段使用各功能部件,使得利用率明显提高
- 流水线的加速比指的是完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。一条k段流水线理论上的最大加速比为** S m a x = k S_{max}=k Smax=k,因此,在现代计算机中提高流水线段数有利于提高计算机的吞吐量。具体的加速比要使用时空图**来计算
-
流水线越多,并行度就越高,是否流水段越多,指令执行越快?
- 错误
- 流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大
- 流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增大而增大,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。
-
有关指令相关、数据相关的几个概念
- 两条连续的指令读取相同的寄存器时,会产生读后读(Read After Read, RAR)相关,这种相关不会影响流水线
- 某条指令要读取上一条指令所写入的寄存器时,会产生写后读(Write After Read, WAR)相关,它称数据相关或真相关,影响流水线。按序流动的流水线只可能出现RAW相关
- 某条指令的上条指令要读/写该指令的输出寄存器时,会产生读后写(Write After Read)和写后写(Write After Write)相关,在非按序流动的流水线中,既可能发生RAW相关,也可能发生WAR相关和WAW相关
- 对流水线影响最严重的指令相关是数据相关
总线
总线概述
为了更好地解决I/O设备和主机之间连接的灵活性问题,计算机的结构从分散连接发展为总线连接,为了进一步简化设计,又提出了各类总线标准
总线基本概念
- 总线的定义
- 一组能为多个部件分时共享的公共信息传送线路。分时和共享是总线的两个特点。
- 分时是指同一时刻只允许有一个部件向总线发送信息,若系统中有多个部件,则它们只能分时地向总线发送信息
- 共享是指总线上可以挂接多个部件,各个部件之间互相交换的信息都可通过这组线路分时共享
- 在某一时刻只允许有一个部件向总线发送消息,但多个部件可同时从总线上接收相同的信息
- 总线设备
- 按其对总线有无控制功能可分为主设备和从设备两种
主设备
- 总线的主设备是指获得总线控制权的设备
从设备
- 被主设备访问的设备,它只能响应从主设备发来的各种总线命令
- 按其对总线有无控制功能可分为主设备和从设备两种
- 总线特性
- 指机械特性(尺寸、形状)、电气特性(传输方向、有效的电平范围)、功能特性(每根传输线的功能)、时间特性(信号和时序的关系)
总线的分类
-
按功能分类
-
片内总线
- 芯片内部的总线,是CPU芯片内部寄存器与寄存器之间、寄存器与ALU之间的公共连接线
-
系统总线
-
计算机系统内各功能部件(CPU、主存、I/O接口)之间的相互连接的总线
-
按系统总线传输信息内容的不同,可分为3类
数据总线
- 传输各功能部件之间的数据信息,是双向传输总线,其位数与机器字长、存储字长有关
地址总线
- 指出数据总线上的源数据或目的数据所在的主存单元或I/O端口的地址,是单向传输总线,地址总线的位数与主存地址空间的大小有关
控制总线
- 传输控制信息,包括CPU送出的控制命令和主存(或外设)返回CPU的反馈信号
注意区分数据通路和数据总线:各个功能部件通过数据总线连接形成的数据传输路径,称为数据通路。数据通路表示的是数据流经的路径,而数据总线是承载的媒介
-
-
通信总线
- 在计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间传送信息的总线,通信总线也称外部总线
- 按时序控制方式可将总线划分为同步总线和异步总线,还可按数据传输格式将总线划分为并行总线和串行总线
-
系统总线的结构
-
通常分为单总线结构、双总线结构、三总线结构
-
单总线结构
-
将CPU、主存、I/O设备(通过I/O接口)都挂在一组总线上,允许I/O设备之间、I/O设备与主存之间直接交换信息,而无须经过中间设备的干预
单总线并不是指只有一根信号线,系统总线按传送信息的不同可细分为地址总线、数据总线、控制总线
-
优点是结构简单,成本低,易于接入新的设备。缺点是带宽低、负载重,多个部件只能争用唯一的总线,且不支持并发传送操作
-
-
双总线结构
-
主存总线
- 用于在CPU、主存、通道之间传送数据
-
I/O总线
- 在多个外部设备与通道之间传送数据
-
优点是将低速I/O设备从单总线上分离出来,实现了存储器总线和I/O总线分离。缺点是需要增加通道等硬件设备
-
-
三总线结构
主存总线
- 用于在CPU、内存之间传送地址、数据、控制信息
I/O总线
- 在CPU、各类外设之间通信
DMA总线
(直接内存访问总线)- 在内存、高速外设之间直接传送数据
- 优点是提高了I/O设备的性能,使其更快地响应命令,提高系统吞吐量。缺点是系统工作效率较低
-
常见的总线标准
ISA
工业标准体系结构,最早出现的微型计算机系统总线EISA
扩展的ISA,为了 配合32位CPU而设计的VESA
视频电子标准协会,是一个 32位局部总线,针对 多媒体大量数据推出的PCI
外部设备互连,是专为 高度集成的外围部件,与 处理器时钟频率无关的 局部总线AGP
加速图形接口,是一种 视频接口标准PCI-E
最新的总线接口标准RS-232C
串行通信总线USB
通用串行总线PCMCIA
应用于 笔记本电脑的接口标准,用于 扩展功能的小型插槽,即插即用IDE
集成设备电路,是一种 IDE接口磁盘驱动器接口类型SCSI
小型计算机系统接口,用于 计算机和 智能设备之间系统级接口的 独立处理器标准SATA
串行高级技术附件,基于行业标准的 串行硬件驱动器接口
总线的性能指标
-
总线传输周期
- 一次总线操作所需的时间(包括申请、寻址、传输、结束阶段),简称总线周期。通常由若干总线时钟周期构成
-
总线时钟周期
- 即机器的时钟周期。计算机有一个统一的时钟,以控制整个计算机的各个部件,总线也要受此时钟的控制
-
总线工作频率
- 总线上各种操作的频率,为总线周期的倒数。实际上指1秒内传送几次数据。若总线周期=N个时钟周期,则总线的工作频率=时钟频率/N
-
总线时钟频率
- 即机器的时钟频率,为时钟周期的倒数
-
总线宽度
(总线位宽)- 总线上同时能够传输的数据位数,通常指数据总线的根数
- 如32根称为32位总线。
- 总线上同时能够传输的数据位数,通常指数据总线的根数
-
总线带宽
-
总线的数据传输率,即单位时间内总线上可传输数据的位数,通常用每秒传送信息的字节数来衡量,单位可用字节/秒(B/s)表示。
总线带宽 = 总线工作频率 * (总线宽度 / 8),应与总线宽度区分开来
-
-
总线复用
- 一种信号线在不同的时间传输不同的信息,因此可以使 用较少的线传输更多的信息,从而节省空间和成本
-
信号线数
-
地址总线、数据总线、控制总线3种总线数的总和
-
总线最主要性能指标为总线宽度、总线(工作)频率、总线带宽
-
总线带宽是指总线本身所能达到的最高传输效率,是衡量总线性能的重要指标
总线带宽 = 总线宽度 * 总线频率
-
-
课后习题
- 选择题:4、6、7、12、21、22、24、26、28、30
- 综合体:全没有
总线操作和定时
- 总线定时
- 总线在双方交换数据的过程中,需要时间上配合关系的控制
- 实质是一种协议或规则,主要有同步、异步两种基本定时方式
总线事务
- 从 请求总线到 完成总线使用的 操作序列称为 总线事务,它是在一个 总线周期中发生的一系列活动
请求阶段
- 主设备(CPU、DMA)发出 总线传输请求,并且获得 总线控制权
仲裁阶段
- 总线仲裁机构决定将下一个 传输周期的总线使用权授予某个申请者
寻址阶段
- 主设备通过总线给出要访问的从设备地址及 有关命令,启动 从模块
传输阶段
- 主模块和 从模块进行数据交换,可 单向或 双向进行数据传送
释放阶段
- 主模块的有关信息均从 系统总线上撤除,让出 总线使用权
- 在 总线事务的 传输阶段,主、从设备之间一般只能传输 一个字长的数据
- 突发(猝发)传送能够进行 连续成组数据的传送,其 寻址阶段发送的是 连续数据单元的 首地址,在 传输阶段传送多个 连续单元的数据,每个 时钟周期可以传送 一个字长的信息,但是 不释放总线,直到一组数据全部传送完毕后,再释放总线
同步定时方式
- 系统采用一个统一的时钟信号来协调发送和接收双方的传送定时关系。
- 时钟产生相等的时间间隔,每个间隔构成一个总线周期
- 在一个总线周期中,发送方和接收方可以进行一次数据传送
- 因为采用统一的时钟,每个部件或设备发送或接收信息都在固定的总线传送周期中,一个总线的传送周期结束,下一个总线的传送周期开始
- 优点是传送速度快、具有较高的传输速率、总线控制逻辑简单。缺点是主从设备属于强制性同步、不能及时进行数据通信的有效性检验,可靠性较差
- 同步通信适用于总线长度较短及总线所接部件的存取时间比较接近的系统
异步定时方式
-
没有统一的时钟,也没有固定的时间间隔,完全靠传送双方相互制约的握手信号来实现定时控制。
-
优点是总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间可靠地进行信息交换,自动适应时间的配合,缺点是比同步控制方式稍复杂一点,速度比同步定时方式慢
-
根据请求和回答信号的撤销是否互锁,异步定时方式又分为以下3种类型
-
不互锁方式
- 主设备发出请求信号后,不必等到接到从设备的回答信号,而是经过一段时间便撤销请求信号。而从设备在接到请求信号后,发出回答信号,并经过一段时间后自动撤销回答信号。
-
半互锁方式
- 主设备发出请求信号后,必须在接到从设备的回答信号后,才撤销请求信号。而从设备在接到请求信号后,发出回答信号,但不必等待获知主设备的请求信号已经撤销,而是隔一段时间后自动撤销回答信号
-
全互锁方式
- 主设备发出请求信号后,必须在从设备回答后才撤销请求信号;从设备发出回答信号后,必须在获知主设备请求信号已撤销后,再撤销其回答信号
-
课后习题
- 选择题:6、7
- 综合题:全没有
总结
- 引入总线结构有什么好处
- 简化了系统结构,便于系统设计制造
- 大大减少了连线数目,便于布线,减少体积,提高系统的可靠性
- 便于接口设计,所有与总线连接的设备均采用类似的接口
- 便于系统的扩充、更新、灵活配置,易于实现系统的模块化
- 便于设备的软件设计,所有接口的软件对不同的接口地址进行操作
- 便于故障诊断和维修,同时也能降低成本
- 引入总线会导致什么问题?如何解决?
- 总线上各个设备分时共享同一总线,当总线上多个设备同时要求使用总线时,就会导致总线冲突
- 为了解决多个主设备同时竞争总线控制权的问题,应当采用总线仲裁部件,以某种方式选择一个主设备优先获得总线控制权,只有获得了总线控制权的设备才能开始数据传送
- 同一个总线不能既采用同步方式又采用异步方式通信吗?
- 半同步通信总线可以
- 这类总线既保留了同步通信的特点,又能采用异步应答方式连接速度相差较大的设备。通过在异步总线中引入时钟信号,其就绪和应答等信号都在时钟的上升沿或下降沿有效,而不受其他时间的信号干扰
- 例如,某个采用半同步方式的总线总是从某个时钟开始,在每个时钟到来时,采样Wait信号,若无效,则说明数据未准备好,下个时钟到来时,再采样Wait信号,直到检测到有效,再去数据线上取数据。
- PCI总线也是一种半同步总线,它的所有事件都在时钟下降沿同步,总线设备在时钟开始的上升沿采样总线信号
- 一个总线在某一时刻可以有多对主从设备进行通信吗?
- 不可以
- 在某个总线周期内,总线上只有一个主设备控制总线,选择一个从设备与之进行通信(即一对一关系),或对所有设备进行广播通信(即一对多的关系)。所以一个总线在某一时刻不能有多对主从设备进行通信,否则会发生数据冲突。
输入/输出系统
I/O接口
I/O接口(I/O控制器)是主机和外设之间的交接界面,通过接口可以实现主机和外设之间的信息交换
I/O接口的功能
- 实现主机和外设的通信联络控制。解决主机与外设时序配合问题,协调不同工作速度的外设和主机之间交换信息,以保证整个计算机系统能统一、协调地工作
- 进行地址译码和设备选择。CPU送来选择外设的地址码后,接口必须对地址进行译码以产生设备选择信息,使主机能和指定外设交换信息
- 实现数据缓冲。CPU与外设之间的速度往往不匹配,为消除速度差异,接口必须设置数据缓冲寄存器,用于数据的暂存,以避免因速度不一致而丢失数据
- 信号格式的转换。外设与主机两者的电平、数据格式都可能存在差异,接口应提供计算机与外设的信号格式的转换功能
- 如电平转换、并/串、串/并转换、模/数、数/模转换等
- 传送控制命令和状态信息**。CPU要启动某一外设时,通过接口中的命令寄存器向外设发出启动命令;外设准备就绪时,则将准备好状态信息送回接口中的状态寄存器,并反馈给CPU。外设向CPU提出中断请求时,CPU也应有相应的响应信号反馈给外设
I/O接口的基本结构
-
I/O接口在主机侧通过I/O总线与内存、CPU相连。通过数据总线,在数据缓冲寄存器与内存或CPU的寄存器之间进行数据传送。同时接口和设备的状态信息被记录在状态寄存器中,通过数据线将状态信息送到CPU。CPU对外设的控制命令也通过数据线传送,一般将其送到I/O接口的控制寄存器。状态寄存器和控制寄存器在传送方向上是相反的
-
接口中的地址线用于给出要访问的I/O接口中的寄存器的地址,它和读写控制信号一起被送到I/O接口的控制逻辑部件,其中地址信息用以选择和主机交换信息的寄存器,通过控制线传送来的读/写信号确认是读寄存器还是写寄存器,此外控制线还会传送一些仲裁信号和握手信号
-
接口中的I/O控制逻辑还要能对控制寄存器中的命令字进行译码,并将译码得到的控制信号通过外设界面控制逻辑送到外设,同时将数据缓冲寄存器的数据发送到外设或从外设接收数据到数据缓冲寄存器。另外,它还要具有收集外设状态到状态寄存器的功能。
-
对数据缓冲寄存器、状态/控制寄存器的访问操作是通过相应的指令来完成的,通常称这类指令为I/O指令,只能在操作系统内核的底层I/O软件中使用,是一种特权指令
接口和端口是两个不同的概念,端口是接口电路中可以进行读写的寄存器,若干端口加上相应的控制逻辑才可以组成接口
I/O接口的类型
-
按 数据传送方式可分为 并行接口(一字节或一个字的所有位同时传送)和 串行接口(一位位传送),接口要完成 数据格式的转换
这里说的 数据传送方式指的是 外设和接口一侧的传送方式
-
按主机访问I/O设备的控制方式可分为程序查询接口、中断接口、DMA接口
-
按功能选择的灵活性可分为可编程接口和不可编程接口
I/O端口及其编址
-
I/O端口是指接口电路中可被CPU直接访问的寄存器,主要有数据端口、状态端口、控制端口,端口加上相应的控制逻辑电路组成接口
通常,CPU能对数据端口进行读写操作,但对状态端口只能读操作,对控制端口只能写操作
-
I/O端口的编址方式有与存储器统一编址和独立编址两种
统一编址
(存储器映射方式)- 把I/O端口当作存储器的单元进行地址分配,这种方式CPU不需要设置专门的I/O指令,用统一的访存指令就可以访问I/O端口
- 优点是不需要专门的输入/输出指令,可使CPU访问I/O的操作更灵活,还可使端口有较大的编址空间。缺点是端口占用存储器地址,使内存容量变小,而且利用存储器编址的I/O设备进行数据输入/输出操作,执行速度较慢
独立编址
(I/O映射方式)- I/O端口的地址空间与主存地址空间是两个独立的地址空间,因而无法从地址码的形式上区分,需要设置专门的I/O指令来访问I/O端口
- 优点是:输入/输出指令与存储器指令有明显区别,程序编制清晰,便于理解。缺点是:输入/输出指令少,一般只能对端口进行传送操作,尤其需要CPU提供存储器读写、I/O设备读写两组控制信号,增加了控制的复杂性
课后习题
- 选择题:9、11、12
I/O方式
输入/输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,常用的有程序查询、程序中断、DMA、通道等,前两种方式更依赖于CPU中程序指令的执行
程序查询方式
-
信息交换的控制完全由CPU执行程序实现,程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(动态端口)。主机进行I/O操作时,先发出询问信号,读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待
-
程序查询方式的工作流程如下
- CPU执行初始化程序,并预置传送参数
- 向I/O接口发出命令字,启动I/O设备
- 从外设接口读取其状态信息
- CPU不断查询I/O设备状态,直到外设准备就绪
- 传送一次数据
- 修改地址和计数器参数
- 判断传送是否结束,若未结束转第3步,直到计数器为0
-
在这种控制方式下,CPU一旦启动I/O,就必须停止现行程序的运行,并在现行程序中插入一段程序。程序查询的主要特点是CPU有踏步等待现象,CPU与I/O串行工作。这种方式的接口设计简单、设备量少,但CPU在信息传送过程中要花费很多时间来查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低
程序中断方式
-
中断的基本概念
-
指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂停中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序
-
作用
- 实现CPU与I/O设备的并行工作
- 处理硬件故障和软件错误
- 实现人机交互,用户干预机器需要用到中断系统
- 实现多道程序、分时操作,多道程序的切换需借助于中断系统
- 实时处理需要借助中断系统来实现快速响应
- 实现应用程序和操作系统(管态程序)的切换,称为软中断
- 多处理器系统中各处理器之间的信息交流和任务切换
-
思想
-
CPU在程序中安排好某个时刻启动某台外设,然后CPU继续执行原来的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU返回原来的程序
-
-
-
程序中断方式工作流程
-
中断请求
- 中断源是请求CPU中断的设备或事件,一台计算机有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。为记录中断时间并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR,当其状态为**“1”时,表示中断源有请求。这些触发器组成可中断请求标记寄存器**,该寄存器可集中在CPU中,也可分散在各个中断源中
- 内中断皆为不可屏蔽中断。通过INTR信号线发出的外中断是可屏蔽中断,在关中断(IF=1)的情况下不会被响应;而通过NMI信号发出的是不可屏蔽中断,即使在**关中断(IF=0)**的情况下也会被响应。不可屏蔽中断到的处理优先级最高,任何时候只要发生不可屏蔽中断,都要终止现行程序的执行,转到不可屏蔽中断处理程序执行
-
中断判优
-
中断系统在任一瞬间只能响应一个中断源的请求。由于许多中断源提出中断请求的时间都是随机的,因此当多个中断源同时提出请求时,需通过中断判优逻辑确定响应哪个中断源的请求
- 例如故障中断的优先级别较高,然后是I/O中断
-
中断判优既可以用硬件实现,又可用软件实现。硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,又可以分散在各个中断源中,软件实现是通过查询程序实现的
-
一般来说
- 不可屏蔽中断 > 内部异常 > 可屏蔽中断
- 内部异常中,硬件故障 > 软件中断
- DMA中断请求 > I/O设备传送中的中断请求
- I/O传送类中断请求中,高速设备 > 低速设备,输入设备 > 输出设备,实时设备 > 普通设备
中断优先级包括 响应优先级和 处理优先级,响应优先级在硬件线路上是 固定的,不便改动。处理优先级可利用 中断屏蔽技术动态调整,以实现 多重中断
-
-
CPU响应中断的条件
-
CPU在满足一定的条件下响应中断源发出的中断请求,并经过一些特定的操作,转去执行中断服务程序。CPU响应中断必须满足以下3个条件
- 中断源有中断请求
- CPU允许中断和开中断
- 一条指令执行完毕,且没有更紧迫的任务
I/O设备的就绪时间是随机的,而CPU在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻,这里说的中断仅指外中断,内中断不属于此类情况
-
-
中断响应
- CPU响应中断后,经过某些操作,转去执行中断服务程序。这些操作是由硬件直接实现的,我们称它为中断隐指令。中断隐指令并不是指令系统的一条真正的指令,它没有操作码,所以中断隐指令是一种不允许也不可能为用户使用的特殊指令,它所完成的操作如下
关中断
- CPU响应中断后,首先要保护程序的断点和现场信息,在保护断点和现场的过程中,CPU不能响应更高级中断源的中断请求
保存断点
- 为保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(指令无法直接读取的PC和PSWR等的内容)保存起来
引出中断服务程序
- 实质是取出中断服务程序的入口地址并传送给程序计数器(PC)
- CPU响应中断后,经过某些操作,转去执行中断服务程序。这些操作是由硬件直接实现的,我们称它为中断隐指令。中断隐指令并不是指令系统的一条真正的指令,它没有操作码,所以中断隐指令是一种不允许也不可能为用户使用的特殊指令,它所完成的操作如下
-
中断向量
-
每个中断都有一个类型号,每个中断类型号都对应一个中断服务程序,每个中断服务程序都有一个入口地址,CPU必须找到入口地址,即中断向量,把系统中的全部中断向量集中存放到存储器的某个区域内,这个存放中断向量的存储区就称为中断向量表。
-
CPU响应中断后,中断硬件会自动将中断向量地址传送到CPU,由CPU实现程序的切换,这种方法称为中断向量法,采用该方法的中断称为中断向量
中断向量是中断服务程序的入口地址,中断向量地址是指中断服务程序的入口地址的地址
-
-
中断处理过程
-
中断处理流程如下
-
关中断
- 在保护断点、现场期间不能被新的中断所打断,必须关中断。否则,若断点或现场保存不完整,在中断服务程序结束后,就不能正确地恢复并继续执行现行程序
-
保存断点
- 断点可以压入堆栈,也可以存入主存的特定单元中
-
引出中断服务程序
-
通常有两种方法寻址中断服务程序的入口地址
硬件向量法
- 通过硬件产生中断向量地址,再由中断向量地址找到中断服务程序的入口地址
软件查询法
- 用软件编程的办法寻找入口地址
硬件产生的实际上是中断类型号,而中断类型号指出了中断向量存放的地址,因此能产生中断向量地址
-
-
保存现场和屏蔽字
-
进入中断服务程序后首先要保存现场、中断屏蔽字,现场信息是指用户可见的工作寄存器的内容,它存放着程序执行到断点处的现行值
现场和断点,这两类信息都不能被中断服务程序破坏。现场信息因为用指令可直接访问,所以通常在中断服务程序中通过指令把它们保存到栈中,即由软件实现;而断点信息由CPU在中断响应开始时自动保存到栈或专门的寄存器中,即由硬件实现
-
-
开中断
- 允许更高级中断请求得到响应,实现中断嵌套
-
执行中断服务程序
- 这是中断请求的目的
-
关中断
- 保证在恢复现场和屏蔽字时不被中断
-
恢复现场和屏蔽字
- 将现场和屏蔽字恢复到原来的状态
-
开中断、中断返回
- 中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序
-
-
13**在CPU进入中断周期后,由**中断隐指令(硬件自动)**完成。**49由中断服务程序完成
恢复现场是指在中断返回前,必须将寄存器的内容恢复到中断处理前的状态,这部分工作由中断服务程序完成。中断返回由中断服务程序的最后一条中断返回指令完成
-
-
-
多重中断和中断屏蔽技术
-
若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断。若CPU暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套
-
中断屏蔽技术主要用于多重中断。CPU要具备多重中断的功能,必须满足下列条件
- 在中断服务程序中提前设置开中断指令
- 优先级别高的中断源有权中断优先级别低的中断源
-
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有的屏蔽触发器组合在一起便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字
-
DMA方式(Direct Memory Access,直接存储器访问)
-
DMA方式是一种完全由硬件进行成组信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条直接数据通道,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。由于数据传送不经过CPU,也就不需要保护、恢复CPU现场等烦琐操作
-
这种方式适用于磁盘机、磁带机等高速设备大批量数据的传送,它的硬件开销比较大。在DMA方式中,中断的作用仅限于故障和正常传送结束时的处理。
-
主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。
-
DMA方式的特点
- 它使主存和CPU的固定联系脱钩,主存既可被CPU访问,又可被外设访问
- 在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现
- 主存中要开辟专用缓冲区,及时供给和接收外设的数据
- DMA传送速度快,CPU和外设并行工作,提高了系统效率
- DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理
-
DMA控制器的组成
- DMA方式中,对数据传送过程进行控制的硬件称为DMA控制器(DMA接口)。当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后将让出系统总线,由DMA控制器接管总线进行数据传送,主要功能如下
- 接受外设发出的DMA请求,并向CPU发出总线请求
- CPU响应此总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期
- 确定传送数据的主存单元地址及长度,并自动修改主存地址计数和传送长度计数
- 规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作
- 向CPU报告DMA报告操作的结束
- 在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线、控制总线,CPU的主存控制信号被禁止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。由此可见,DMA控制器必须具有控制系统总线的能力
- DMA的结构
主存地址计数器
- 存放要交换数据的主存地址
传送长度计数器
- 记录传送数据的长度,计数溢出时,数据即传送完毕,自动发中断请求信号
数据缓冲寄存器
- 暂存每次传送的数据
DMA请求触发器
- 每当I/O设备准备好数据后,给出一个控制信号,使DMA请求触发器置位
控制/状态逻辑
- 由控制和时序电路、状态标志组成,用于指定传送方向,修改传送参数,并对DMA请求信号和CPU响应信号进行协调和同步
中断机构
- 当一个数据块传送完毕后触发中断机构,向CPU提出中断请求
- DMA方式中,对数据传送过程进行控制的硬件称为DMA控制器(DMA接口)。当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,CPU响应之后将让出系统总线,由DMA控制器接管总线进行数据传送,主要功能如下
-
主存和I/O设备之间交换信息时,不通过CPU。但当I/O设备和CPU同时访问主存时,可能发生冲突,为了有效地使用主存,DMA控制器与CPU通常采用3种方式使用主存
-
DMA的传送方式
停止CPU访存
- 当I/O设备有DMA请求时,由DMA控制器向CPU发送一个停止信号,使CPU脱离总线,停止访问主存,直到DMA传送一块数据结束。数据传送结束后,DMA控制器通知CPU可以使用主存,并把总线控制权交还给CPU
周期挪用
(或周期窃取)- 当I/O设备由DMA请求时,会遇到3种情况
- 此时CPU不在访存(如CPU正在执行乘法指令),因此I/O的方寸请求与CPU未发生冲突
- CPU正在访存,此时必须待存取周期结束后,CPU再将总线占有权让出
- I/O和CPU同时请求访存,出现访存冲突,此时CPU要暂时放弃总线占有权。I/O访存优先级高于CPU访存,因为I/O不立即访存就可能丢失数据,此时由I/O设备挪用一个或几个存取周期,传送完一个数据后立即释放总线,是一种单字传送方式
- 当I/O设备由DMA请求时,会遇到3种情况
DMA与CPU交替访存
- 这种方式适用于CPU的工作周期比主存存取周期长的情况。
- 例如,若CPU的工作周期是1.2us,主存的存取周期小于0.6us,则可将一个CPU周期分为 C 1 和 C 2 C_1和C_2 C1和C2两个周期,其中 C 1 C_1 C1专供DMA访存, C 2 C_2 C2专供CPU访存。这种方式不需要总线使用权的申请、建立、归还过程。总线使用权是通过 C 1 和 C 2 C_1和C_2 C1和C2分时控制的
- 这种方式适用于CPU的工作周期比主存存取周期长的情况。
-
DMA的传送过程
-
预处理
- 由CPU完成一些必要的准备工作
- CPU执行几条I/O指令,用以测试I/O设备状态,向DMA控制器的有关寄存器置初值、设置传送方向、启动该设备等
- CPU继续执行原来的程序,直到I/O设备准备好发送的数据(输入情况)或接收的数据(输出情况)时,I/O设备向DMA控制器发送DMA请求,再由DMA控制器向CPU发送总线请求(有时将这两个过程统称为DMA请求),用以传输数据
- 由CPU完成一些必要的准备工作
-
数据传送
- DMA的数据传输可以以单字节(或字)为基本单位,也可以以数据块为基本单位。对于以数据块为单位的传送(如硬盘),DMA占用总线后的数据输入和输出操作都是通过循环来实现的。需要指出的是,这一循环也是由DMA控制器(而非通过CPU执行程序)实现的,即数据传送阶段完全由DMA(硬件)控制
-
后处理
- DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理,包括校验送入主存的数据是否正确、测试传送过程中是否出错(错误则转入诊断程序)及决定是否继续使用DMA传送其他数据块等
-
-
DMA方式和中断方式的区别
- 中断方式是程序的切换,需要保护和恢复现场;DMA方式除了预处理和后处理,其他时候不占用CPU的任何资源
- 对中断请求的响应只能发生在每条指令执行完毕时(即指令的执行周期后);而对DMA请求的响应可以发生在每个机器周期结束时(在取指周期、间址周期、执行周期后均可),只要CPU不占用总线就可被响应
- 中断传送过程需要CPU的干预;而DMA传送过程不需要CPU的干预,因此数据传输率非常高,适合于高速外设的成组数据传送
- DMA请求的优先级高于中断请求
- 中断方式具有对异常事件的处理能力,而DMA方式仅局限于传送数据块的I/O操作
- 从数据传送来看,中断方式靠程序传送,DMA方式靠硬件传送
课后习题
- 选择题:全没有
- 综合题:全没有
总结
-
I/O设备有哪些编址方式?各有何特点?
统一编址
- 在主存地址中划出一定的范围作为I/O地址,以便通过访存指令即可实现对I/O的访问,但主存的容量相应减少。
独立编址
- 指I/O地址和主存是分开的,I/O地址不占主存空间,但访存需专门的I/O指令
-
CPU响应中断应具备哪些条件?
- 在CPU内部设置的中断屏蔽触发器必须是开放的
- 外设有中断请求时,中断请求触发器必须处于1状态,保持中断请求信号
- 外设(接口)中断允许触发器必须为1,这样才能把外设中断请求送至CPU。
- 具备上述3个条件,CPU在现行指令结束的最后一个状态周期响应中断
-
中断响应优先级和中断处理优先级分别指什么?
- 中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变;而中断处理优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理优先级低(屏蔽位为0,对新中断开放),若是,则中止正在处理的中断,转到新中断去处理,处理完后再回到刚才被中止的中断继续处理。
-
向量中断、中断向量、向量地址三个概念是什么关系?
中断向量
- 每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表
向量地址
- 中断向量表或中断向量跳转表中每个表项所在的内存地址或表项的索引值,称为向量地址或中断类型号
向量中断
- 一种识别中断源的技术或方式。识别中断源的目的是找到中断源对应的中断服务程序的入口地址的地址,即获得向量地址
-
程序中断和调用子程序有何区别
-
两者的根据区别主要表现在服务时间和服务对象上不一样
-
调用子程序过程发生的时间是已知的和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的、固定的。而中断过程发生的时间一般是随机的,CPU在执行某个主程序时收到中断源提出的中断申请,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的。也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的。
-
子程序完全为主程序服务,两者属于主从关系。主程序需要子程序时就去调子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序二者一般是无关的,不存在谁为谁服务的问题,两者是平行关系
-
主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路;而中断处理系统是一个软/硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程
-
子程序嵌套可实现若干级,嵌套的最多级数受计算机内存开辟的堆栈大小限制;而中断嵌套级数主要由中断优先级来决定,一般优先级数不会很大
从宏观上看,虽然程序中断方式克服了程序查询方式中的CPU踏步现象,实现了CPU与I/O并行工作,提高了CPU的资源利用率,但从微观操作分析,CPU在处理中断服务程序时,仍需暂停原程序的正常运行,尤其是当高速I/O设备或辅助存储器频繁地、成批地与主存交换信息时,需要不断打断CPU执行现场,而执行中断服务程序。
-
-
I/O指令和通道指令有何区别
I/O指令
- CPU指令系统的一部分,是CPU用来控制输入/输出操作的指令,由CPU译码后执行。在具有通道结构的机器中,I/O指令不实现I/O数据传送,主要完成启/停I/O设备,查询通道和I/O设备的状态,及控制通道进行其他一些操作等
通道指令
- 通道指令是通道本身的指令,用来执行I/O操作,如读、写、磁带走带、磁盘寻道等操作。