CPU执行时间:
t
=
c
y
c
l
e
s
f
=
i
n
s
t
r
u
c
t
i
o
n
s
×
C
P
I
f
\small \rm t= \frac{cycles}{f} = \frac{instructions × CPI}{f}
t=fcycles=finstructions×CPI
MIPS(Million Instructions Per Second):
M
I
P
S
=
f
C
P
I
\small \rm MIPS = \frac{f}{CPI}
MIPS=CPIf
MFLOPS, GFLOPS, TFLOPS
第2章 数据的表示和运算 🔍
0.基础知识
①数据的存储和排列
大端方式:高位存放在低地址
小端方式:高位存放在高地址
边界对齐
②C语言整数类型转换
有符号数和无符号数转换
unsignedshort x =65535;// 0xFFFFshort y = x;// y = -1
不同字长整数的转换
/**
* 短字转长字
*/short x =-16;// 0xFFF0int y = x;// 0xFFFFFFF0 = -16unsignedshort a =(unsignedshort)x;unsignedint b = a;// 0x0000FFF0 = 65520/**
* 长字转短字
*/int m =65520;// 0x0000FFF0short n =(short)x;// 0xFFF0 = -16
1.定点数的二进制表示
真值0 的原码和反码都有2种表示法,即 +0 和 -0
真值0 的补码和移码只有1种表示法
移码只能表示整数,补码符号位取反就是移码
设
x
0
x_0
x0为符号位,定点整数
x
0
,
x
1
x
2
.
.
.
x
n
x_0,x_1x_2...x_n
x0,x1x2...xn,定点小数
x
0
.
x
1
x
2
.
.
.
x
n
x_0.x_1x_2...x_n
x0.x1x2...xn
补码加减法:有符号数加减、无符号数加减,有符号数与无符号数加减,在运算过程中两数都被视为补码,只是最后对结果的解释不一样
[
A
+
B
]
补
=
[
A
]
补
+
[
B
]
补
(
m
o
d
2
n
+
1
)
[
A
−
B
]
补
=
[
A
]
补
+
[
−
B
]
补
(
m
o
d
2
n
+
1
)
\begin{aligned} & [A + B]_{补} = [A]_{补} +[B]_{补}(mod \space 2^{n+1}) \\ & [A - B]_{补} = [A]_{补} +[-B]_{补}(mod \space 2^{n+1}) \\ \end{aligned}
[A+B]补=[A]补+[B]补(mod2n+1)[A−B]补=[A]补+[−B]补(mod2n+1)
/*
* a = 1000 0000
* b = 1000 0001
* -b = 0111 1111
* a-b = 1111 1111
*/unsignedchar a =128;unsignedchar b =129;unsignedchar s1 = a - b;// s1 = 255 char s2 = a - b;// s2 = -1unsignedchar a =128;char b =-127;char s1 = a + b;// s1 = 1 char s2 = a - b;// s2 = 255
溢出判断:2个符号相同的数相加、2个符号不同的数相减,可能出现溢出
采用1位符号位:2个操作数符号相同,结果与原操作数符号不同,表示溢出
采用1位符号位:符号位进位与最高有效位的进位不同,表示溢出
采用2位符号位:运算结果的符号位为 01 表示上溢出,10 表示下溢出
4.定点数的乘法运算
Booth算法:
[
x
]
补
=
x
s
.
x
1
x
2
.
.
.
x
n
,
[
y
]
补
=
y
s
.
y
1
y
2
.
.
.
y
n
,
[x]_{补} = x_s.x_1x_2...x_n,[y]_{补} = y_s.y_1y_2...y_n,
[x]补=xs.x1x2...xn,[y]补=ys.y1y2...yn,
末尾增设附加位
y
n
+
1
=
0
y_{n+1} = 0
yn+1=0
[
x
]
补
[x]_补
[x]补 用双符号位,
[
y
]
补
[y]_补
[y]补 用单符号位
从
00.0000
00.0000
00.0000 开始加起,共进行
n
+
1
n+1
n+1 次加法和
n
n
n 次右移
y
n
y
n
+
1
=
{
00
或
11
:部分积右移
1
位
01
:部分积加
[
x
]
补
,再右移
1
位
10
:部分积加
[
−
x
]
补
,再右移
1
位
y_ny_{n+1} = \begin{cases} 00 或 11:部分积右移1位 \\ 01:部分积加[x]_补,再右移1位 \\ 10:部分积加[-x]_补,再右移1位 \end{cases}
ynyn+1=⎩⎨⎧00或11:部分积右移1位01:部分积加[x]补,再右移1位10:部分积加[−x]补,再右移1位
5.浮点数的规格化
规格化的目的是提高运算的精度
左规:尾数左移1位,阶码减1
右规:尾数右移1位,阶码加1
基数为2时,原码规格化的尾数最高位为1,补码规格化的尾数最高位和符号位相反
设浮点数字长为阶码 1+7 位,尾数 1+23 位,基数为 2,且尾数为规格化形式,浮点数用补码表示时,表示范围为:
0.1111111
;
0.
1111...1
⏟
23
b
i
t
s
⇒
2
+
127
×
(
1
−
2
−
23
)
1.0000000
;
0.
1000...0
⏟
23
b
i
t
s
⇒
2
−
128
×
(
2
−
1
)
1.0000000
;
1.
0111...1
⏟
23
b
i
t
s
⇒
2
−
128
×
(
−
2
−
1
−
2
−
23
)
0.1111111
;
1.
0000...0
⏟
23
b
i
t
s
⇒
2
+
127
×
(
−
1
)
\begin{aligned} 0.1111111; 0.\underbrace{1111...1}_{23bits} &\Rightarrow 2^{+127} × (1 - 2^{-23}) \\ 1.0000000; 0.\underbrace{1000...0}_{23bits} &\Rightarrow 2^{-128} × (2^{-1}) \\ 1.0000000; 1.\underbrace{0111...1}_{23bits} &\Rightarrow 2^{-128} × (-2^{-1} - 2^{-23}) \\ 0.1111111; 1.\underbrace{0000...0}_{23bits} &\Rightarrow 2^{+127} × (-1) \end{aligned}
0.1111111;0.23bits1111...11.0000000;0.23bits1000...01.0000000;1.23bits0111...10.1111111;1.23bits0000...0⇒2+127×(1−2−23)⇒2−128×(2−1)⇒2−128×(−2−1−2−23)⇒2+127×(−1)
将 -8.25 表示为单精度浮点数:
−
8.25
=
−
1000.01
=
−
1.00001
×
2
3
=
(
−
1
)
1
×
2
130
−
127
×
1.00001
=
1
10000010
⏟
8
b
i
t
s
0000100..0
⏟
23
b
i
t
s
=
C
104
0000
H
\begin{aligned} -8.25 &= -1000.01 = -1.00001 × 2^3 \\ &= (-1)^1 × 2^{130-127} × 1.00001 \\ &= 1 \space \underbrace{10000010}_{8bits} \space \underbrace{0000100..0}_{23 bits} \\ &= \rm C104 \,0000H \end{aligned}
−8.25=−1000.01=−1.00001×23=(−1)1×2130−127×1.00001=18bits1000001023bits0000100..0=C1040000H
8.校验码
①奇偶校验码
在原编码的最高位前加一个校验位,码距为2
只能检测奇数位的出错情况,不能确定出错的位置,即无法纠错
奇校验码:整个校验码中 1 的个数为奇数
偶校验码:整个校验码中 1 的个数为偶数
②海明码
n 为有效信息的位数,k 为校验码的位数,则满足
n
+
k
≤
2
k
−
1
n + k \leq 2^k - 1
n+k≤2k−1
如果是 n = 4, k = 3,设P为校验位,D为信息位,则:
H
7
H
6
H
5
H
4
H
3
H
2
H
1
D
4
D
3
D
2
P
3
D
1
P
2
P
1
\begin{aligned} &\rm H_7 \, H_6 \,H_5 \, H_4 \, H_3 \, H_2 \,H_1 \\ &\rm D_4 \, D_3 \, D_2 \,P_3 \, D_1 \,P_2 \,\, P_1 \\ \end{aligned}
H7H6H5H4H3H2H1D4D3D2P3D1P2P1
校验位的计算方法:
H
1
=
H
3
⊕
H
5
⊕
H
7
H
2
=
H
3
⊕
H
6
⊕
H
7
H
4
=
H
5
⊕
H
6
⊕
H
7
\begin{aligned} & \rm H_1 = H_3 \oplus H_5 \oplus H_7 \\ & \rm H_2 = H_3 \oplus H_6 \oplus H_7 \\ & \rm H_4 = H_5 \oplus H_6 \oplus H_7 \end{aligned}
H1=H3⊕H5⊕H7H2=H3⊕H6⊕H7H4=H5⊕H6⊕H7
检错原理:如果
S
3
S
2
S
1
=
000
\rm S_3S_2S_1 = 000
S3S2S1=000,则说明无错
S
1
=
H
1
⊕
H
3
⊕
H
5
⊕
H
7
S
2
=
H
2
⊕
H
3
⊕
H
6
⊕
H
7
S
3
=
H
4
⊕
H
5
⊕
H
6
⊕
H
7
\begin{aligned} & \rm S_1 = H_1 \oplus H_3 \oplus H_5 \oplus H_7 \\ &\rm S_2 = H_2 \oplus H_3 \oplus H_6 \oplus H_7 \\ & \rm S_3 = H_4 \oplus H_5 \oplus H_6 \oplus H_7 \end{aligned}
S1=H1⊕H3⊕H5⊕H7S2=H2⊕H3⊕H6⊕H7S3=H4⊕H5⊕H6⊕H7
③CRC码
首先,生成多项式
G
(
x
)
G(x)
G(x) 的最高次为几,就在原编码的低位补几个 0
再用
G
(
x
)
G(x)
G(x) 作为除数,对补0后的编码 做模2除法,直到余数位数小于除数
最后在原信息码后拼接 R 位余数,得到CRC码
模2除法:
0
±
1
=
1
±
0
=
1
0 \pm 1 = 1\pm 0 = 1
0±1=1±0=1
0
±
0
=
1
±
1
=
0
0 \pm 0 = 1\pm 1 = 0
0±0=1±1=0
部分余数首位为1,上商1;部分余数首位为0,上商0
检错原理:
接收端收到的CRC码,用
G
(
x
)
G(x)
G(x) 做模2除法,若余数为0,则无错
第3章 存储系统 💿
1.存储器的分类和性能指标
Cache-主存层次:解决CPU和主存速度不匹配问题
主存-辅存层次:解决存储系统的容量问题
常见辅存:磁盘、磁带、光盘
按层次分类:缓存、主存、辅存
按存取方式分类
{
随机存储器
R
A
M
只读存储器
R
O
M
串行访问存储器
{
顺序存取存储器
(
磁带
)
直接存取存储器
(
磁盘
)
按存取方式分类 \begin{cases} 随机存储器 RAM \\ 只读存储器 ROM \\ 串行访问存储器 \begin{cases}顺序存取存储器(磁带) \\ 直接存取存储器(磁盘)\end{cases} \end{cases}
按存取方式分类⎩⎨⎧随机存储器RAM只读存储器ROM串行访问存储器{顺序存取存储器(磁带)直接存取存储器(磁盘)
存取周期:连续两次访存操作的最小间隔时间
存取时间:启动一次访存操作到完成该操作的时间
存取周期通常都是大于存取时间
2.RAM vs ROM
RAM 是易失性存储器,ROM是非易失性存储器,易失是指断电后内容会丢失
RAM 和 ROM 都支持随机存取
3.SRAM vs DRAM ★
DRAM 的刷新以行为单位,只需要提供行地址
DRAM 的刷新不需要选片,所有芯片同时被刷新
DRAM 常用的有集中刷新、分散刷新、异步刷新,其中分散刷新没有死区
DRAM 采用地址线复用技术,地址线是原来的 1/2,地址信号分行、列两次传送
属性
SRAM
DRAM
工作原理
触发器
电容
主要用途
Cache
主存
运行速度
↑
↓
成本
↑
↓
功耗
↑
↓
集成度
↓
↑
需要刷新
×
√
破坏性读出
×
√
4.多模块存储器
多模块存储器用于提高访存速度
高位交叉编址:
多个模块不能并行访问,无法提高存储器吞吐率
低位交叉编址:
采用流水线方式并行存取
对于四体交叉存储器,给定的访存地址在相邻的4次访问出现在同一个存储模块内,会发生冲突
设数据总线宽度等于模块的存储字长,模块存取一个字的存取周期为
T
\small T
T,总线传输周期为
Δ
t
\small \Delta t
Δt,模块数为
k
\small k
k,满足
T
=
k
t
\small T =kt
T=kt,采用低位交叉编址,访问 n 个连续的存储字所需的时间为:
t
=
T
+
(
n
−
1
)
Δ
t
=
(
k
+
n
−
1
)
Δ
t
\small t = T + (n-1) \Delta t = (k + n -1)\Delta t
t=T+(n−1)Δt=(k+n−1)Δt
直接映射:
i
i
i 是主存块号,
C
=
2
c
C=2^c
C=2c 是Cache的总块数,
j
=
i
m
o
d
C
j = i \ mod \, C
j=imodC
全相联映射
组相联映射:
i
i
i 是主存块号,
Q
Q
Q 是Cache的组数,
j
=
i
m
o
d
Q
j = i \ mod \, Q
j=imodQ
②替换算法
R
A
N
D
、
F
I
F
O
、
L
R
U
、
L
F
U
\small \rm RAND、FIFO、LRU、LFU
RAND、FIFO、LRU、LFU
③Cache写命中的策略
写直达法(write-through):既写入 cache 又写入 memory
写回法(write-back):只写入 cache,被替换时才写回 memory
④Cache性能指标
命中率:
h
i
t
=
N
c
N
c
+
N
m
hit = \frac{N_c}{N_c + N_m}
hit=Nc+NmNc
平均访问时间:
t
a
=
t
c
⋅
h
i
t
+
t
m
(
1
−
h
i
t
)
t_a = t_c \cdot hit + t_m(1-hit)
ta=tc⋅hit+tm(1−hit)
访问效率:
e
=
t
c
t
a
e = \frac{t_c}{t_a}
e=tatc
与无Cache相比速度提高的倍数:
n
=
t
m
t
a
−
1
n= \frac{t_m}{t_a} - 1
n=tatm−1
6.磁盘存储器
设磁盘每秒的转数为
r
r
r , 每条磁道的字节数为
N
N
N
寻道时间
T
s
T_s
Ts,旋转延迟时间
T
d
T_d
Td,传输时间
T
t
T_t
Tt
数据传输率:
D
=
r
N
D = rN
D=rN
平均存取时间:
t
=
T
s
+
T
d
+
T
t
=
T
s
+
1
2
r
+
b
r
N
t = T_s + T_d+T_t = T_s+\frac1{2r}+\frac{b}{rN}
t=Ts+Td+Tt=Ts+2r1+rNb
第4章 指令系统 💡
1.指令格式
定长操作码:操作码长度固定
扩展操作码:操作码的长度随着地址码的减少而增加
2.寻址方式
①指令寻址
顺序寻址:下一条指令的地址由PC自动形成
跳跃寻址:下一条指令的地址由指令本身给出
②数据寻址
隐含寻址、立即寻址
直接寻址、间接寻址
寄存器寻址、寄存器间接寻址
基址寻址、变址寻址
相对寻址:EA = (PC) + A
堆栈寻址:入栈为
S
P
−
1
→
S
P
\rm SP-1 \to SP
SP−1→SP,出栈为
S
P
+
1
→
S
P
\rm SP+1 \to SP
SP+1→SP
3.基址寻址 vs 变址寻址
基址寻址
变址寻址
有效地址
EA = (BR) + A
EA = (IX) + A
扩大寻址范围
√
√
寄存器内容
由操作系统确定,不可变
由用户确定,可变
应用
多道程序技术
处理数组问题
4.RISC vs CISC ★
RISC
CISC
指令系统
简单
复杂
指令长度
固定
不固定
通用寄存器数量
多
较少
可访存指令
只有 load/store
无限制
指令流水线
必须实现
可以实现
控制器
采用组合逻辑
采用微程序
目标代码生成
采用编译优化
难以用编译优化
第5章 中央处理器 🔑
1.CPU的基本结构
PC, GPR, PSW 对程序员可见,即不透明的
IR, MAR, MDR 对程序员不可见,即透明的
2.控制器的种类
组合逻辑控制器
微程序控制器
执行速度
快
慢
扩展性
易扩充修改
难以修改
应用场合
RISC
CISC
控制器的输入信号来源:时钟信号、IR、程序状态字、控制总线
控制器的控制方式:同步控制、异步控制、联合控制、人工控制
多级时序系统:机器周期、节拍
3.微程序控制器
一条机器指令 ⇒ 一个微程序 ⇒ 若干微指令
一条微指令 ⇒ 若干微命令
控制存储器(CM):在CPU内部,由ROM实现,用于存放微程序,是微程序控制器的核心
微命令:控制部件向执行部件发出的控制命令,与微操作相对应
微指令的地址形成
直接由下地址字段确定:
A
d
(
C
M
D
R
)
→
C
M
A
R
\rm Ad(CMDR) \to CMAR
Ad(CMDR)→CMAR
根据机器指令的操作码形成:
O
P
(
I
R
)
→
微地址形成部件
→
C
M
A
R
\rm OP(IR) \to 微地址形成部件 \to CMAR
OP(IR)→微地址形成部件→CMAR
微指令的编码方式:也叫微指令的控制方式
直接编码(直接控制)
字段直接编码、字段间接编码
微指令的格式
水平型微指令
垂直型微指令
运行速度
快
慢
指令特点
指令长,程序短
指令短,程序长
实现
直接编码、字段直接编码、字段间接编码
采用微操作码
4.指令执行过程 ★
指令周期:从主存取出一条指令并执行的时间
机器周期:把一条指令的执行过程划分为若干阶段,完成一个阶段所需的时间称为机器周期
时钟周期:机器主频的倒数。一个机器周期包含若干时钟周期
①取指周期
如果指令字长等于存储字长,取指周期等于机器周期
如果指令字长等于存储字长的 2 倍,则需要 2 次访存,取指周期等于机器周期的 2 倍
T
0
:
(
P
C
)
→
M
A
R
,
1
→
R
T
1
:
M
(
M
A
R
)
→
M
D
R
,
(
P
C
)
+
1
→
P
C
T
2
:
M
D
R
→
I
R
,
O
P
(
I
R
)
→
I
D
\begin{aligned} & {\rm T_0:(PC) \to MAR,1 \to R} \\ & {\rm T_1:M(MAR) \to MDR,(PC)+1 \to PC} \\ & {\rm T_2:MDR \to IR,OP(IR) \to ID} \end{aligned}
T0:(PC)→MAR,1→RT1:M(MAR)→MDR,(PC)+1→PCT2:MDR→IR,OP(IR)→ID
②间址周期
T
0
:
A
d
(
I
R
)
→
M
A
R
,
1
→
R
T
1
:
M
(
M
A
R
)
→
M
D
R
T
2
:
M
D
R
→
A
d
(
I
R
)
\small \begin{aligned} & {\rm T_0:Ad(IR) \to MAR, 1 \to R} \\ & {\rm T_1:M(MAR) \to MDR} \\ & {\rm T_2:MDR \to Ad(IR)} \end{aligned}
T0:Ad(IR)→MAR,1→RT1:M(MAR)→MDRT2:MDR→Ad(IR)
③执行周期
特别需要指出的中断返回指令
T
0
:
S
P
→
M
A
R
,
1
→
R
T
1
:
M
(
M
A
R
)
→
M
D
R
T
2
:
M
D
R
→
P
C
,
(
S
P
)
+
1
→
S
P
\begin{aligned} & {\rm T_0: SP \to MAR,1 \to R} \\ & {\rm T_1: M(MAR) \to MDR} \\ & {\rm T_2: MDR \to PC,(SP)+1\to SP} \end{aligned}
T0:SP→MAR,1→RT1:M(MAR)→MDRT2:MDR→PC,(SP)+1→SP
④中断周期
T
0
:
(
S
P
)
−
1
→
S
P
→
M
A
R
,
1
→
W
T
1
:
P
C
→
M
D
R
T
2
:
M
D
R
→
M
(
M
A
R
)
,中断向量地址
→
P
C
\small \begin{aligned} & {\rm T_0:(SP)-1 \to SP \to MAR,1 \to W} \\ & {\rm T_1:PC \to MDR} \\ & {\rm T_2:MDR \to M(MAR),中断向量地址 \to PC} \end{aligned}
T0:(SP)−1→SP→MAR,1→WT1:PC→MDRT2:MDR→M(MAR),中断向量地址→PC
5.流水线技术 ★
①基本概念
单周期CPU:一条指令在一个时钟周期内完成,指令之间串行执行
多周期CPU:一条指令的执行过程分成几个阶段,每个阶段用一个时钟周期去完成,指令之间串行执行
流水线CPU:在多周期CPU的基础上,每个阶段并行执行
②影响流水线的因素
结构相关:资源冲突,如存储器争夺
控制相关:条件转移指令引起,可采用分支预测解决
数据相关:按序流动的流水线只可能出现 RAW 相关,解决方法可采用旁路技术、流水线暂停、编译器优化
RAW 冲突:在上一条指令写之前就已经被读取
A
D
D
R
1
,
R
2
,
R
3
S
U
B
R
4
,
R
1
,
R
5
{\rm ADD \space\space R_1, R_2, R_3} \\ {\rm SUB \space\space R_4, R_1, R_5}
ADDR1,R2,R3SUBR4,R1,R5
WAR 冲突:在上一条指令读之前就已经写入
S
T
A
M
(
x
)
,
R
3
A
D
D
R
3
,
R
4
,
R
5
{\rm STA \space\space M(x), R_3} \\ {\rm ADD \space\space R_3, R_4, R_5}
STAM(x),R3ADDR3,R4,R5
WAW 冲突:在上一条指令写之前就已经写入
M
U
L
R
3
,
R
1
,
R
2
A
D
D
R
3
,
R
4
,
R
5
{\rm MUL \space\space R_3, R_1, R_2} \\ {\rm ADD \space\space R_3, R_4, R_5}
MULR3,R1,R2ADDR3,R4,R5
③流水线的性能指标
吞吐率:单位时间内完成的指令数
T
P
=
n
(
k
+
n
−
1
)
Δ
t
TP = \frac{n}{(k+n-1)\Delta t}
TP=(k+n−1)Δtn
加速比:没有流水线和有流水线所用的时间比
S
=
k
n
k
+
n
−
1
S = \frac{kn}{k+n-1}
S=k+n−1kn
中断类型
{
外部中断(硬件中断)
{
非屏蔽中断
可屏蔽中断
内部中断(软件中断)
{
i
n
t
0
:除法错中断
i
n
t
1
:单步中断
i
n
t
3
:调试中断
i
n
t
o
:溢出中断
i
n
t
n
:指令中断
中断类型 \begin{cases} 外部中断(硬件中断) \begin{cases} 非屏蔽中断 \\ 可屏蔽中断 \end{cases} \\\,\\ 内部中断(软件中断) \begin{cases} int \space 0:除法错中断 \\ int \space 1:单步中断 \\ int \space 3:调试中断 \\ into:溢出中断 \\ int \space n:指令中断 \\ \end{cases} \\ \end{cases}
中断类型⎩⎨⎧外部中断(硬件中断){非屏蔽中断可屏蔽中断内部中断(软件中断)⎩⎨⎧int0:除法错中断int1:单步中断int3:调试中断into:溢出中断intn:指令中断