赞
踩
早期的冯诺依曼机
存储程序的思想奠定了现代计算机的基本结构,以此概念为基础的各类计算机通称为冯诺依曼机
特点如下
计算机硬件系统由运算器、存储器、控制器、输入设备、输出设备5大部件组成
指令和数据以同等地位存储在存储器中,并可按地址寻访
指令和数据均用二进制代码表示
指令由操作码和地址码组成
指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下可根据运算结果或根据设定的条件改变执行顺序
早期的冯诺依曼机以运算器为中心,输入/输出设备通过运算器与存储器传送数据
现在计算机的组织结构
计算机的功能部件
输入设备
输出设备
存储器
用来存放程序和数据
组成
MAR (Memory Address Register) 地址寄存器
MAR与MDR虽然是存储器的一部分,但在现代CPU中却是存在于CPU中的,另外,高速缓存Cache也一样
MDR (Memory Data Register) 数据寄存器
时许控制器
控制器
冯诺依曼模型机
CPU和主存之间通过一组总线相连,总线中有地址、控制、数据3组信号线
系统软件和应用软件
系统软件
应用软件
数据库管理系统(DBMS)和数据库系统(DBS)是有区别的
- DBMS是系统软件,位于用户和操作系统之间的一层数据管理软件
- DBS是系统,不是系统软件,由数据库、数据库管理系统、数据库管理员、应用系统构成
三个级别的语言
机器语言
汇编语言
高级语言
翻译程序
计算机的工作过程分为如下三个步骤
从源程序到可执行文件
预处理
编译
汇编
链接
指令执行过程的描述
第一条指令置于PC中,根据PC取出第一条指令
经过译码、执行步骤,完成这条指令的功能,并计算下一条指令的地址
举例取数指令的执行过程
取指令
分析指令
执行指令
(PC)指程序计数器PC中存放的内容。PC->MAR应理解为**(PC)->MAR**,即程序计数器中的值经过数据通路送到MAR,即表示数据通路时括号可省略(因为指示表示数据流经的途径,而不强调数据本身的流动)。但运算时括号不能省略,即**(PC)+1->PC不能写为PC+1->PC**
用新的到的指令地址,继续读出第二条指令并执行,直到程序结束为止
微程序机器层
传统机器语言层
操作系统层
汇编语言层
高级语言层
字长
数据通路带宽
主存容量
- MAR为16位,表示有 2 16 = 65536 2^{16}=65536 216=65536个存储单元,可称为64K内存
- MDR为32位,表示每个存储单元有32个存储元件,即32个二进制位
- 所以存储容量为 64K*32位运算速度
运算速度
吞吐量和响应时间
吞吐量
响应时间
主频和CPU时钟周期
CPU时钟周期
主频
(CPU时钟频率)
CPI (Clock cycle Per Instruction)
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
时钟周期
MIPS (Million Instructions Per Second)
MFLOPS (Mega Floating-point Operations Per Second)
GFLOPS (Giga Floating-point Operations Per Second)
TFLOPS (Tera Floating-point Operations Per Second)
基准程序 (Benchmarks)
系列机
兼容
软件可移植性
固件
主频高的CPU一定比主频低的CPU快吗?
在描述存储容量、文件大小等时,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的次方值表
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
八进制
十六进制
真值和机器数
进制转换
二进制转八进制、十六进制
八进制、十六进制转二进制
任意进制转十进制
保底法
按权展开相加法
十进制转任意进制
除基取余法
,小数部分用乘基取整法
,最后将整数部分和小数部分的转换结果拼接起来除基取余法
商为0
时结束。乘基取整法
计算机中,整数可以连续表示,但小数是离散的,所以并不是每个小数都可以准确地用二进制表示
在现代计算机中,通常用定点补码整数表示整数,用定点原码小数表示浮点数的尾数部分,用移码表示浮点数的阶码部分
真值零的原码表示有 正零 和 负零 两种形式
原码表示的优点是与真值的对应关系简单、直观,与真值的转换简单,并且用原码实现乘除运算比较简便。缺点是0的表示不唯一,更重要的是原码加减运算比较复杂
变形补码(模4补码)
补码与真值转换 (仅负数)
移码表示法
常用来表示浮点数的阶码,只能表示整数
移码就是在真值X上加上一个常数(偏置值),通常这个常数取 2 n 2^n 2n,相当于X在数轴上向正方向偏移了若干单位
特点
移码中的零表示唯一
一个真值的移码和补码仅差一个符号位,补码符号位取反就是移码
移码全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到二进制最大值 |
算术移位
正数
负数
(负数左移是变小一倍,右移是变大一倍),推算时,用实例举证,如**-4**
原码
补码
反码
逻辑移位
补码的加减法运算(设机器字长为n+1)
溢出判别方法
采用一位符号位
采用双符号位
(模4补码)
采用一位符号位,根据数据位的进位情况
判断溢出
乘法运算由累加、右移操作实现,可分为原码一位乘法和补码一位乘法
原码一位乘法
符号位与数值位分开求,乘积符号由两个数的符号位异或
形成,数值部分则是两个数的绝对值相乘之积
由竖式乘法运算演变而来
补码一位乘法
(Booth算法)
有符号数的乘法,采用相加、相减操作计算补码数据的乘积
booth算法本质
0的存在,可以降低运算次数,因为0和任何数相乘都为0,就无需再计算
定点数的除法运算
符号扩展
算术运算中,有时必须把带符号的定点数转换成具有不同位数的表示形式
正数
负数
原码
补码
原码除法
(不恢复余数法、原码加减交替除法)
补码除法
(加减交替法)
数据存储的 大端方式 VS 小端方式
大端方式
小端方式
(地址存放数据从右到左)
举例
数据按 边界对齐 方式存储
对于机器字长为32位的计算机,数据以边界对齐方式存放,半字地址一定是2的整数倍,字地址一定是4的整数倍。所存储的数据不满足上述要求时,通过填充空白字节使其符合要求。这样无论所取的数据是字节、半字还是字,均可一次访存取出,提高取指令和取数的速度。
边界对齐是一种空间换时间的思想。RISC如 ARM 采用边界对齐,而CISC如 x86 对齐和不对齐都支持,因为对齐方式取指令时间相同,因此能适应指令流水。
阶码 控制 小数点的位置,阶码每加一,整个数值增大到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
阶码的值表示浮点数的小数点的实际位置,位数反映浮点数的表示范围
尾数的位数反映浮点数的精度
浮点数的表示范围
原码是关于原点对称的,所以浮点数的范围也是关于原点对称的
![image-20220928195322114](https://img-blog.csdnimg.cn/img_convert/a987e34ca43fa9bd5d828a29f5f65448.png)
规格化浮点数
尾数的位数决定浮点数的有效数位,有效数位越多,数据的精度越高。为了在浮点数运算过程中,尽可能多的保留有效数字的位数,使有效数字尽量占满尾数数位,必须在运算过程中对浮点数进行规格化操作
通过调整一个 非规格化浮点数 的 尾数、阶码 的大小,使非零的浮点数在 尾数的最高数位上保证是一个有效值。
原码表示的规格化尾数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
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标准,不是普通浮点数标准
| 类型 | 数符 | 阶码 | 尾数数值 | 总位数 | (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 |
![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]
对阶
尾数求和
规格化
右规
左规
舍入
0舍1入法
恒置1法
截断法
溢出判断
(浮点数的溢出判断,是根据指数溢出来判断的,而非尾数溢出,尾数溢出就右规即可)
字 VS 字节 VS 位
用移码表示浮点数的阶码有什么好处?
浮点数进行加减运算时,时常要比较阶码的大小,相对于原码和补码,移码比较大小更方便
移码是补码的符号位取反,通过取反这个动作,把负数符号位变成0,正数符号位变成1,相当于所有位都当做数值位直接进行比较即可,比原码补码用1表示负数符号位要方便很多
校验移码的特殊值(0和max)时比较容易。阶码以移码编码时的特殊值如下。
计算机中的数值数据都是二进制数吗?
C语言中的int型和unsigned型变量的存储方式没有区别,都按照补码的形式存储,在不溢出范围内的加减法运算也是相同的,只是int型变量的最高位代表符号位,而unsigned型中的最高位表示数值位,两者在C语言中的区别体现在输出时到底是采用**%d还是%u**。
什么是无符号整数的溢出?
如何判断一个浮点数是否是规格化数?
为了使浮点数能尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。规格化浮点数的尾数小数点后的第一位一定是个非零数。
原码编码的尾数,看尾数的第一位是否为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 |
小数没有移码定义,所以上表没有移码定点小数
按在**计算机中的作用(层次)**分类
主存储器(主存、内存
)
辅助存储器(辅存、外存
)
高速缓冲存储器(Cache
)
按存储介质分类
磁盘
、磁带
)MOS型存储器
、双级型存储器
)光盘
)按存取方式分类
随机存储器(RAM)
只读存储器(ROM)
内容只能随机读出而不能写入。信息一旦写入存储器就固定不变,即使断电,内容也不会丢失。因此,通常用它存放固定不变的程序、常数和汉字字库等。
与随机存储器可共同作为主存的一部分,统一构成主存的地址域。
由ROM派生出的存储器也包含可反复重写的类型,ROM和RAM的存取方式均为随机存取。
注意广义上的只读存储器已可通过电擦除等方式进行写入,其“只读”的概念没有保留,但仍保留了断电内容保留、随机读取特性,但其写入速度比读取速度慢得多。
串行访问存储器
按信息的可保存性分类
易失性存储器
断电后,存储信息即消失的存储器,如RAM。
非易失性存储器
断电后信息仍保持的存储器,如ROM、磁表面存储器和光存储器。
若某个存储单元所存储的信息被读出时,原存储信息被破坏,则称为破坏性读出;若读出时,被读单元原存储信息不被破坏,则称为非破坏性读出。具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息。
存储容量 = 存储字数 * 字长,如1M*8位。1B(Byte,字节) = 8b(bit,位)。存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量
单位成本:每位价格 = 总成本 / 总容量
存储速度:数据传输率 = 数据的宽度 / 存储周期
存取时间不等于存储周期,通常存储周期大于存取时间。因为对任何一种存储器,在读写操作之后,总要有一段恢复内部状态的复原时间。对于破坏性读出的存储器,存取周期往往比存取时间大得多,甚至可达 T m = 2 T a T_m = 2T_a Tm=2Ta,因此存储器中的信息读出后需要马上进行再生。
实际上,存储系统层次结构主要体现在Cache-主存层次和主存-辅存层次
主要思想:上一层的存储器作为低一层存储器的高速缓存。在Cache-主存和主存-辅存层次中,上一层中的内容都只是下一层中的内容的副本,也即Cache(或主存)中的内容只是主存(或辅存)中的内容的一部分。
主存和Cache之间的数据调动是由硬件自动完成的,对所有程序员均是透明的;而主存和辅存之间的数据调动则是由硬件和操作系统共同完成的,对应用程序员是透明的。
在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统,在这个系统中程序员编程的地址范围与虚拟存储器的地址空间相对应。对具有虚拟存储器的计算机系统而言,编程时可用的地址空间远大于主存空间。
主存储器由DRAM(Dynamic Random Access Memory)实现,靠处理器的那一层(Cache)则由SRAM(Static Random Access Memory)实现,它们都属于易失性存储器,主要电源被切断,原来保存的信息便会丢失。DRAM相较于SRAM,价格低,速度慢。
SRAM只要保持通电,里面存储的数据就可以恒常保持
DRAM每隔一段时间,要刷新充电一次,否则内部的数据即会消失。
SRAM主要用于二级高速缓存(Level2 Cache)
DRAM主要用于大容量主存系统
SRAM的工作原理
DRAM的工作原理
动态随机存储器(DRAM)比SRAM的密度要高很多。DRAM采用地址复用技术,地址线是原来的1/2,地址信号分行、列两次传送。
DRAM电容上的电荷一般只能维持1~2ms,因此即使电源不断电,信息也会自动消失。为此,每隔一定时间必须刷新,通常取2ms,称为刷新周期。常用的刷新方式有3种:
集中刷新
指在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读写操作,称为死时间,又称访存死区。
优点:读写操作时,不受刷新工作的影响(读写操作时避开刷新期间)
缺点:在集中刷新期间(死区)不能访问存储器
分散刷新
把对每行的刷新分散到各个工作周期中。这样,一个存储器的系统工作周期分为两部分:前半部分用于正常读、写或保持;后半部分用于刷新。
优点:没有死区
缺点:加长了系统的存取周期,降低了整机的速度
异步刷新
前两种方法的结合,既可缩短“死时间”,又能充分利用最大刷新间隔为2ms的特点。具体做法是:将刷新周期除以行数,得到两次刷新操作之间的时间间隔t,利用逻辑电路每隔时间t产生一次刷新请求。这样可以避免使CPU连续等待过长的时间,而且减少了刷新次数,从根本上提高了整机的工作效率
DRAM的刷新需注意以下问题:
存储器芯片的内部结构
存储器芯片由存储体、I/O读写电路、地址译码和控制电路等部分组成。
存储器的读、写周期
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类型
根据制造工艺不同,ROM可分为以下几种
掩模式只读存储器
(MROM)
一次可编程只读存储器
(PROM)
可擦除可编程只读存储器
(EPROM)
闪速存储器
(Flash Memory)
固态硬盘
(Solid State Drives,SSD)
如下为主存储器(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位。
一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率,有以下分类
单体多字存储器
多体并行存储器
由多体模块组成。每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作,如下分两类
高位交叉编址
(顺序方式)
低位交叉编址
(交叉方式)
CPU的速度比存储器的快,若同时从存储器中取出n条指令,就可充分利用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作为字选线,用于片内寻址。
优点是:不需要地址译码器,线路简单
缺点是:地址空间不连续,选片的地址线必须分时为低电平(否则不能工作),不能充分利用系统的存储器空间,造成地址资源的浪费
译码片选法
合理选择存储芯片
要组成一个主存系统,选择存储芯片是第一步,主要指存储芯片的类型(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访问存储器的速度,可以采用双端口存储器、多模块存储器等技术,它们同属并行技术,前者为空间并行,后者为时间并行。
指同一存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步地访问存储单元。
如下图,当两个端口的地址不相同时,在两个端口上进行读写操作一定不会发生冲突
两个端口同时存取存储器的同一地址单元时,会因数据冲突造成数据存储或读取错误。两个端口对同一主存操作有以下4种情况
解决方法:置**“忙”信号 B U S Y ‾ \rm \overline{BUSY} BUSY为0,由判断逻辑决定暂时关闭一个端口**(即被延时),未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。
为提高访存速度,常采用多模块存储器,常用的有单体多字存储器和多体低位交叉存储器。
CPU的速度比存储器的快,若同时从存储器中取出n条指令,就可充分利用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的流水线方式存取示意图如下
优点
缺点
磁盘存储器
组成
磁盘驱动器
磁盘控制器
盘片
磁头数
(Heads)
柱面数
(Cylinders)
扇区数
(Sectors)
磁记录原理
原理
编码方法
磁记录方式
磁盘的性能指标
记录密度
磁盘的容量
平均存取时间
数据传输率
磁盘地址
主机向磁盘控制器发送寻址信息,磁盘的地址一般如下
硬盘的工作过程
磁盘阵列
由于程序的转移概率不会很低,数据分布的离散性较大,所以单纯依靠并行主存系统提高主存系统的频宽是有限的。这就必须从系统结构上进行改进,即采用存储体系。通常将存储系统分为**“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行需要一个有效位。
地址映射的方法共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访存过程如下图
全相联映射
全相联映射的地址结构
组相联映射
将Cache空间分成大小相同的组,主存的一个数据块可以装入一组内的任何一个位置,即组间采取直接映射,而组内采取全相联映射
假设每组有r个Cache行,则称之为r路组相联
组相联映射的关系可定义为
mod
Cache组数路数越大,即每组Cache行的数量越大,发生块冲突的概率越低,但相联比较电路也越复杂。选定适当的数量,可使组相联映射的成本接近直接映射,而性能上仍接近全相联映射。
组相联映射的地址结构
CPU访存过程
根据访存地址中间的组号找到对应的Cache组
将对应Cache组中每个行的标记与主存地址的高位标记进行比较
若有一个相等且有效位为1,则访问Cache命中。此时根据主存地址中的块内地址,在对应Cache行中存取信息
若都不相等或虽相等但有效位为0,则不命中,此时CPU从主存中读出该地址所在的一块信息送到对应Cache组的任意一个空闲行中,将有效位置1,并设置标记,同时将该地址中的内容送CPU
当Cache大小、主存块大小一定时
采用全相联映射或组相联映射方式时,从主存向Cache传送一个新块,当Cache或Cache组中的空间已被占满时,就需要使用替换算法置换Cache行。
采用直接映射时,一个给定的主存块只能放到唯一的固定Cache行中,所以在对应Cache行已有一个主存块的情况下,新的主存块毫无选择地把原先已有的那个主存块替换掉,因而无须考虑替换算法。
常用的替换算法有随机算法(RAND)、先进先出算法(FIFO)、近期最少使用算法(LRU,最常考查)和最不经常使用算法(LFU)
随机算法
先进先出算法
近期最少使用算法
依据程序访问的局部性原理,选择近期内长久未访问过的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行的计数值
右边数字是存放在该行中的主存块号。
计数器规则
抖动
最不经常使用算法
因为Cache中的内容是主存块副本,当对Cache中的内容进行更新时,就需选用写操作策略使Cache内容和主存内容保持一致。此时分两种情况
全写法
(写直通法,Write-Through)
当CPU对Cache写命中时,必须把数据同时写入Cache和主存。当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖即可
这种方法实现简单,能随时保持主存数据的正确性。缺点是增加了访存次数,降低了Cache的效率
写缓冲:为减少全写法直接写入主存的时间损耗,在Cache和主存之间加一个写缓冲(Write Buffer),如下图,CPU同时写数据到Cache和写缓冲中,写缓冲再控制将内容写入主存。写缓冲是一个FIFO队列,可以解决速度不匹配的问题。但若出现频繁写时,会使写缓冲饱和溢出。
回写法
(Write-Back)
全写法和写回法都对应于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存在,其访问速度大于主存,因此避免了因频繁写时造成的写缓冲饱和溢出。
主存和联机工作的辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量,提高了存储系统的性价比。
虚拟存储器将主存或辅存的地址空间统一编址,形成一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在乎实际的主存容量和程序在主存中实际的存放位置。
用户编程允许涉及的地址称为虚地址或逻辑地址,虚地址对应的存储空间称为虚拟空间或程序空间。实际的主存单元地址称为实地址或物理地址,实地址对应的是主存地址空间,也称实地址空间。
虚地址比实地址要大很多
CPU使用虚地址时,由辅助硬件找出虚地址和实地址之间的对应关系,并判断这个虚地址对应的存储单元内容是否已装入主存。
虚拟存储器也采用和Cache类似的技术,将辅存中经常访问的数据副本存放到主存中,但是缺页访问辅存的代价很大,因此虚拟存储机制采用全相联映射,每个虚页面可以存放到对应主存区域的任何一个空闲页位置。此外,当进行写操作时,不能每次写操作都同时写回磁盘,因而,在处理一致性问题时,采用回写法
以页为基本单位的虚拟存储器
虚拟空间和主存空间都被划分成同样大小的页,主存的页称为实页、页框,虚存的页称为虚页
把虚拟地址分为两个字段:虚页号和业内地址
页表
有效位也称装入位,用来表示对应页面是否在主存
脏位也称修改位,用来表示页面是否被修改过,虚拟机制中采用回写策略,利用脏位可判断替换时是否需要写回磁盘
引用位也称使用位,用来配合替换策略进行设置,例如是否**实现最先调入(FIFO位)或最近最少用(LRU位)**策略等。
CPU执行指令时,需要先将虚拟地址转为主存物理地址。每个进程都有一个页表基址寄存器,存放该进程的页表首地址,然后根据虚拟地址高位部分的虚拟页号找到对应的页表项
若装入位为1,则取出物理页号,和虚拟地址低位部分的页内地址拼接,形成实际物理地址
若装入位为0,则说明缺页,需要操作系统进行缺页处理。如下为地址变换过程
页式虚拟存储器
快表
(TLB,Translation Lookaside Buffer,转换检测缓冲区)
具有TLB和Cache的多级存储系统
如下图是一个具有TLB和Cache的多级存储系统,其中Cache采用二路组相联方式。CPU给出一个32位的虚拟地址,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,表示该段已不在主存中)。已调入主存时,从段表读出该段在主存中的起始地址,与段内地址(偏移量)相加,得到对应的主存实地址。
段式虚拟存储器的地址变换过程如下
段式虚拟存储器
相同之处
不同之处
相联存储器:基本原理是把存储单元所存内容的某一部分作为检索项(即关键字项)去检索该存储器,并将存储器中与、该检索项符合的存储单元内容进行读出或写入。所以它是按内容或地址进行寻址的,价格较为昂贵,一般用来制作TLB(Translation Lookaside Buffer,CPU的一种缓存,转译后备缓冲器/页表缓存/转址旁路缓存),相联Cache等。
易失性存储器和刷新的区别
易失性存储器是指断电后数据丢失,SRAM和DRAM都满足断电内容消失,但需要刷新的只有DRAM,而SRAM不需要刷新。
C S ‾ \rm \overline{CS} CS是片选信号, W E ‾ \rm \overline{WE} WE是读写控制信号。
存储器的层次结构主要体现在何处?为何要分这些层次?计算机如何管理这些层次?
存取周期和存取时间有何区别
存取时间仅为完成一次操作的时间
存取周期不仅包含操作时间,而且包含操作后线路的恢复时间,即
存取周期
=
存取时间
+
恢复时间
存取周期=存取时间+恢复时间
存取周期=存取时间+恢复时间
在虚拟存储器中,页面是设置得大一些好还是小一些好
存取时间就是存储周期吗?
不是
Cache行大小和命中率之间有什么关系
发生取指令Cache缺失的处理过程是什么
关于Cache的一些小知识
多级Cache
指令Cache和数据Cache
指令是指示计算机执行某种操作的命令。一台计算机所有指令的集合构成该机的指令系统,也称指令集。指令系统是计算机的主要属性,位于硬件和软件的交界面上
指令的基本格式
操作码+地址码
操作码指出指令中该指令应该执行什么性质的操作以及具有何种功能
操作码是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法等的关键信息
地址码给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等。
指令的长度是指一条指令中所包含的二进制代码的位数。指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长。
把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令。
一个指令系统中,若所有指令的长度都是相等的,则称为定长指令字结构。定字长指令的执行速度快,控制简单。若各种指令的长度随指令功能而异,则称为变长指令字结构。然而,因为主存一般是按字节编址的,所以指令字长多为字节的整数倍
根据指令中操作数地址码的数目的不同,可将指令分成以下几种格式
零地址指令
只给出操作码OP,没有显式地址。这种指令有两种可能
不需要操作数的指令,如空操作指令、停机指令、关中断指令等
零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈
一地址指令
有两种可能
只有目的操作数的单操作数指令,按 A 1 A_1 A1地址读取操作数,进行OP操作后,结果存回原地址。
隐含约定目的地址的双操作数指令,按指令地址 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
二地址指令
对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数还用于保存本次的运算结果。
指令含义: ( A 1 ) O P ( A 2 ) → A 1 (A_1)OP(A_2) \rightarrow A_1 (A1)OP(A2)→A1
三地址指令
若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为 2 8 = 256 2^8=256 28=256。若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)
四地址指令
若指令字长为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条指令
在设计扩展操作码指令格式时,必须注意以下两点
通常情况下,对使用频率较高的指令分配较短的操作码,对使用频率较低的指令分配较长的操作码,从而尽可能减少指令译码和分析的时间
数据传送
算术和逻辑运算
移位操作
转移操作
输入输出操作
这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。
课后习题
指令寻址
(寻找下一条将要执行的指令地址)
顺序寻址
跳跃寻址
通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序计数器给出,而由本条指令给出下条指令地址的计算方式。
是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过**程序计数器(PC)**给出
数据寻址
(寻找操作数的地址)
方式较多,为区别各种方式,通常在指令字中设一个字段,用来指明属于哪种寻址方式,由此可得指令的格式如下所示
隐含寻址
不明显给出操作数的地址,而在指令中隐含操作数的地址
优点是有利于缩短指令字长,缺点是需增加存储操作数或隐含地址的硬件
立即(数)寻址
地址字段指出的不是操作数的地址,而是操作数本身,又称立即数。下图中,**#**表示立即寻址特征,A就是操作数本身
数据采用补码形式存放
优点是指令在执行阶段不访问主存,指令执行时间最短,缺点是A的位数限制了立即数的范围
直接寻址
指令字中的形式地址A是操作数的真实地址EA,即EA=A,如下图
优点是简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址。缺点是A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
间接寻址
相对于直接寻址而言的,指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A),如下图
间接寻址可以是一次间接寻址,还可以是多次间接寻址。
如上图,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;主存字第一位为0时,表示取得的是操作数的地址。
间接寻址的优点是可扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可方便的完成子程序返回)。
间接寻址的缺点是指令在执行阶段要多次访存(一次间接寻址需两次访存,多次间接寻址需根据存储字的最高位确定访存次数)。由于访问速度过慢,这种寻址方式并不常用。
一般问到扩大寻址范围时,通常是寄存器间接寻址
寄存器寻址
寄存器间接寻址
在寄存器 R i R_i Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=( R i R_i Ri),如下图
相对寻址
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)的位数足以表示整个存储空间。
变址寻址与基址寻址的有效地址形成过程极为相似。但从本质上讲,两者有较大的区别。
基址寻址
变址寻址
堆栈寻址
硬堆栈
(寄存器堆栈)
软堆栈
寻址方式 | 有效地址 | 访存次数 |
---|---|---|
隐含寻址 | 程序指定 | 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 |
相关寄存器
x86处理器中有8个32位的通用寄存器,为了向后兼容,EAX、EBX、ECX和EDX的高两位字节和低两位字节可以独立使用,E为Extended,表示32位的寄存器
除了EBP和ESP外,其他几个寄存器的用途是比较任意的
汇编指令格式
一般有两种不同的汇编格式,AT&T和Intel,主要区别如下
由于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>
任意寄存器
<mem>
内存地址
<con>
常数
数据传送指令
算术和逻辑运算指令
x86中的指令机器码长度为1字节,对同一指令的不同用途有多种编码方式,比如mov指令就有28
种机内编码,用于不同操作数类型或用于特定寄存器
条件码
(标志位)
CF
:进位/借位标志。最近无符号整数加减运算后的进/借位情况。有进位/借位时,CF=1,否则CF=0ZF
:零标志。最近的操作的运算结果是否为0。若结果为0,ZF=1,否则ZF=0SF
:符号标志。最近的带符号数运算结果的符号。若为负,SF=1,否则SF=0OF
:溢出标志。最近的带符号数运算结果是否溢出。若溢出,OF=1,否则OF=0CISC和RISC的基本概念
CISC
(Complex Instruction Set Computer)
RISC
(Reduced Instruction Set Computer)
RISC相对于CISC的优点
CISC和RISC的对比
对比项目 | CISC | RISC |
---|---|---|
指令系统 | 复杂、庞大 | 简单、精简 |
指令数目 | 一般大于200条 | 一般小于100条 |
指令字长 | 不固定 | 定长 |
可访存指令 | 不加限制 | 只有Load/Store指令 |
各种指令执行时间 | 相差较大 | 绝大多数在一个周期内完成 |
各种指令使用频度 | 相差很大 | 都比较常用 |
通用寄存器数量 | 较少 | 多 |
目标代码 | 难以用优化编译生成高效的目标代码程序 | 采用优化的编译程序,生成代码较为高效 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |
大端方式
小端方式
指令控制
操作控制
时间控制
数据加工
中断处理
运算器
算术逻辑单元
:进行算术/逻辑运算暂存寄存器
累加寄存器
通用寄存器组
程序状态字寄存器
移位器
计数器
控制器
整个系统的指挥中枢,基本功能是执行指令,每条指令的执行是由控制器发出的一组微操作实现的
有硬布线控制器和微程序控制器两种类型
由程序计数器(PC)、指令寄存器(IR)、指令译码器、存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、时序系统和微操作信号发生器等组成
程序计数器
指令寄存器
指令译码器
存储器地址寄存器
存储器数据寄存器
时序系统
微操作信号发生器
工作原理
CPU内部寄存器大致可分为两类,用户可见的寄存器,可对其编程,如通用寄存器组、程序状态字寄存器。另一类是用户不可见的寄存器,对用户透明,不可对其编程,如存储器地址寄存器、存储器数据寄存器、指令寄存器
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
取指周期的数据流向如下
间址周期
取操作数有效地址。
将指令中的地址码送到MAR并送至地址总线,此后CU向存储器发读命令,以获取有效地址并存至MDR
间址周期的数据流向如下
Ad(IR)(或MDR)到MAR到地址总线到主存。
CU发出读命令到控制总线到主存
主存到数据总线到MDR(存放有效地址)
Ad(IR)表示取出IR中存放的指令字的地址字段
执行周期
中断周期
任务是处理中断请求
假设程序断点存入堆栈中,并用SP指示栈顶地址,而且进栈操作是先修改栈顶指针,后存入数据
中断周期的数据流向如下
单指令周期
多指令周期
流水线方案
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有效,现行指令地址 -> MAR
1 -> 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 // 操作数从存储器 -> 数据线 -> MDR MDR -> Bus -> Y // MDRout和Yin有效,操作数 -> Y (ACC)+(Y) -> Z // ACCout和ALUin有效,CU向ALU发加命令,结果 -> Z Z -> ACC // Zout和ACCin有效,结果 -> ACC
数据通路结构直接影响CPU内各种信息的传送路径,数据通路不同,指令执行过程的微操作序列的安排也不同,关系着微操作信号形成部件的设计
根据指令的要求、当前时序及外部和内部的状态,按时间的顺序发送一系列微操作控制信号
由复杂的组合逻辑门电路和一些触发器构成,因此又称组合逻辑控制器
硬布线控制单元图
指令的操作码是决定控制单元发出不同操作命令(控制信号)的关键。为了简化控制单元(CU)的逻辑,将指令的操作码译码和节拍发生器从CU中分离出来,便可得到简化的控制单元图
CU的输入信号来源如下
上图中,节拍发生器产生各机器周期中的节拍信号,使不同的微操作命令 C i C_i Ci(控制信号)按时间的先后发出。个别指令的操作不仅受操作码控制,还受状态标志控制,因此CU的输入来自操作码译码电路ID、节拍发生器及状态标志,其输出到CPU内部或外部控制总线上。
控制单元还接收来自系统总线(控制总线)的控制信号,如中断请求、DMA请求
硬布线控制器的时序系统及微操作
时钟周期
机器周期
指令周期
微操作命令分析
控制单元具有发出各种操作命令(控制信号)序列的功能。这些命令与指令有关,而且必须按照一定次序发出,才能使机器有序工作。
执行程序的过程中,对于不同的指令,控制单元需发出各种不同的微操作命令,一条指令分为3个工作周期:取指周期、间址周期、执行周期。下面分析各子周期的微操作命令
取指周期
间址周期
(完成取操作数地址的任务)
执行周期
CPU的控制方式
同步控制方式
异步控制方式
联合控制方式
硬布线控制单元设计步骤
采用存储逻辑实现,也就是把微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生
设计思想就是将每条机器指令编写成一个微程序,每个微程序包含若干微指令,每条微指令对应一个或几个微操作命令。这些微程序可以存到一个控制存储器中,用寻址用户程序指令的办法来寻址每个微程序的微指令
目前,大多数计算机都采用微程序设计技术
基本术语
微命令与微操作
微指令与微周期
操作控制
字段(微操作码字段)
顺序控制
字段(微地址码字段)
主存储器
与控制存储器
程序与微程序
微程序和程序是两个不同的概念。微程序是由微指令组成的,用于描述机器指令。微程序实际上是机器指令的实时解释器,由计算机设计者事先编制好并存放在控制存储器中的,一般不提供给用户。对程序员来说,计算机系统中的微程序的结构和功能是透明的,无须知道。而程序最终由机器指令组成,是由软件设计人员事先编制好并存放在主存或辅存中的
区分以下寄存器
地址寄存器
微地址寄存器
指令寄存器
微指令寄存器
微程序控制器的组成和工作过程
基本组成
控制存储器
微指令寄存器
微地址形成部件
微地址寄存器
工作过程
微程序和机器指令
若指令系统中具有n种机器指令,则控制存储器中的微程序数至少是n+1(1为公共的取指微程序)
微指令的编码方式
又称微指令的控制方式,是指如何对微指令的控制字段进行编码,以形成控制信号。编码的目标是保证速度的情况下,尽量缩短微指令字长
直接编码(直接控制方式)
直接编码法无须进行译码,微指令的微命令字段中,每位都代表一个微命令。设计微指令时,选用或不选用某个微命令,只要将表示该微命令的对应位设置成1或0即可。每个微命令对应并控制数据通路中的一个微操作。
优点是简单、直观、执行速度快、操作并行性好,缺点是微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控制存储器容量极大
字段直接编码方式
将微指令的微命令字段分成若干小字段,把互斥性微命令组合在同一字段中,把相容性微命令组合在不同字段中,每个字段独立编码,每种编码代表一个微命令,且各字段编码含义单独定义,与其他字段无关
这种方式可以缩短指令字长,但因为要通过译码电路后再发出微命令,因此比直接编码方式慢
微命令字段分段原则
字段间接编码方式
微指令的地址形成方式
两大基本类型
直接由微指令的下地址字段指出(又称断定方式)
根据机器指令的操作码形成
其他类型
增量计数器法
根据各种标志决定微指令分支转移的地址
通过网络测试形成
由硬件直接产生微程序入口地址
电源加电后,第一条微指令的地址可由专门的硬件电路产生,也可由外部直接向CMAR输入微指令地址,这个地址即为取指周期微程序的入口地址
微指令的格式
与微指令的编码方式有关,通常分水平型和垂直型两种
水平型
从编码方式看,直接编码、字段直接编码、字段间接编码、混合编码都是
基本指令格式如下,指令字中的一位对应一个控制信号,有输出时为1,否则为0
优点是微程序短,执行速度快,缺点是微指令长,编写微程序较麻烦
垂直型
特点是采用类似机器指令操作码的方式,在微指令中设置微操作码字段,采用微操作码编译法,由微操作码规定微指令的功能
基本的指令格式如下,一条微指令只能定义并执行一种基本操作
混合型微指令
水平型微指令和垂直型微指令的比较如下
微程序控制单元的设计步骤
写出对应机器指令的微操作命令及节拍安排
确定微指令格式
编写微指令码点
动态微程序设计和毫微程序设计
动态微程序设计
毫微程序设计
硬布线和微程序控制器的特点
硬布线控制器
微程序控制器
两者的对比表格
对比项目 | 微程序控制器 | 硬布线控制器 |
---|---|---|
工作原理 | 微操作控制信号以微程序的形式存放在控制存储器中,执行指令时读出即可 | 微操作控制信号由组合逻辑电路根据当前的指令码、状态、时序即时产生 |
执行速度 | 慢 | 快 |
规整性 | 较规整 | 烦琐、不规整 |
应用场合 | CISC | RISC |
易扩充性 | 易扩充修改 | 困难 |
异常的分类
按 类型分
按 异常发生原因和 返回方式分
故障(Fault)
自陷(Trap)
故障和 自陷属于 程序性异常,即 软件中断
终止(Abort)
中断的分类
中断和 异常在本质上是一样的,区别如下
指令流水的定义
根据计算机的不同,具体的分法也不同
取指
(IF)
译码/读寄存器
(ID)
执行/计算地址
(EX)
访存
(MEM)
写回
(WB)
当多条指令在处理器中执行时,可采用以下两种方式
顺序执行方式
(串行执行方式)
前一条指令执行完后,才启动下一条指令
假设取指、分析、执行三个阶段的时间都相等,用t表示,顺序执行n条指令所用时间T为
T
=
3
n
t
T=3nt
T=3nt
传统冯·诺依曼机采用顺序执行方式
优点是控制简单,硬件代价小;缺点是执行指令的速度较慢,在任何时刻,处理机中,只有一条指令在执行,各功能部件的利用率很低
流水线执行方式
为了提高指令的执行速度,可以把取k+1条指令提前到分析第k条指令的期间完成,而将分析第k+1条指令与执行第k条指令同时进行
与顺序执行方式相比,采用流水线执行方式能使指令的执行时间缩短近2/3,各功能部件的利用率明显提高。但硬件上要付出较大开销的代价,控制过程也更复杂。
理想情况下,每个时钟周期都有一条指令进入流水线,处理机中同时有3条指令在执行,每个时钟周期都有一条指令完成,每条指令的时钟周期数(即CPI)都为1。
为了进一步获得更高的执行速度,还可以将流水段进一步细分。如将一条指令的执行过程分为取指令(IF)、指令译码(ID)、(取操作数(OF))、执行(EX)、写回(WB)四个阶段,就形成了四级流水(或五级流水)
流水线设计原则
为了利于实现指令流水线,指令集应具有如下特征
流水线的表示方法
通常用时空图来直观地描述流水线的工作过程,横坐标表示时间,即输入流水线中的各个任务在流水线中所经过的时间。流水线中各个流水段的执行时间都相等时,横坐标就被分割成相等长度的时间段。纵坐标表示空间,即流水线的每个流水段(对应各执行部件)
流水线方式的特点
装入时间
排空时间
虽然不是 所有指令都必须经历完整的 5个阶段,但只能以 执行速度最慢的指令作为设计其 时钟周期的依据,单周期CPU的时钟频率取决于 数据通路中的关键路径(最长路径),因此单周期CPU执行效率不佳
流水线的数据通路
流水线的控制信号
某一时刻,每个 流水段执行不同指令的 某个阶段,每个 流水段还需要正在执行指令的对应 功能段 的 控制信号
控制信号分类
每个 流水寄存器中保存的信息包括
流水线的执行过程
取值
(IF)
译码/读寄存器
(ID)
执行/计算地址
(EX)
访存
(MEM)
写回
(WB)
在 指令流水线中,可能会遇到一些情况使得流水线无法正确执行后续指令而引起流水线 阻塞或 停顿,这种现象称为 流水线冒险
结构冒险
数据冒险
写后读
(Read After Write,RAW)
读后写
(Write After Read,WAR)
写后写
(Write After Write,WAW)
控制冒险
指令通常是 顺序执行的,但是在遇到 改变指令顺序的情况,如 执行转移、调用、返回等指令,会 改变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
流水线的加速比
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比
设**
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,相对而言,多发射流水线成本更高,控制更复杂
基于指令流的数量和数据流的数量,将计算机体系结构分为 SISD、SIMD、MISD、MIMD四类。常规的单处理器属于SISD,常规的多处理器属于MIMD
单指令流单数据流
(SISD)
单指令流多数据流
(SIMD)
多指令流单数据流
(MISD)
多指令流多数据流
(MIMD)
向量处理器是SIMD的变体,是一种实现了直接操作一维数组(向量)指令集的CPU,而串行处理器只能处理单一数据集
SIMD和MIMD是两种并行计算模式,SIMD是一种数据级并行模式,而MIMD是一种并行程度更高的线程级并行或线程级以上并行计算模式
细粒度多线程
粗粒度多线程
同时多线程
将多个处理单元集成到单个CPU中,每个处理单元称为一个核(core)。每个核可以有自己的Cache,也可以共享同一个Cache
具有共享的单一物理地址空间的多处理器被称为共享内存多处理器(SMP)。处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问任何存储器的位置
单一地址空间的多处理器有两种类型
每个处理器对所有存储单元的访问时间是大致相同的,这类机器统称统一存储访问(UMA)多处理器
某些访存请求要比其他的快,具体取决于哪个处理器提出了访问请求以及访问哪个字,这是由于主存被分配给了同一机器上的不同处理器或内存控制器,这类机器称为非统一存储访问(NUMA)多处理器
各种字长关系
CPU分为哪几部分?分别实现什么功能?
运算器
控制器
指令和数据均放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?
时间
空间
什么是指令周期、机器周期、时钟周期?它们之间有什么关系?
指令周期
机器周期
时钟周期
指令周期是否有一个固定值?为什么?
什么是微指令?
什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?
流水线越多,并行度就越高,是否流水段越多,指令执行越快?
有关指令相关、数据相关的几个概念
为了更好地解决I/O设备和主机之间连接的灵活性问题,计算机的结构从分散连接发展为总线连接,为了进一步简化设计,又提出了各类总线标准
主设备
从设备
按功能分类
片内总线
系统总线
计算机系统内各功能部件(CPU、主存、I/O接口)之间的相互连接的总线
按系统总线传输信息内容的不同,可分为3类
数据总线
地址总线
控制总线
注意区分数据通路和数据总线:各个功能部件通过数据总线连接形成的数据传输路径,称为数据通路。数据通路表示的是数据流经的路径,而数据总线是承载的媒介
通信总线
通常分为单总线结构、双总线结构、三总线结构
单总线结构
将CPU、主存、I/O设备(通过I/O接口)都挂在一组总线上,允许I/O设备之间、I/O设备与主存之间直接交换信息,而无须经过中间设备的干预
单总线并不是指只有一根信号线,系统总线按传送信息的不同可细分为地址总线、数据总线、控制总线
优点是结构简单,成本低,易于接入新的设备。缺点是带宽低、负载重,多个部件只能争用唯一的总线,且不支持并发传送操作
双总线结构
主存总线
I/O总线
优点是将低速I/O设备从单总线上分离出来,实现了存储器总线和I/O总线分离。缺点是需要增加通道等硬件设备
三总线结构
主存总线
I/O总线
DMA总线
(直接内存访问总线)
ISA
工业标准体系结构,最早出现的微型计算机系统总线EISA
扩展的ISA,为了 配合32位CPU而设计的VESA
视频电子标准协会,是一个 32位局部总线,针对 多媒体大量数据推出的PCI
外部设备互连,是专为 高度集成的外围部件,与 处理器时钟频率无关的 局部总线AGP
加速图形接口,是一种 视频接口标准PCI-E
最新的总线接口标准RS-232C
串行通信总线USB
通用串行总线PCMCIA
应用于 笔记本电脑的接口标准,用于 扩展功能的小型插槽,即插即用IDE
集成设备电路,是一种 IDE接口磁盘驱动器接口类型SCSI
小型计算机系统接口,用于 计算机和 智能设备之间系统级接口的 独立处理器标准SATA
串行高级技术附件,基于行业标准的 串行硬件驱动器接口总线传输周期
总线时钟周期
总线工作频率
总线时钟频率
总线宽度
(总线位宽)
总线带宽
总线的数据传输率,即单位时间内总线上可传输数据的位数,通常用每秒传送信息的字节数来衡量,单位可用字节/秒(B/s)表示。
总线带宽 = 总线工作频率 * (总线宽度 / 8),应与总线宽度区分开来
总线复用
信号线数
地址总线、数据总线、控制总线3种总线数的总和
总线最主要性能指标为总线宽度、总线(工作)频率、总线带宽
总线带宽是指总线本身所能达到的最高传输效率,是衡量总线性能的重要指标
总线带宽 = 总线宽度 * 总线频率
请求阶段
仲裁阶段
寻址阶段
传输阶段
释放阶段
没有统一的时钟,也没有固定的时间间隔,完全靠传送双方相互制约的握手信号来实现定时控制。
优点是总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间可靠地进行信息交换,自动适应时间的配合,缺点是比同步控制方式稍复杂一点,速度比同步定时方式慢
根据请求和回答信号的撤销是否互锁,异步定时方式又分为以下3种类型
不互锁方式
半互锁方式
全互锁方式
I/O接口(I/O控制器)是主机和外设之间的交接界面,通过接口可以实现主机和外设之间的信息交换
I/O接口在主机侧通过I/O总线与内存、CPU相连。通过数据总线,在数据缓冲寄存器与内存或CPU的寄存器之间进行数据传送。同时接口和设备的状态信息被记录在状态寄存器中,通过数据线将状态信息送到CPU。CPU对外设的控制命令也通过数据线传送,一般将其送到I/O接口的控制寄存器。状态寄存器和控制寄存器在传送方向上是相反的
接口中的地址线用于给出要访问的I/O接口中的寄存器的地址,它和读写控制信号一起被送到I/O接口的控制逻辑部件,其中地址信息用以选择和主机交换信息的寄存器,通过控制线传送来的读/写信号确认是读寄存器还是写寄存器,此外控制线还会传送一些仲裁信号和握手信号
接口中的I/O控制逻辑还要能对控制寄存器中的命令字进行译码,并将译码得到的控制信号通过外设界面控制逻辑送到外设,同时将数据缓冲寄存器的数据发送到外设或从外设接收数据到数据缓冲寄存器。另外,它还要具有收集外设状态到状态寄存器的功能。
对数据缓冲寄存器、状态/控制寄存器的访问操作是通过相应的指令来完成的,通常称这类指令为I/O指令,只能在操作系统内核的底层I/O软件中使用,是一种特权指令
接口和端口是两个不同的概念,端口是接口电路中可以进行读写的寄存器,若干端口加上相应的控制逻辑才可以组成接口
按 数据传送方式可分为 并行接口(一字节或一个字的所有位同时传送)和 串行接口(一位位传送),接口要完成 数据格式的转换
这里说的 数据传送方式指的是 外设和接口一侧的传送方式
按主机访问I/O设备的控制方式可分为程序查询接口、中断接口、DMA接口
按功能选择的灵活性可分为可编程接口和不可编程接口
I/O端口是指接口电路中可被CPU直接访问的寄存器,主要有数据端口、状态端口、控制端口,端口加上相应的控制逻辑电路组成接口
通常,CPU能对数据端口进行读写操作,但对状态端口只能读操作,对控制端口只能写操作
I/O端口的编址方式有与存储器统一编址和独立编址两种
统一编址
(存储器映射方式)
独立编址
(I/O映射方式)
输入/输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,常用的有程序查询、程序中断、DMA、通道等,前两种方式更依赖于CPU中程序指令的执行
信息交换的控制完全由CPU执行程序实现,程序查询方式接口中设置一个数据缓冲寄存器(数据端口)和一个设备状态寄存器(动态端口)。主机进行I/O操作时,先发出询问信号,读取设备的状态并根据设备状态决定下一步操作究竟是进行数据传送还是等待
程序查询方式的工作流程如下
在这种控制方式下,CPU一旦启动I/O,就必须停止现行程序的运行,并在现行程序中插入一段程序。程序查询的主要特点是CPU有踏步等待现象,CPU与I/O串行工作。这种方式的接口设计简单、设备量少,但CPU在信息传送过程中要花费很多时间来查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低
中断的基本概念
指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂停中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序
作用
思想
CPU在程序中安排好某个时刻启动某台外设,然后CPU继续执行原来的程序,不需要像查询方式那样一直等待外设准备就绪。一旦外设完成数据传送的准备工作,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外设服务,在中断服务程序中完成一次主机与外设之间的数据传送,传送完成后,CPU返回原来的程序
程序中断方式工作流程
中断请求
中断判优
中断系统在任一瞬间只能响应一个中断源的请求。由于许多中断源提出中断请求的时间都是随机的,因此当多个中断源同时提出请求时,需通过中断判优逻辑确定响应哪个中断源的请求
中断判优既可以用硬件实现,又可用软件实现。硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,又可以分散在各个中断源中,软件实现是通过查询程序实现的
一般来说
中断优先级包括 响应优先级和 处理优先级,响应优先级在硬件线路上是 固定的,不便改动。处理优先级可利用 中断屏蔽技术动态调整,以实现 多重中断
CPU响应中断的条件
CPU在满足一定的条件下响应中断源发出的中断请求,并经过一些特定的操作,转去执行中断服务程序。CPU响应中断必须满足以下3个条件
I/O设备的就绪时间是随机的,而CPU在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻,这里说的中断仅指外中断,内中断不属于此类情况
中断响应
关中断
保存断点
引出中断服务程序
中断向量
每个中断都有一个类型号,每个中断类型号都对应一个中断服务程序,每个中断服务程序都有一个入口地址,CPU必须找到入口地址,即中断向量,把系统中的全部中断向量集中存放到存储器的某个区域内,这个存放中断向量的存储区就称为中断向量表。
CPU响应中断后,中断硬件会自动将中断向量地址传送到CPU,由CPU实现程序的切换,这种方法称为中断向量法,采用该方法的中断称为中断向量
中断向量是中断服务程序的入口地址,中断向量地址是指中断服务程序的入口地址的地址
中断处理过程
中断处理流程如下
关中断
保存断点
引出中断服务程序
通常有两种方法寻址中断服务程序的入口地址
硬件向量法
软件查询法
硬件产生的实际上是中断类型号,而中断类型号指出了中断向量存放的地址,因此能产生中断向量地址
保存现场和屏蔽字
进入中断服务程序后首先要保存现场、中断屏蔽字,现场信息是指用户可见的工作寄存器的内容,它存放着程序执行到断点处的现行值
现场和断点,这两类信息都不能被中断服务程序破坏。现场信息因为用指令可直接访问,所以通常在中断服务程序中通过指令把它们保存到栈中,即由软件实现;而断点信息由CPU在中断响应开始时自动保存到栈或专门的寄存器中,即由硬件实现
开中断
执行中断服务程序
关中断
恢复现场和屏蔽字
开中断、中断返回
13**在CPU进入中断周期后,由**中断隐指令(硬件自动)**完成。**49由中断服务程序完成
恢复现场是指在中断返回前,必须将寄存器的内容恢复到中断处理前的状态,这部分工作由中断服务程序完成。中断返回由中断服务程序的最后一条中断返回指令完成
多重中断和中断屏蔽技术
若CPU在执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断。若CPU暂停现行的中断服务程序,转去处理新的中断请求,则这种中断称为多重中断,又称中断嵌套
中断屏蔽技术主要用于多重中断。CPU要具备多重中断的功能,必须满足下列条件
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有的屏蔽触发器组合在一起便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字
DMA方式是一种完全由硬件进行成组信息传送的控制方式,它具有程序中断方式的优点,即在数据准备阶段,CPU与外设并行工作。DMA方式在外设与内存之间开辟一条直接数据通道,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。由于数据传送不经过CPU,也就不需要保护、恢复CPU现场等烦琐操作
这种方式适用于磁盘机、磁带机等高速设备大批量数据的传送,它的硬件开销比较大。在DMA方式中,中断的作用仅限于故障和正常传送结束时的处理。
主存和DMA接口之间有一条直接数据通路。由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。
DMA方式的特点
DMA控制器的组成
主存地址计数器
传送长度计数器
数据缓冲寄存器
DMA请求触发器
控制/状态逻辑
中断机构
主存和I/O设备之间交换信息时,不通过CPU。但当I/O设备和CPU同时访问主存时,可能发生冲突,为了有效地使用主存,DMA控制器与CPU通常采用3种方式使用主存
DMA的传送方式
停止CPU访存
周期挪用
(或周期窃取)
DMA与CPU交替访存
DMA的传送过程
预处理
数据传送
后处理
DMA方式和中断方式的区别
I/O设备有哪些编址方式?各有何特点?
统一编址
独立编址
CPU响应中断应具备哪些条件?
中断响应优先级和中断处理优先级分别指什么?
向量中断、中断向量、向量地址三个概念是什么关系?
中断向量
向量地址
向量中断
程序中断和调用子程序有何区别
两者的根据区别主要表现在服务时间和服务对象上不一样
调用子程序过程发生的时间是已知的和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的、固定的。而中断过程发生的时间一般是随机的,CPU在执行某个主程序时收到中断源提出的中断申请,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的。也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的。
子程序完全为主程序服务,两者属于主从关系。主程序需要子程序时就去调子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序二者一般是无关的,不存在谁为谁服务的问题,两者是平行关系
主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路;而中断处理系统是一个软/硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程
子程序嵌套可实现若干级,嵌套的最多级数受计算机内存开辟的堆栈大小限制;而中断嵌套级数主要由中断优先级来决定,一般优先级数不会很大
从宏观上看,虽然程序中断方式克服了程序查询方式中的CPU踏步现象,实现了CPU与I/O并行工作,提高了CPU的资源利用率,但从微观操作分析,CPU在处理中断服务程序时,仍需暂停原程序的正常运行,尤其是当高速I/O设备或辅助存储器频繁地、成批地与主存交换信息时,需要不断打断CPU执行现场,而执行中断服务程序。
I/O指令和通道指令有何区别
I/O指令
通道指令
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。