【王道计算机组成原理】

第一章 计算机系统概述

1.0 你好,我是计算机组成原理

  • 信息化世界


  • 大家都熟悉的硬件

CPU、内存、外存、显卡。。。


  • 计算机硬件能识别的数据

用低/高电平分别表示0/1

计算机硬件唯一能是识别的数据——二进制0/1


  • 什么是低电平/高电平?

字面意思,看划分标准,多大算高,多大算低


  • 用电信号传递数据

低电平表示0,高电平表示1


  • ???

数字、文字、图像如何用二进制表示?

CPU如何对二进制数进行加减乘除?

如何存储这些二进制数的?

如何从内存中取出想要的数据?

CPU如何识别和执行我们写的程序?

to be continue…


1.1 计算机的发展

  • 什么是计算机系统

计算机系统 = 硬件 + 软件

【硬件:计算机的实体,如主机、外设等】
【软件:由具有各类特殊功能的程序组成】

计算机性能的好坏取决于“软”,“硬”件功能的总和。

软件:

  • 系统软件:用来管理整个计算机系统
    Eg:操作系统、数据库管理系统(DBMS)、标准程序库网络软件、语言处理程序、服务程序
  • 应用软件:按任务需要编制成各个程序
    Eg:抖音、王者荣耀、迅雷、美图秀秀

  • 计算机硬件的发展
发展阶段 时间 逻辑元件 速度(次/秒) 内存 外存
第一代 1946-1957 电子管 几千-几万 汞延迟线、磁鼓 穿孔卡片、纸袋
第二代 1958-1964 晶体管 几万-几十万 磁芯存储器 磁带
第三代 1964-1971 中小规模集成电路 几十万-几百万 半导体存储器 磁带、磁盘
第四代 1972-现在 大规模、超大规模集成电路 上千万-万亿 半导体存储器 磁盘、磁带、光盘、半导体存储器
  • 电子管时代

第一台电子数字计算机:ENIAC (冯·诺依曼是设计顾问)
使用机器语言编程,纸带机(0101…),bug(小虫子…)
占地面积约170平方米
耗电量150千瓦
包含了17,468根真空管
运算速度: 5000次加法/秒
(体积超大,耗电量超大)

  • 晶体管时代

第一台使用晶体管线路的计算机: TRADIC
出现了面向过程的程序设计语言:FORTRAN
有了操作系统雏形
耗电量30瓦
包含了800只晶体管
(体积功耗降低)

  • 中小规模集成电路

将元件集成在基片上:

计算机主要用于科学计算等专业用途
高级语言迅速发展
开始有了分时操作系统

  • 大规模、超大规模集成电路

开始出现微处理器、微型计算机、个人计算机(PC)萌芽
操作系统: Windows、MacOs、Linux…
新的概念:并行、流水线、高速缓存、虚拟存储器…
(苹果A13制造工艺: 7nm(每个元件宽度7nm)拥有85亿个晶体管:)


  • 微处理器的发展

微型计算机的发展以微处理器技术为标志

机器字长:计算机一次整数运算所能 处理的二进制位数

操作系统位数:其 所依赖的指令集的 位数

微处理器 机器字长 年份 晶体管数目
8080 8位 1974
8086 16位 1979 2.9万
80286 16位 1982 13.4万
80386 32位 1985 27.5万
80486 32位 1989 120.0万
Pentium 64位(准) 1993 310.0万
Pentium pro 64位(准) 1995 550.0万
Pentium II 64位(准) 1997 750.0万
Pentium III 64位(准) 1999 950.0万
Pentium IV 64位 2000 3200.0万

  • 硬件的发展
时间 事件
1947年 贝尔实验室发明了“晶体管”(肖克利,三个发明者之一)
1955年 肖克利在硅谷创建肖克利实验室股份有限公司
1957年 八叛徒(traitorous eight)创立,后成立仙童半导体公司
1959年 仙童半导体公司发明了“集成电路
1965年 摩尔等人离开仙童,创立英特尔(Intel)
1969年 化童销售部负责人桑德斯离开仙童,创立AMD(Advanced Micro Devices)


  • 摩尔定律

摩尔定律 (就是“八叛徒”中的摩尔)
揭示了信息技术进步的速度
集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,整体性能也将提升一倍

半导体存储器的发展 (也符合摩尔定律)
1970年,仙童公司生产出第一个较大容量的半导体存储器
半导体存储器单芯片容量:1KB、4KB、16KB、 64KB、256KB、1MB、4MB、16MB、64MB、 256MB、1GB…


  • 软件的发展

编程语言:机器语言、汇编语言、FORTRAN、PASCAL、C++、Java

操作系统:DOS、Unix、Windows


  • 目前的发展趋势

“两极”分化:

一极是微型计算机向更微型化、网络化、高性能、多用途方向发展(智能手机)

另一极是巨型机向更巨型化、超高速、并行处理、智能化方向发展(神威·太湖之光)


1.2.1 计算机硬件的基本组成

  • 早期冯诺依曼机

ENIAC(手动接线来控制计算)(冯诺依曼是顾问)

存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。【冯诺依曼首次提出“存储程序”的概念】

→ 第一台采用冯诺依曼结构的计算机EDVAC( Electronic Discrete Variable Automatic Computer)

输入设备:将信息转换成机器能识别的形式
运算器:算术运算逻辑运算
存储器:存放数据和程序
输出设备:将结果转换成人们熟悉的形式
控制器:指挥程序运行

在计算机系统中,软件和硬件在逻辑上是等效的
Eg:对于乘法运算,可以设计一个专门的硬件电路实现乘法运算;也可以用软件的方式,执行多次加法运算来实现

特点

  1. 计算机由五大部件组成
  2. 指令和数据以同等地位存于存储器,可按地址寻访
  3. 指令和数据用二进制表示
  4. 指令由操作码地址码组成
  5. 存储程序:程序执行之前,数据和指令都会提前存到主存中
  6. 以运算器为中心【输入/输出设备与存储器之间的数据传送通过运算器完成】

  • 现代计算机的结构

以存储器为中心

CPU = 运算器 + 控制器

概念:

【辅存:eg:磁盘大小】


1.2.2 各个硬件的工作原理

  • 主存储器的基本组成

主存储器:

Memory Address Register(存储地址寄存器)
Memory Data Register(存储数据寄存器)
注:现在的计算机通常把MAR、MDR也集成在CPU内

存储体:数据在存储体内按地址存储;下图中,每个地址对应一个存储单元

存储单元:每个存储单元存放一串二进制代码
存储字(word):存储单元中二进制代码的组合;存储字长:存储单元中二进制代码的位数
存储元:即存储二进制的电子元件,每个存储元可存 1bit

→ MAR位数反映存储单元的个数
→ MDR位数 = 存储字长

eg:MAR = 4位 → 总共有2^4个存储单元
MDR =16位 → 每个存储单元可存放16bit,1个(word) = 16bit

易混淆
1个字节 (Byte) = 8bit
1B = 1个字节
1b = 1个bit

  • 运算器的基本组成

运算器:用于实现算术运算 (如: 加减乘除)、逻辑运算(如: 与或非)

ACC:累加器,用于存放操作数,或运算结果。Accumulator
MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。Multiple-Quotient Register
X:通用的操作数寄存器,用于存放操作数。
ALU:算术逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算。Arithmetic and Logic Unit

ACC 被加数、和 被减数、差 乘积高位 被除数、余
MQ 乘数、乘积低位
X 加数 减数 被乘数 除数

  • 控制器的基本组成

CU:控制单元,分析指令,给出控制信号 Control Unit
IR:指令寄存器,存放当前执行的指令 Instruction Register
PC:程序计数器,存放下一条指令地址,有自动加1功能 Program Counter


  • 计算机的工作过程

如上图:
初:(PC)=0,指向第一条指令的存储地址

#1:(PC) → MAR,导致(MAR)=0
#3:M(MAR) → MDR,导致(MDR)=000001 0000000101
#4:(MDR) → IR,导致(IR)=000001 0000000101
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“取数”指令
#6: Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR)=5
#8:M(MAR) → MDR,导致(MDR)=0000000000000010=2
#9:(MDR) → ACC,导致(ACC)=0000000000000010=2

取指令(#1~#4);分析指令(#5);执行取数指令(#6~#9)

上一条指令取指后PC自动+1,(PC)=1;执行后,(ACC)=2

#1:(PC) → MAR,导致(MAR)=1
#3:M(MAR) → MDR,导致(MDR)=000100 0000000110
#4:(MDR) → IR,导致(IR)= 000100 0000000110
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“乘法”指令
#6:Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR)=6
#8:M(MAR) → MDR,导致(MDR)=0000000000000011=3
#9:(MDR) → MQ,导致(MQ)=0000000000000011=3
#10:(ACC) → X,导致(X)=2
#11:MQ * (X) → ACC,由ALU实现乘法运算,导致(ACC)=6,如果乘积太大,则需要MQ辅助存储

取指令(#1~#4);分析指令(#5);执行乘法指令(#6~#11)

上一条指令取指后PC自动+1,(PC)=2;执行后,(ACC)=6

#1:(PC) → MAR,导致(MAR)=2
#3:M(MAR) → MDR,导致(MDR)= 000011 0000000111
#4:(MDR) → IR,导致(IR)= 000011 0000000111
#5:OP(IR) → CU,指令的操作码送到CU, CU分析后得知,这是“加法”指令
#6:Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR)=7
#8:M(MAR) → MDR,导致(MDR)=000000000000001=1
#9:(MDR) → X,导致(X)=0000000000000001=1
#10:(ACC)+(X) → ACC,导致(ACC)=7,由ALU实现加法运算

取指令(#1~#4);分析指令(#5);执行加法指令(#6~#10)

上一条指令取指后PC自动+1,(PC)=3;执行后,(ACC)=7

#1:(PC) → MAR,导致(MAR)=3
#3:M(MAR) → MDR,导致(MDR)=000010 0000001000
#4:(MDR) → IR,导致(IR)= 000010 0000001000
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“存数”指令
#6:Ad(IR) → MAR,指令的地址码送到MAR,导致(MAR)=8
#7:(ACC) → MDR,导致(MDR)=7
#9:(MDR) → 地址为8的存储单元,导致y=7

取指令(#1~#4);分析指令(#5);执行存数指令(#6~#9)

上一条指令取指后PC自动+1,(PC)=4

#1:(PC) → MAR,导致(MAR)=4
#3:M(MAR) → MDR,导致(MDR)=000110 0000000101
#4:(MDR) → IR,导致(IR)=000110 0000000101
#5:OP(IR) → CU,指令的操作码送到CU,CU分析后得知,这是“停机”指令
(利用中断机制通知操作系统终止该进程)

取指令(#1~#4);分析指令(#5);执行停机指令

CPU区分指令和数据依据:指令周期的不同阶段


1.2.3 计算机系统的层次结构

  • 计算机系统的层次结构

下层是上层的基础,上层是下层的扩展

【微指令:上一节中的#1、#2…这些小步骤】

【汇编语言指令和机器语言指令一一对应,“助记符”】


  • 三种级别的语言

编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次)

解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句(每次执行都要翻译)


  • 计算机体系结构 vs 计算机组成原理

计算机体系结构——机器语言程序员所见到的计算机系统的属性概念性的结构与功能特性(指令系统、数据类型、寻址技术、I/O机理)
【如何设计硬件与软件之间的接口,eg:有无乘法指令】

计算机组成原理一一实现计算机体系结构所体现的属性,对程序员“透明”(具体指的实现)
【如何用硬件实现所定义的接口,eg:如何实现乘法指令】

本专业说的”透明“,都是指看不见


1.3 计算机的性能指标

  • 存储器的性能指标

总容量 = 存储单元个数x存储字长 bit
= 存储单元个数x存储字长/8 Byte

Eg:MAR为32位,MDR为8位 → 总容量 = 2^32*8 bit =4 GB

ps:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536

2^10:K 2^20:M 2^30:G 2^40:T


  • CPU的性能指标

CPU主频:CPU内数字脉冲信号振荡的频率。

CPU时钟周期:单位微秒,纳秒

CPU主频时钟频率)= 1CPU时钟周期\frac{1}{CPU时钟周期};单位:赫兹,Hz

CPI(Clock cycle Per Instruction):执行一条指令所需的时钟周期数。【不同的指令,CPI不同。甚至相同的指令,CPI也可能有变化】

执行一条指令的耗时 = CPI * CPU时钟周期

Eg:某CPU主频为 1000Hz,某程序包含100条指令,平均来看指令的CPI=3,该程序在该CPU上执行需要多久?

Answer:100 * 3 * (1/100) = 0.3s

CPU执行时间整个程序的耗时)= CPU时钟周期数 / 主频 = (指令条数 * CPI) / 主频

IPS (Instructions Per Second ):每秒执行多少条指令。
IPS = 主频 / 平均CPI【主频:1s有多少时钟周期,平均CPI:每条指令需要多少时钟周期】

FLOPS (Floatingpoint Operations Per Second):每秒执行多少次浮点运算

KIPS、MIPS;KFLOPS、MFLOPS、GFLOPS、TFLOPS

注:此处K、G、T为数量单位:
K=Kilo=千 = 10^3
M=Million=百万=10^6
G=Giga=十亿=10^9
T=Tera=万亿= 10^12


  • 系统整体的性能指标

数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)

吞吐量:指系统在单位时间内处理请求的数量。
它取决于信息能多快地输入内存,CPU能多快地取指令,数据能多快地从内存取出或存入,以及所得结果能多快地从内存送给一台外部设备。这些步骤中的每一步都关系到主存,因此,系统吞吐量主要取决于主存的存取周期。

响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待时间。
通常包括CPU时间(运行一个程序所花费的时间)与等待时间(用于磁盘访问、存储器访问、I/O操作、操作系统开销等时间)。


  • 系统整体的性能指标(动态测试)

基准程序是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同程序的其它计算机性能进行比较。

【跑分软件】


  • 思考

:主频高的CPU一定比主频低的CPU快吗?
不一定,如两个CPU,A的主频为2GHz,平均CPI=10;B的主频1GHz,平均CPI=1…
IPS(A) < IPS(B)

:若A、B两个CPU的平均CPI相同(主频和上面相同),那么A一定更快吗?
也不一定,还要看指令系统,如 A不支持乘法指令,只能用多次加法实现乘法;而B支持乘法指令。

:基准程序执行得越快说明机器性能越好吗?
基准程序中的语句存在频度差异,运行结果也不能完全说明问题。


第二章 数据的表示和运算

数据如何在计算机中表示?
运算器如何实现数据的算数、逻辑运算?

2.1.1 进位计数制

  • 最古老的计数方法

符号反映权重

罗马数字的几种符号与对应权重:

符号 相应的阿拉伯数字
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

基于“加法”思想的计数方法,eg:Ⅳ、Ⅷ、Ⅸ……


  • 十进制计数法

古印度人发明的阿拉伯数字:0,1,2,3,4,5,6,7,8,9

符号所在的位置也反映权重:985 = 9 * 10^2 + 8 * 10^1 + 5 * 10^0

十进制KnK1K0.K1KmK_n…K_1K_0.K_{-1}…K_{-m}
= Kn10n++K1101+K0100K_n * 10^n+ …+K_1 * 10^1 + K_0*10^0
+K1101++Km10m+K_{-1} * 10^{-1}+…+K_{-m} * 10^{-m}

位权:eg:上面的10110n10^1、10^n……

进位计数制:”逢十进一


  • 推广:r进制计数法

r进制KnK1K0.K1KmK_n…K_1K_0.K_{-1}…K_{-m}
= Knrn++K1r1+K0r0K_n * r^n+ …+K_1 * r^1 + K_0*r^0
+K1r1++Kmrm+K_{-1} * r^{-1}+…+K_{-m} * r^{-m}

基数:每个数码位所用到的不同符号的个数,r进制的基数为r

二进制:0,1:

  • 可使用两个稳定状态的物理器件表示
  • 0,1 正好对应逻辑值 假、真。方便实现逻辑运算
  • 可很方便地使用逻辑门电路实现算术运算

  • 任意进制 → 十进制

二进制: 101.1 → 1 × 2^2 + 0 × 2^1 + 1 × 2^0 + 1 × 2^−1 = 5.5
四进制: 11.2 → 1 × 4^1 + 1 × 4^0 + 2 × 4^−1 = 5.5
八进制: 5.4 → 5 × 8^0 + 4 × 8^−1 = 5.5
十进制: 5.5 → 5 × 10^0 + 5 × 10^−1 = 5.5
十六进制: 5.8 → 5 × 16^0 + 8 × 16^−1 = 5.5

二进制位权:

-3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0.125 0.25 0.5 0 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536

  • 二进制 ↔ 八进制、十六进制

如:1111000010.01101

二进制 → 八进制:
3位一组,毎组转换成对应进制的符号

二进制 → 十六进制:
4位一组,毎组转换成对应进制的符号

注意:补位(上面的蓝色部分)

八进制、十六进制 → 二进制:
3C2.68H=1111000010.01101B3C2.68H = 1111000010.01101B
(3C2.68)16=(1111000010.01101)2(3C2.68)_{16} = (1111000010.01101 )_{2}


  • 各种进制的常见书写方式

二进制:(1111000010.01101)2(1111000010.01101)_2、1111000010.01101B

八进制:(332.68)8(332.68)_{8}

十六进制:(332.68)16(332.68)_{16}、332.68H0x332.68

十进制:(332.68)10(332.68)_{10}、332.68D


  • 十进制 → 任意进制

十进制 → r进制

如:75.3

  • 整数部分

假设r = 2:

简化:短除法

r 取其他值时,类似

  • 小数部分

假设r = 2:

简化:

注意:有的十进制小数无法用二进制精确表示,如上图的案例


  • 十进制 → 二进制(拼凑法)

王道视频链接32:33

感觉这个没必要


  • 真值、机器数

真值:符合人类习惯的数字

机器数:数字实际存到机器里的形式,正负号需要被“数字化”


  • 中国古代的二进制系统

太极生两仪,两仪生四象,四象生八卦


2.1.2 BCD码

BCD : Binary-Coded Decimal,用二进制编码的十进制

  • BCD码

背景:二进制 十进制之间的转换比较麻烦

解决:快速转换:一一对应 → BCD : Binary-Coded Decimal

4位二进制(可以表示16个数)表示一位十进制数(10个),冗余16 - 10 = 6

8421码的映射关系:【有权码】

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

手算方法:

机算方法:(修正: +6)

超出的数:1010~1 0010(9+9)

注:若相加结果在合法范围内,则无需修正

余3码:8421码 + 0011B【+3】【无权码】

0 1 2 3 4 5 6 7 8 9
0011 0100 0101 0110 0111 1000 1001 1010 1011 1100

2421码:改变权值定义【有权码】

0 1 2 3 4 5 6 7 8 9
0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

为了避免歧义:0~4的首位一定是0;5~9的首位一定是1


2.1.3 无符号整数的表示和运算

  • 无符号整数在计算机中的应用

无符号整数,即“自然数”,0,1,2……

C语言中的无符号整数:(位数不同,可表示数值范围不同)

1
2
unsigned short a = 1;	// 无符号整数 短整型 2B
unsigned int b = 2; // 无符号整数 整型 4B

无符号整数,在计算机硬件内,如何表示?

无符号整数的加法、减法运算是怎么用硬件实现的 ?


  • 无符号整数的表示

该计算机硬件能支持的无符号整数位数有上限,如下

Tips:现在的个人计算机机器字长通常是64位或至少32位

无符号整数:

  1. 全部二进制位都是数值位,没有符号位,第i位的位权是2i12^{i-1}
  2. n bit 无符号整数表示范围 0~2n12^{n-1},超出则溢出,意味着该计算机无法一次处理这么多
  3. 可以表示的最小的数 全0,可以表示的最大的数 全1.

  • 无符号整数的加法运算

计算机硬件如何做无符号整数的加法:从最低位开始,按位相加,并往更高位进位

【溢出的直接丢掉】


  • 无符号整数的减法运算

计算机硬件如何做无符号整数的减法:

  1. “被减数”不变,“减数”全部位按位取反末位+1减法变加法【不要纠结为什么,这需要数论的知识】
  2. 从最低位开始,按位相加,并往更高位进位

Tips:加法电路造价便宜,减法电路造价昂贵,若可将减法转变为加法,省钱!

eg:变形如下

进行加法:


2.1.4 带符号整数的表示和运算——原反补

  • 带符号整数在计算机中的应用

带符号整数,即“整数”,-2,-1,0,1,2……

C语言中的无符号整数:(位数不同,可表示数值范围不同)

1
2
short a = 1;	// 带符号整数 短整型 2B
int b = 2; // 带符号整数 整型 4B

带符号整数,在计算机硬件内,如何表示?

带符号整数的加法、减法运算是怎么用硬件实现的 ?


  • 带符号整数的表示

该计算机硬件能支持的带符号整数位数有上限,如下


  • 原码表示

常见的书面写法:xx = -19 [x][x]_原 = 1, 0010011【“,”隔开】
若未指明机器字长,也可以写作[x][x]_原 = 1, 10011

原码

  1. 符号位“0/1”对应“正/负”,剩余的数值位表示真值的绝对值
  2. 若机器字长n+1位,带符号整数的原码表示范围(2n1)x2n1-(2^n-1)\le x \le2^n-1
  3. 真值0有两种形式: +0 和 -0 ,[+0][+0]_原 = 0, 0000000;[0][-0]_原 = 1, 0000000

  • 原码的缺点

若按照上一节无符号整数的方法按位相加,结果并不是正确的。

原码的缺点:符号位不能参与运算,需要设计复杂的硬件电路才能处理,费钱! 贵!

解决:用补码表示真值——符号位可以参与运算


  • 原码→反码→补码的转换 (机算)


  • 原码、补码 快速转换技巧 (手算)

对于负数:补码→反码,可以直接减一,逆回来;补码→原码,即符号位不变,数值位取反,末尾+1;
但是我们现在用下面的方法,先转回原码,在变成反码,如下图:


  • 补码的加法运算(例)

补码数值位不能解读为“位权“

计算机硬件如何做补码加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位

结果补码是负数就转回原码;整数就不需要转了,因为是长一样的


  • 补码的减法运算(例)

对比上一节无符号整数的减法运算

[A][B]=[A]+[B][A]_补 - [B]_补 = [A]_补 + [-B]_补

接下来要解决的问题:已知“减数”的补码,如何求其负值的补码表示?

之后:

优点:用同一套电路即可处理所有的加减法,省钱!

计算机硬件如何做带符号数补码的减法:

  1. “被减数”不变,"减数全部位按位取反末位+1减法变加法
  2. 从最低位开始,按位相加,并往更高位进位

  • 知识点回顾与重要考点

Tips:计算机内部,所有进行带符号整数的加减法都要先转化为补码

[B][B][B]_补 \to[-B]_补快速转换技巧:从右往左找到第一个1,这个1左边的全部位按位取反】


2.1.5 原反补码的特性对比

小题考点

  • n + 1 bit 的合法表示范围
  • 最大的数怎么表示、最小的数怎么表示
  • 真值0的表示
  • 各种码的特性总结

原码反码的合法表示范围完全相同,都有两种方法表示真值0

补码的合法表示范围比原码多一个负数,只有一种方法表示真值0

常见考点:两个数A和B进行某种运算后,是否发生溢出? 手算做题可以带入十进制验证,是否超出合法范围
比如,n + 1 = 8时,带符号整数原码表示范围[-127, 127],补码表示范围[-128, 127],对于-64 + (-64) = -128,如果两个-64都是用原码表示,则-128超出范围了,如果是用补码表示则没有超出。


2.1.6 移码

  • 原、反、补、移码的转换


  • 移码

移码补码的基础上将符号位取反
注意:移码只能用于表示整数

移码表示的规律

移码表示的整数很方便用硬件电路对比大小

在下面2.3.2 IEEE 754补充说明了移码的内容


  • 各种码的特性总结

原码反码的合法表示范围完全相同,都有两种方法表示真值0

补码的合法表示范围比原码多一个负数只有一种方法表示真值0

移码的合法表示范围比原码多一个负数只有一种方法表示真值0


2.1.7 定点小数

  • 定点整数、定点小数

定点数:定点整数(即:带符号整数)、定点小数

  • 定点整数

定点整数的编码表示:原码、反码、补码移码

  • 定点小数

定点小数的编码表示:原码、反码、补码


  • 原码

各个bit“位权”不一样


  • 定点小数原/反/补码的转换

和定点整数是一样的:


  • 定点小数加/减运算

对两个定点小数A、B进行加法/减法时,需要先转换为补码

计算机硬件如何做定点小数补码加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位

计算机硬件如何做定点小数补码的减法:

  1. “被减数”不变,"减数全部位按位取反末位+1减法变加法
  2. 从最低位开始,按位相加,并往更高位进位

  • 定点整数 VS 定点小数

特别注意:位数扩展时,拓展位置不一样


  • 定点小数补码的加法运算(例)

计算机硬件如何做补码加法:从最低位开始,按位相加(符号位参与运算),并往更高位进位


  • 定点小数补码的减法运算(例)

计算机硬件如何做带符号数补码的减法:

  1. “被减数”不变,"减数全部位按位取反末位+1减法变加法
  2. 从最低位开始,按位相加,并往更高位进位

2.2.0 奇偶校验码(大纲已删)

为了发现错误

王道计算机网络 | ggw和xpl的博客 (gxblogs.netlify.app)第三章 数据链路层中 3、差错控制(检错编码)有提到

  • 奇偶校验码

奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数

偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数

【就是看有效信息位1的个数,看在校验位补0,还是补1,能让整体变成奇数或者偶数】

【例2-3】给出两个编码1001101和1010111的奇校验码和偶校验码;设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:

奇校验:11001101 01010111
偶校验:01001101 11010111

偶校验的硬件实现:各信息进行异或(模2加)运算,得到的结果即为偶校验位
对于上面的题目:

求偶校验位:1⊕0⊕0⊕1⊕1⊕0⊕1 = 0 1⊕0⊕1⊕0⊕1⊕1⊕1 = 1

偶校验码进行偶校验(所有位进行异或,若结果为1说明出错,准确的说是出现奇数个错误):
0⊕1⊕0⊕0⊕1⊕1⊕0⊕1 = 0
1⊕1⊕0⊕1⊕0⊕1⊕1⊕1 = 0
1⊕1⊕0⊕1⊕0⊕1⊕1⊕0 = 1 错
1⊕1⊕0⊕1⊕0⊕1⊕00 = 0 对(其实是错的)

奇偶校验码特点:
只能检查出奇数个比特错误,检错能力为50%(奇数个比特位出错,才能检验出来)

相同的:
奇校验码进行奇校验(所有位进行异或,若结果为0说明出错,准确的说是出现奇数个错误):


2.2.1 电路的基本原理、加法器的设计

  • 算术逻辑单元ALU
    Arithmetic Logic Unit

功能

  1. 算术运算:加、减、乘、除等
  2. 逻辑运算:与、或、非、异或等
  3. 辅助功能:移位,求补等

ALU如下图【图中看不清的是:AiBiFiA_i、B_i、F_i】,控制信号由控制单元CU发出

实例:


  • 最基本的逻辑运算

门电路的输入/输出信号本质上是高电平或者低电平

优先级:与 > 或(类比乘除,加减)

eg:AB + CD 先算与,再算或

A(C +D) = AC + AD —— 分配率
(AB)C = A(BC) —— 结合律
(A + B) + C = A + (B + C) —— 结合律
这样可以简化表达式,在硬件实现时可以用更少的门电路单元实现相同的效果。

Tips:本质上逻辑表达式是对电路的数学化描述,简化逻辑表达式,就是在简化电路,就是在省钱


  • 复合逻辑

【上图中门电路看不清的符号是:&=1==1\&、\ge、=1、=\,=1

反演律:(离散数学:德摩根律)
A+B=AB\overline{A+B} = \overline{A}·\overline{B}
AB=A+B\overline{A·B} = \overline{A}+\overline{B}

异或门可用与、或、非 组合实现:
A和B不同
→ A = 0 且 B = 1 或 A = 1 且 B = 0
AB+AB\overline{A}·B+ A·\overline{B},如下图:

异或的天然逻辑“加法”、“奇偶校验”


  • 门电路实现奇偶校验位

回忆 2.2.0 奇偶校验码

异或门实现奇偶校验如下:

求偶校验位:
1⊕0⊕0⊕1⊕1⊕0⊕1 = 0

逻辑表达式是对电路的数学化描述

((1⊕0)⊕(0⊕1))⊕((1⊕0)⊕1) = 0:

((((((1⊕0)⊕0)⊕1)⊕1)⊕0)⊕1) = 0:


  • 一位全加器

分析:

硬件实现:

抽象出来:一位全加器FA,full adder


  • 串行加法器

串行加法器:只有一个全加器,数据逐位串行送入加法器中进行运算。进位触发器用来寄存进位信号,以便参与下一次运算。

如果操作数长n位,加法就要分n次进行,每次产生一位和,并且串行逐位地送回寄存器。【这样的效率较低】


  • 并行加法器

串行进位的并行加法器:把n个全加器串接起来,就可进行两个n位数的相加。【这样其实也要等前一位算完,才能算出后一位的结果】

串行进位又称为行波进位,每一级进位直接依赖于前一级的进位,即进位信号是逐级形成的。


2.2.2 并行进位的加法器

不是考试的重点,大致了解即可

  • 串行进位的并行加法器

如上一小节所说,运算速度很大程度的受到进位速度的影响。


  • 并行加法器的优化

并行进位的并行加法器:各级进位信号同时形成,又称为先行进位、同时进位

说明如下:

Ci=AiBi+(AiBi)Ci1Ci=AiBi+(AiBi)(Ai1Bi1+(Ai1Bi1)Ci2)Ci=AiBi+(AiBi)(Ai1Bi1+(Ai1Bi1)(Ai2Bi2+(Ai2Bi2)Ci3))\begin{array}{l}C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right) C_{i-1} \\C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right)\left(A_{i-1} B_{i-1}+\left(A_{i-1} \oplus B_{i-1}\right) C_{i-2}\right) \\C_{i}=A_{i} B_{i}+\left(A_{i} \oplus B_{i}\right)\left(A_{i-1} B_{i-1}+\left(A_{i-1} \oplus B_{i-1}\right)\left(A_{i-2} B_{i-2}+\left(A_{i-2} \oplus B_{i-2}\right) C_{i-3}\right)\right)\\……\end{array}

最终可以展开到C0C_0

记:

Gi=AiBiPi=AiBi\mathrm{G}_{\mathrm{i}}=A_{i} B_{i} \\\mathrm{P}_{\mathrm{i}}=A_{i} \oplus B_{i}

化简:

C1=G1+P1C0C2=G2+P2C1=G2+P2G1+P2P1C0C3=G3+P3C2=G3+P3G2+P3P2G1+P3P2P1C0C4=G4+P4C3=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0\begin{array}{l} C_{1}=G_{1}+P_{1} C_{0} \\C_{2}=G_{2}+P_{2} C_{1}=G_{2}+P_{2} G_{1}+P_{2} P_{1} C_{0} \\C_{3}=G_{3}+P_{3} C_{2}=G_{3}+P_{3} G_{2}+P_{3} P_{2} G_{1}+P_{3} P_{2} P_{1} C_{0} \\C_{4}=G_{4}+P_{4} C_{3}=G_{4}+P_{4} G_{3}+P_{4} P_{3} G_{2}+P_{4} P_{3} P_{2} G_{1}+P_{4} P_{3} P_{2} P_{1} C_{0}\\……\end{array}

但是继续套娃会导致电路越来越复杂;经典的做法是适可而止:由4个FA和一些新的线路、运算逻辑组成加法器,如下图:


2.2.3 补码加减运算器

  • 加法器原理

例1:A=1000,B=0111,Cin=0
则 F=1111, Cout=0

例2:A=1000,B=0111,Cin=1
则 F=0000,Cout=1


  • 补码加/减法运算方法

n bit补码 X + Y,按位相加即可;

n bit补码 X - Y,将补码Y全部按位取反,末位加1,得到[Y][-Y]_补,减法变加法。

例1:4 bit补码,X=-8,Y=7。XX_补=1000, YY_补=0111
X+Y = 1111B
X-Y = 1000 + (1000+1) = 10001 = 运算结果只保留低四位,最高位进位丢弃(发生溢出),答案是错的

例2:4 bit补码,X=3,Y=4。XX_补=0011, YY_补=0100
X+Y = 0111B
X-Y = 0011 + (1011+1) = 1111B

给硬件加上减法的逻辑如下:

例1:4 bit补码,X=-8,Y=7。XX_补=1000, YY_补=0111
X+Y = 1111B = -1D
X-Y = 1000 + (1000+1) = 10001 = 1D✘运算结果只保留低四位,最高位进位丢弃(发生溢出),答案是错的

例2:4 bit补码,X=3,Y=4。XX_补=0011, YY_补=0100
X+Y = 0111B = 7D
X-Y = 0011 + (1011+1) = 1111B = -1D

无符号整数的加法/减法也可用该电路实现

例1:无符号数X=8,Y=7;用4bit表示,X=1000B, Y=0111B
X+Y =1111B = 15D
X-Y =1000 + (1000+1)= 10001= 1D✔ 运算结果只保留低四位,最高位进位丢弃,这里却是对的【是因为有符号数和无符号数判断溢出的方式不同,看下一节标志位的生成】

例2:无符号数X=3,Y=4;用4bit表示,X=0011B, Y=0100B
X+Y = 0111B = 7D
X-Y = 0011 +(1011+1) = 1111B = 15D


2.2.4 标志位的生成

对上一节加法器进行补充:

标志位 英文全称 含义
OF Overflow Flag 溢出标志。溢出时为1,否则置0
SF Sign Flag 符号标志。运算结果为负数时SF位置1,否则置0
ZF Zero Flag 零标志。运算结果为0时ZF位置1,否则置0
CF Carry Flag 进位/借位标志。进位/借位时置1,否则置0

对于上一节的例子:

例1:4 bit补码,X=-8,Y=7。XX_补=1000, YY_补=0111
X+Y = 1111B = -1D
X-Y = 1000 + (1000+1) = 10001 = 1D✘运算结果只保留低四位,最高位进位丢弃(发生溢出),答案是错的
X-Y:OF = 1;SF = 0;ZF = 0;CF = 1

例2:4 bit补码,X=3,Y=4。XX_补=0011, YY_补=0100
X+Y = 0111B = 7D
X-Y = 0011 + (1011+1) = 1111B = -1D
X-Y:OF = 0;SF = 1;ZF = 0;CF = 0

例1:无符号数X=8,Y=7;用4bit表示,X=1000B, Y=0111B
X+Y =1111B = 15D
X-Y =1000 + (1000+1)= 10001= 1D✔ 运算结果只保留低四位,最高位进位丢弃,这里却是对的
X-Y:OF = 1;SF = 0;ZF = 0;CF = 0

例2:无符号数X=3,Y=4;用4bit表示,X=0011B, Y=0100B
X+Y = 0111B = 7D
X-Y = 0011 +(1011+1) = 1111B = 15D
X-Y:OF = 0;SF = 1;ZF = 0;CF = 1


2.2.5 定点数的移位运算

  • 算数移位

r进制KnK1K0.K1KmK_n…K_1K_0.K_{-1}…K_{-m}
= Knrn++K1r1+K0r0K_n * r^n+ …+K_1 * r^1 + K_0*r^0
+K1r1++Kmrm+K_{-1} * r^{-1}+…+K_{-m} * r^{-m}

对于数:985.211

9852.11 小数点后移1位相当于 × 10¹
98521.1 小数点后移2位相当于 × 10²

98.5211 小数点前移1位相当于 ÷ 10¹
9.85211 小数点前移2位相当于 ÷ 10²

移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法

先看后面的详细描述,以下是总结

左移相当于 × 2;右移相当 ÷ 2
由于位数有限,因此有时候无法用算数移位精确地等效乘除法


  • 原码的算数移位

原码的算数移位–符号位保持不变,仅对数值位进行移位。

右移:高位补0,低位舍弃。若舍弃的位=0,则相当于÷2;若舍弃的位≠0,则会丢失精度

左移:低位补0,高位舍弃。若舍弃的位=0,则相当于×2;若舍弃的位≠0,则会出现严重误差

例:原码如下:

右移:

左移:

定点小数同理:


  • 反码的算数移位

反码的算数移位一一正数的反码与原码相同,因此对正数反码的移位运算也和原码相同
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。

反码的算数移位一一负数的反码数值位与原码相反,因此负数反码的移位运算规则如下:
右移:高位补1,低位舍弃。
左移:低位补1,高位舍弃


  • 补码的算数移位

补码的算数移位一一正数的补码与原码相同,因此对正数补码的移位运算也和原码相同
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。

补码的算数移位一一负数补码=反码末位+1导致反码最右边几个连续的1都因进位而变为0,直到进位碰到第一个0为止。
规律一一负数补码中,最右边的1及其右边同原码。最右边的1的左边同反码
负数补码的算数移位规则如下:
右移(同反码):高位补1,低位舍弃
左移(同原码):低位补0,高位舍弃


  • 算数移位的应用举例

乘法【后面会进一步探讨乘法】:

Eg:-20 × 7

7D = 111B = 2º + 2¹ + 2²


  • 逻辑移位

逻辑右移:高位补0,低位舍弃

逻辑左移:低位补0,高位舍弃


  • 逻辑移位的应用举例

RGB颜色值的存储:

如图PaleTurquoise4的RGB值为(R=102, G=139, B=139),如果用3B来存储:

  1. 用3B存储无符号数102,并逻辑左移16位

  1. 用3B存储无符号数139,并逻辑左移8位

  1. 用3B存储无符号数139

  1. 相加得3B的RGB值:


  • 循环移位

ROL(向左循环移位)、ROR(向右循环移位)、RCL(向左循环移位并带进位)和RCR(向右循环移位并带进位)

例如:

1
2
3
4
5
Copy Code; 以16位无符号整数0xABCD为例
mov ax, 0xABCD ; AX = 1010 1011 1100 1101
rol ax, 1 ; AX = 0101 0111 1001 1011,CF = 1
rol ax, 2 ; AX = 0011 1100 1101 1110,CF = 1
rol ax, 3 ; AX = 0111 1001 1011 1100,CF = 0

  • 循环移位的应用举例

大端存储 ↔ 小端存储

大端存储:先存高字节,再存低字节;小端存储:先存低字节,再存高字节

假设一个单位用2B来存储,则循环位移8位可以实现大端存储 ↔ 小端存储的转换。


加减法运算和溢出判断(补自2019版视频)

视频链接——直接空降

  • 符号扩展

原码:补0

0,1111 → 0,0001111
1,11000 → 1,0011000

补码:正数补0,负数补1

0,1111 → 0,0001111
1,01000 → 1,1101000


  • 溢出判断

设机器字长为8位(含1位符号位),A=15,B=-24,C=124,求求[A+C][A+C]_补[BC][B-C]_补.

方法一:采用一位符号位设A的符号为ASA_S,B的符号为BSB_S,运算结果的符号为SSS_S,则溢出逻辑表达式:

V=ASBSSS+ASBSSsV=A_{\mathrm{S}} B_{\mathrm{S}} \overline{S_{\mathrm{S}}}+\overline{A_{\mathrm{S}}} \,\overline{B_{\mathrm{S}}} S_{\mathrm{s}}

若V=0,表示无溢出;
若V=1,表示有溢出。

方法二:采用一位符号位,根据数据位进位情况判断溢出;符号位的进位CSC_S,最高数位的进位C1C_1

符号位的进位CSC_S 最高数位的进位C1C_1
正溢出 0 1
负溢出 1 0

即:CSC_SC1C_1不同时有溢出

方法三:采用双符号位正数符号为00,负数符号为11
结果的符号位为10(负溢出)、01(正溢出),表示溢出

[A+C][A+C]_补 = 00,0001111 + 00,1111100 = 01,0001011 —— 正溢出
[BC][B-C]_补 = 11,1101000 + 11,0000100 = 10,1101100 —— 负溢出

采用双符号位的移位运算:低位符号位参与移位,高位符号位代表真正的符号

实际存储的时候双符号位只存一位。


2.2.6 1、原码的乘法运算

  • 手算乘法(二进制)

考虑用机器实现:

  1. 实际数字有正负,符号位如何处理?
  2. 乘积的位数扩大一倍,如何处理?
  3. 4个位积都要保存下来最后统一相加?

  • 原码一位乘法

设机器字长为n+1=5位(含1位符号位),[x][x]_原=1.1101,[y][y]_原=0.1011,采用原码一位乘法求x·y

  • 符号单独处理:符号位 = xsx_sysy_s
  • 数值位取绝对值进行乘法计算:0.1101 × 0.1011(和手算那个例子相同,看一下上面那个图)

【回顾知识】:运算器的基本组成

ACC 被加数、和 被减数、差 乘积高位 被除数、余
MQ 乘数、乘积低位
X 加数 减数 被乘数 除数

实现方法:先加法再移位,重复n次【数值位为n位,本例中是4】

  1. 加法:[ACC] + [x] = [ACC],当前位【看图】是1才执行,否则 + 0
  2. 移位:[ACC, MQ],一起逻辑右移
  3. 最后加上符号位

【图中红色部分(表中粗体)称为部分积

过程[ACC, MQ]
1. [00000, 01011],初始ACC置0
2. [01101, 01011],当前位1,+[x]
3. [00110, 10101],移位
4. [10011, 10101],当前位1,+[x]
5. [01001, 11010],移位
6. [01001, 11010],当前位0,+0
7. [00100, 11101],移位
8. [10001, 11101],当前位1,+[x]
9. [01000, 11110],移位
10. [01000, 11110],当前位是原来的符号位,不参与运算
11. [1.1000, 11110],小数点其实是隐藏的,再加上符号位

  • 原码一位乘法(手算模拟)

设机器字长为5位(含1位符号位,n=4),x=-0.1101,y=+0.1011,采用原础一位乘法求x·y
解:|x| = 00.1101,|y| = 00.1011,原码一位乘法的求解过程如下:

符号位PsP_s = xsx_sysy_s = 1 ⊕ 0 = 1,得到x·y = -0.1000, 1111

Tips:

  • 乘数的符号位不参与运算,可以省略
  • 原码一位乘可以只用单符号位,图中00. ……,这是双符号位
  • 答题时最终结果最好写为原码机器数

原码一位乘法:机器字长n+1,数值部分占n位

  • 符号位通过异或确定;
  • 数值部分通过被乘数和乘数绝对值的n轮加法、移位完成根据当前乘数中参与运算的位确定(ACC)加什么。若当前运算位=1,则(ACC)+[x][|x|]_原;若=0,则(ACC)+0。
  • 每轮加法后ACC、MQ的内容统一逻辑右移

2.2.6 2、补码的乘法运算

  • 补码一位乘法

设机器字长为5位(含1位符号位,n=4),x=-0.1101,y=+0.1011,采用Booth算法求x·y

[x][x]_补 = 1.0011,[x][-x]_补 = 0.1101,[y][y]_补 = 0.1011

原码一位乘法:

  • 进行n轮加法、移位

  • 每次加法可能是 +0、+[x][|x|]_原

    根据当前MQ中的最低位来确定加什么

    • MQ中最低位 = 1时,(ACC)+[x][|x|]_原
    • MQ中最低位 = 0时,(ACC)+0
  • 每次移位是“逻辑右移

  • 符号位参与运算

补码一位乘法:

  • 进行n轮加法、移位,最后再多一次加法

  • 每次加法可能是 +0、+[x][x]_补、+[x][-x]_补

    根据当前MQ中的最低位辅助位来确定加什么

    • 辅助位 - MQ中“最低位” = 1时,(ACC) + [x][x]_补
    • 辅助位 - MQ中”最低位“ = 0时,(ACC) + 0
    • 辅助位 - MQ中“最低位” = -1时,(ACC) + [x][-x]_补

    【实际上最低位就是辅助位,但是我们原码用的那个最低位,我们保持一致,所以这里最低位指的是下图中的灰色部分】

  • 每次移位是“补码的算数右移

  • 符号位参与运算【因为最后多一次加法,加什么用到了符号位,就是辅助位 - MQ中最低位(这时是符号位),看下面手算的那个图】


  • 补码一位乘法(手算模拟)

设机器字长为5位(含1位符号位,n=4),x=-0.1101,y=+0.1011,采用Booth算法求x·y

[x][x]_补 = 1.0011,[x][-x]_补 = 0.1101,[y][y]_补 = 0.1011

[xy][x·y]_补 = 11.01110001
即x·y = -0.10001111


2.2.7 1、原码的除法运算

  • 手算除法(二进制)

设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,求x/y

x/y结果为0.1101,余数为0.00000111

规律:忽略小数点,每确定一位商,进行一次减法,得到4位余数,在余数末尾补0,再确定下一位商。确定5位商即可停止(机器字长为5位)


  • 原码除法:恢复余数法

【知识回顾】:运算器的基本组成

ACC 被加数、和 被减数、差 乘积高位 被除数、余
MQ 乘数、乘积低位
X 加数 减数 被乘数 除数

设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,求x/y
|x|=0.1011,|y|=0.1101,[y][|y|]_补=0.1101,[y][-|y|]_补 =1.0011

  • 符号单独处理:符号位 = xsx_sysy_s
  • 数值位取绝对值进行除法计算:0.1011 ÷ 0.1101(和手算那个例子相同,看一下上面那个图)

实现方法:上商0/1,得到余数,余数末尾补0

手算时,每一位商取0/1是通过判断当前余数和除数的大小确定的;
计算机很傻,会先默认上商1,如果搞错了再改上商0。并“恢复余数

  1. 先商1,ACC + [y][-|y|]_补 = ACC
  2. 判断余数是否为负数,即符号位是否为1,是负数要恢复余数ACC + [y][|y|]_补 = ACC,并且商0
  3. 逻辑左移,补0
  4. 最后加上符号位

后面手算的例子又是看余数,再上商,这块看看题怎么考吧,问题不大

过程[ACC, MQ]
1. [01011, 00000],初始MQ置0
2. [11110, 00001],先上商1,减去除数
3. [01011, 00000],发现余数(ACC)是负数,恢复余数(加上除数),商0
4. [10110, 00000],逻辑左移
5. [01001, 00001],先上商1,减去除数
6. [10010, 00010],逻辑左移
7. [00101, 00011],先上商1,减去除数
8. [01010, 00110],逻辑左移
9. [11101, 00111],先上商1,减去除数
10. [01010, 00110],发现余数(ACC)是负数,恢复余数 (加上除数),商0
11. [10100, 01100],逻辑左移
12. [00111, 01101],先上商1,减去除数
左移n次,上商n+1次,最后不用左移了,但是如果这里是负数,是需要恢复一下的
13. [00111, 0.1101],小数点其实是隐藏的,再加上符号位
商=0.1101
余数=0.0111 * 2^-n
注:余数的正负性与商相同

  • 原码除法:恢复余数法(手算模拟)

设机器字长为5位(含1位符号位,n=4),x=0.1011,y=0.1101,求x/y
|x|=0.1011,|y|=0.1101,[y][|y|]_补=0.1101,[y][-|y|]_补 =1.0011

左移n次,上商n+1次
最后一次上商余数不左移


  • 原码除法:加减交替法
    又称:不恢复余数法

【思考】能否不恢复余数

img

若余数为负,则可直接商0,并让余数左移1位再加上|除数|,a → 2a + b

  • 若余数为负,则可直接商0,让余数左移1位再加上|除数|,得到下一个新余数
  • 若余数为正,则商1,让余数左移1位再减去|除数|,得到下一个新余数

但是如果最后是负值,是需要恢复 + [y][|y|]_补一下的,所以也是需要恢复的。

注:余数的正负性与商相同

加减法:n+1次,每次加减确定一位商;
左移n次(最后一次加减完不移位)最终可能还要再多一次加减法


2.2.7 2、补码的除法运算

  • 补码除法:加减交替法

补码除法:

  • 符号位参与运算
  • 被除数/余数、除数采用双符号位

初始:

  • 被除数和除数同号,则被除数减去除数;
  • 异号则被除数加上除数。

每产生一次余数:

  • 余数和除数同号,商1,余数左移一位减去除数
  • 余数和除数异号,商0,余数左移一位加上除数
  • 重复n次

最后末尾恒置为1


  • 除法运算总结回顾


2.2.8 C语言类型转换

  • 强制类型转换

注:C语言中定点整数是用“补码”存储的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void main(){
short x = -4321; // short型占用2个字节
unsigned short y = (unsigned short)x;
/*
无符号数与有符号数:不改变数据内容,改变解释方式。
x: 1110 1111 0001 1111 (补码)
y: 1110 1111 0001 1111 (原码) 真值61215
*/

int a = 165537,b = -34991; // int型占用4个字节
short c = (short)a, d = (short)b; // short型占用2个字节
/*
长整数变短整数:高位截断,保留低位
a: 0x000286a1
c: 0x86a1 真值-31071
b: 0xfF7751
d:0x7751 真值30545
*/

short x = -4321;
int m = x;
unsigned short n = (unsigned short)x;
unsigned int p = n;
/*
短整数变长整数:符号扩展。
x: 1110 1111 0001 1111 —— 0xef1f
m: 1111 1111 1111 1111 1110 1111 0001 1111 —— 0xffffef1f 真值-4321
n: 1110 1111 0001 1111 —— 0xef1f 真值61215
p: 0000 0000 0000 0000 1110 1111 0001 1111 —— 0x0000ef1f 真值61215
*/
}

2.2.9 数据的存储和排列

  • 大小端模式

多字节数据在内存里一定是占连续的几个字节。

大端模式:便于人类阅读
小端模式:便于机器处理


  • 边界对齐

现代计算机通常是按字节编址,即每个字节对应1个地址

通常也支持按字、按半字、按字节寻址。

假设存储字长为32位,则1个字=32bit,半字=16bit。

假设:每次访存只能读/写1个字,则存储分为如下两种:

访问一个字/半字,都只需一次访存。

访问一个字/半字,需要1~2次访存。
例如:上图2.11半字1,首先访存一个字,读到半字1-1,再访存一次,读到半字1-2,这样才读完整个半字1


2.3.1 浮点数的表示

  • 浮点数的作用和基本原理
  • 浮点数规格化
  • 浮点数的表示范围(大纲已删)
  • 定点数的局限性

定点数可表示的数字范围有限,但我们不能无限制地增加数据的长度。

如何在位数不变的情况下增加数据表示范围?


  • 从科学计数法理解浮点数

普通计数法:
+302657264526

科学计数法:
+3.026 * 10^11

→+11(阶码) +3.026(尾数)


  • 浮点数的表示

r进制KnK1K0.K1KmK_n…K_1K_0.K_{-1}…K_{-m}
= Knrn++K1r1+K0r0K_n * r^n+ …+K_1 * r^1 + K_0*r^0
+K1r1++Kmrm+K_{-1} * r^{-1}+…+K_{-m} * r^{-m}

定点数:如纯小数0.1011和纯整数11110

浮点数:

阶码: 常用补码或移码表示的定点整数

尾数: 常用原码或补码表示的定点小数

浮点数的真值N = r^E × M(N:真值,r:阶码的底,通常为2,E:阶码,M:尾数)

阶码E反映浮点数的表示范围及小数点的实际位置;
尾数M的数值部分的位数n反映浮点数的精度。

尾数给出一个小数,阶码指明了小数点要向前/向后移动几位

【例】:阶码、尾数均用补码表示,求a、b的真值
a = 0,01; 1.1001
b = 0,10; 0.01001
这里用, ; .作符号位、阶码、尾数的分割。

【答】:a的真值 = 2^1 x (-0.0111) = -0.111【这里2^1,相当于尾数表示的定点小数算数左移一位,或小数点右移一位】
b的真值 =2^2 x (+0.01001) = +1.001

这里用1B存储b,发现存不下

→浮点数尾数规格化


  • 浮点数尾数规格化

对于上面的例子:

b = 2^2 x (+0.01001) = 2^1 x (+0.10010)

尾数算数左移1位,阶码减1。直到尾数最高位是有效值 (左规),【右移就是右规

规格化浮点数:规定尾数的最高数值位必须是一个有效值

  • 左规:当浮点数运算的结果为非规格化时要进行规格化处理,
    尾数算数左移一位,阶码减1
  • 右规:当浮点数运算的结果尾数出现溢出(双符号位为0110) 时,
    尾数算数右移一位,阶码加1

【例】:a = 010;00.1100,b = 010;00.1000,求a+b
a = 2^2 x 00.1100,b = 2^2 x 00.1000
a+b = 2^2 x 00.1100 + 2^2 x 00.1000
= 2^2 x (00.1100 + 00.1000) =
2^2 x 01.0100 —— (右规)
= 2^3 x 00.1010

注:采用“双符号位”,当溢出发生时,可以挽救。更高的符号位是正确的符号位。


  • 规格化浮点数的特点
  1. 用原码表示的尾数进规格化:

    • 正数为0.1X……X的形式,其最大值表示为0.11…1;最小值表示为0.10…0
      尾数的表示范围为1/2 ≤ M ≤ (1 - 2^-n)。
    • 负数为1.1X……X的形式,其最大值表示为1.10…0;最小值表示为1.11…1
      尾数的表示范围为-(1 - 2^-n) ≤ M ≤ -1/2。

    规格化的原码尾数,最高数值位一定是1

  2. 用补码表示的尾数进行规格化:

    • 正数为0.1x x…的形式,其最大值表示为0.11…1;最小值表示为0.10…0。
      尾数的表示范围为1/2 ≤ M ≤ (1 - 2^-n)。
    • 负数为1.0X x…的形式,其最大值表示为1.01…1;最小值表示为1.00…0。
      尾数的表示范围为-1≤ M ≤ -(1/2 + 2^-n)。

    规格化的补码尾数,符号位与最高数值位一定相反

eg:若某浮点数的阶码、尾数用补码表示,共4+8位:
0.110;1.1110100如何规格化?
注:补码算数左移,低位补0;补码算数右移,高位补1


  • 浮点数的表示范围

下图内容大纲已删:

抛出异常 (中断)


2.3.2 IEEE 754

浮点数标准:IEEE 754(读作:I trible E 754)

  • 移码

移码的定义:移码 = 真值 + 偏置值

此处8位移码的偏置值 = 128D = 1000 0000B,即:2n12^{n-1}

偏置值一般此取 2n12^{n-1},此时移码 = 补码符号位取反

例子
真值 = -127 = -1111111B
移码 = -1111111 + 10000000 = 0000 0001
真值 = -3 = -11B
移码 = -11 + 10000000 = 0111 1101
真值 = +0 = +0
移码 = +0 + 10000000 = 1000 0000
真值 = +3 = +11B
移码 = +11 + 10000000 = 1000 0011
真值 = +127 = +1111111B
移码 = +1111111 + 10000000 = 1111 1111

偏置值也可以取其他值,IEEE 754阶码用移码表示,其中移码的偏置值为2n12^{n-1}-1

令偏置值=127D=0111 1111B,即2n12^{n-1}-1

例子
真值 = -128 = -10000000B
移码 = -1000 0000 + 01111111 = 1111 1111
真值 = -127 = -111 1111B
移码 = -111 1111 + 01111111 = 0000 0000
真值 = -126 = -1111110B
移码 = -111 1110 + 01111111 = 0000 0001
真值 = +0 = +0
移码 = +0 +01111111 = 0111 1111
真值 = +127 = +1111111B
移码 = +111 1111 + 01111111 = 1111 1110


  • IEEE 754标准

阶码全1、全0用作特殊用途
尾数实际上是1.M

float:
1000 0001 1000 1010 0101 0000 1000 0000
double:
1000 0001 1100 0010 0101 0000 1000 0000 0000 0000 0001 1111 0000 0000 0000 0000

阶码真值 = 移码 - 偏移量

规格化的短浮点数的值为:(1)s×1.M×2E127(-1)_s \times 1.M \times 2^{E-127}
规格化长浮点数的真值为:(1)s×1.M×2E1023(-1)_s \times 1.M \times 2^{E-1023}

例题
例:将十进制数-0.75转换为IEEE 754的单精度点数格式表示
(0.75)10=(0.11)2=(1.1)2×21(-0.75)_{10}=(-0.11)_2 =(-1.1)_2\times2^{-1}
数符 = 1
尾数部分 = .1000000…(隐含最位1)
阶码真值 = -1
单精度浮点型偏移量 =127D
移码 = 阶码真值 + 偏移量 = -1 + 1111111= 0111 1110 (凑足8位)
1 01111110 10000000000000000000000
例:IEEE 754的单精度浮点数 C0 A0 00 00 H的值时多少
(阶码不是全0也不是全1)
C0 A0 00 00 H → 1100 0000 1010 0000 0000 0000 0000 0000
数符 = 1 → 是个负数
尾数部分 = .0100…(隐含最高位1) → 尾数真值 = 1.01B
移码 = 10000001,若看作无符号数 = 129D
阶码真值 = 移码 - 偏移量 = 1000 0001 - 1111111 = 0000 0010B = 2D
→ 浮点数真值 = (1.01)2×22=1.25×22=5.0(-1.01)_2 \times 2^2= -1.25 \times 2^2 =-5.0

若要表示的数绝对值还要更小,怎么办?

只有1 ≤ E ≤ 254时,真值=(1)s×1.M×2E127(-1)_s \times 1.M \times 2^{E-127}

  • 阶码E全为0,尾数M不全为0时,表示非规格化小数 (0.xx...x)2×2126(0.xx...x)_2\times2^{-126}
    【隐含最高位变为0,阶码真值固定视为 -126】
  • 阶码E全为0,尾数M全为0时,表示真值 ±0
  • 阶码E全为1,尾数M全为0时,表示无穷大 ±∞
  • 阶码E全为1,尾数M不全为0时,表示非数值“NaN”(Not a Number)
    【如: 0/0、∞-∞。等非法运算的结果就是 NaN】

2.3.3 浮点数的运算

  • 浮点数的加减运算
浮点数的加减运算步骤:9.85211×1012+9.96007×1010.9.85211\times10^{12} + 9.96007 \times 10^{10}.
二进制需要真值到机器数的转换,这个例子用十进制来解释,这里不需要
对阶
9.85211×1012+0.0996007×1012.9.85211\times10^{12} + 0.0996007 \times 10^{12}.
尾数加减
9.9517107×1012.9.9517107\times10^{12}.
规格化
如果尾数加减出现类似0.0099517×10120.0099517 \times 10^{12}时,需要“左规”;
如果尾数加减出现类似99.517107×101299.517107 \times 10^{12}时,需要“右规”
【右规时就会面临舍入的问题】
舍入
若规定只能保6位有效尾数,则:
9.9517107×10129.95171×1012.9.9517107 \times 10^{12} → 9.95171 \times10^{12}. —— (多余的直接砍掉)
或者,9.9517107×10129.95172×1012.9.9517107 \times 10^{12} → 9.95172 \times10^{12}. —— (若砍部分非0,则入1)
或者,也可以采用四舍五入的原则,当舍弃位≥5时,高位入1
【可以有不同的舍入规则】
判断溢出
若规定阶码不能超过两位,则运算后阶码超出范围,则溢出
如:9.85211×1099+9.96007×1099=19.81218×1099.9.85211\times10^{99} + 9.96007 \times10^{99}=19.81218\times 10^{99}.
规格化并用四舍五入的原则保留6位尾数,得198122×10100.198122 \times 10^{100}.
阶码超过两位,发生溢出(注:尾数溢出未必导致整体溢出,也许可以通过③④两来)

【思考】对阶的时候为什么小阶向大阶对齐

计算机内部尾数是定点小数实现的,例如:0.1122334,如果向小阶对齐可能会变成1122.334,这对计算机来说是不合适的

:已知十进制数X=-5/256、Y=+59/1024,按机器补码浮点运算规则计算X-Y,结果用二进制表示,浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位
【IEEE 754最少都32位,所以考试一般像这题一样这么考】


  • 浮点数的加减运算-舍入

”0“舍“1”入法 :类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。

恒置“1”法 :尾数右移时,不论的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

有的计算机可能会把浮点数的尾数部分单独拆出去计算(24bit→32bit),算完了经过舍入(32bit→24bit)再拼回浮点数


  • 强制类型转换

由于大部分教材按照32位机器编写,考试通常也是32位机器来考察

范围、精度从小到大,转换过程没有损失:

  • char → int → long → double;【这里long是32位,64位就错了】
  • float → double

常考】:

  • int:表示整数,范围[231,2311][-2^{31}, 2^{31}-1],有效数字32位
    float:表示整数及小数,范围±[2126,2127]×(2223)±[2^{-126}, 2^{127}]\times(2-2^{-23}),有效数字23+1=24位

  • int → float:可能损失精度
    float → int:可能溢出及损失精度


第三章 存储系统

3.1 存储系统基本概念

  • 存储器的层次化结构

注:有的教材把安装在电脑内部的磁盘称为“辅存”,把U、光盘等称为“外存”;也有的教材把磁盘、U盘、光盘等统为“辅存”或“外存”

如上图,辅存中的数据要调入主存后,才能被CPU访问

主存—辅存:实现虚拟存储系统,解决了主存容量不够的问题
Cache—主存:解决了主存与CPU速度不匹配的问题


  • 存储器的分类——层次


  • 存储器的分类——存储介质

存储器的功能:存放二进制信息

按存储介质分:

  1. 半导体储器(主存、Cache)
    以半导体器件存储信息
  2. 磁表面存储器:磁盘、磁带
    以磁性材料存储信息
  3. 光存储器
    以光介质存储信息

  • 存储器的分类——存取方式
  1. 随机存取存储器(Random Access Memory, RAM)
    读写任何一个存储单元所需时间都相同,与存储单元所在的物理位置无关。如下图:

  1. 顺序存取存储器(Sequential Access Memory,SAM)
    读写一个存储单元所需时间取决于存储单元所在的物理位置。如下图:

  1. 直接存取存储器(Direct Access Memory,DAM)
    既有随机存取特性,也有顺序存取特性。先直接选取信息所在区域,然后按顺序方式存取。如下图:

串行访问存储器:(SAM和DAM是串行访问存储器)
读写某个存储单元所需时间与存储单元的物理位置有关。

  1. 相联存储器(Associative Memory),即可以按内容访问的存储器 (Content Addressed Memory,CAM
    可以按照内容检索到存储位置进行读,“快表”就是一种相联存储器。

  • 存储器的分类——信息的可更改性
  1. 读写存储器(Read/Write Memory) —— 即可读、也可写(如: 磁盘、内存、Cache)

  2. 只读存储器(Read Only Memory,ROM) —— 只能读,不能写(如:实体音乐专辑通常采用CD-ROM,实体电影采用蓝光光碟,BIOS通常写在ROM中)

    事实上很多ROM也可多次读写,只是比较麻烦


  • 存储器的分类一一信息的可保存性

断电后,存储信息消失的存储器一一易失性存储器(主存、Cache)
断电后,存储信息依然保持的存储器一一非易失性存储器(磁盘、光盘)

信息读出后,原存储信息被破坏一一破坏性读出(如DRAM芯片,读出数据后要进行重写)
信息读出后,原存储信息不被破坏一一非破坏性读出(如SRAM芯片、磁盘、光盘)


  • 存储器的性能指标
  1. 存储容量:存储字数 × 字长(如1M × 8位)
    【MDR位数反映存储字长】
  2. 单位成本:每位价格 = 总成本 / 总容量。
  3. 存储速度数据传输率 = 数据的宽度 / 存储周期
    【数据的宽度即存储字长,这里是说因为一个周期处理一个存储字长】

①存取时间(Ta):存取时间是指从启动一次到完成该操作所经历的时间,分为读出时间和写入时间。
②存取周期(Tm):存取周期又称为读周期或访周期。它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立地访问存储器操作(读或写操作)之间所需的最小时间间隔。

主存带宽 (Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒、字节/秒(B/s)或位/秒(b/s)。【和上面数据传输率一样,按上面的算就好】


3.2.1 主存储器的基本组成

  • 基本的半导体元件及原理

存储体由多个存储单元构成,每个存储单元又由多个存储元(存储元件)构成。

注:MOS管可理解为一种电控开关,输入电压达到某个闽值时,MOS管就可以接通。


  • 存储芯片的基本原理

CS\overline{CS}:chip select,芯片选择信号
CE\overline{CE}:chip enable,芯片使能信号
注:头上划线表示该信号低电平有效

抽象出来,如下图:

上图中,每根线都对应一个金属引脚:(另外,还有供电引脚、接地引脚)
【常考判断引脚个数】:地址线 + 数据线 +片选线 + 读/写控制线(1/2根)

描述
n位地址 → 2n2^n个存储单元
总容量 = 存储单元个数 × 存储字长 = 2³ × 8bit = 2³ × 1Byte = 8B
8 × 8位的存储芯片
常见的描述:
8K × 8位,即2132^{13}×8bit
8K × 1位,即2132^{13}×1bit
64K × 16位,即2162^{16}×16bit
2^10:K 2^20:M 2^30:G 2^40:T

  • 寻址

总容量为1KB
按字节寻址:1K个单元,每个单元1B
按字寻址:256个单元,每个单元4B
按半字寻址: 512个单元,每个单元2B
按双字寻址: 128个单元,每个单元8B

若按字节寻址:1K个单元对应10根地址线:

若按字寻址:字地址到字节地址的转换,字地址左移两位,相当于×4,其他转换类似


3.2.2 SRAM和DRAM

Dynamic Random Access Memory,即动态RAM
Static Random Access Memory,即静态RAM
DRAM用于主存、SRAM用于Cache
高频考点: DRAM和SRAM的对比

  • DRAM芯片

DRAM芯片:

DRAM芯片: 使用栅极电容存储信息
SRAM芯片: 使用双稳态触发器存储信息
核心区别: 存储元不一样


  • 栅极电容 v.s. 双稳态触发器

存储时:1: 电容内存储了电荷;0: 电容内未存储电荷

读取时:读出1: MOS管接通,电容放电,数据线上产生电流;读出0: MOS管接通后,数据线上无电流
【电容放电信息被破坏,是破坏性读出。读出后应有重写操作,也称“再生“,→ 读写速度更慢

每个存储元制造成本更低,集成度高,功耗低

电容内的电荷只能维持2ms。即便不断电,2ms后信息也会消失 → 需要刷新【2ms之内必须“刷新”一次(给电容充电)】

读出时:如上图,只会在一边输出低电平,不是左边就是右边
【读出数据,触发器状态保持稳定,是非破坏性读出,无需重写,→ 读写速度更快

存储时:双稳态:1: A高B低;0:A低B高【即左边数据线高电平,右边低电平就写入了1;左边数据线低电平,右边高电平就写入了0】

每个存储元制造成本更高,集成度低,功耗大

只要不断电触发器的状态就不会改变

现在DRAM已经过时了,现在的主存通常采用SDRAM芯片【买电脑时候看到的DDR3,DDR4都属于SDRAM】


  • DRAM的刷新

“刷新”由存储器独立完成,不需要CPU控制

  1. 多久需要刷新一次?

刷新周期: 一般为2ms

  1. 每次刷新多少存储单元?

以行为单位,每次刷新一行存储单元

——为什么要用行列地址?

减少选通线的数量

对于地址:0000 0000如图选择

所以:如:2^8=256根选通线,2^4+2^4=32根选通线

  1. 如何刷新?

有硬件支持,读出一行的信息后重新写入,占用1个读/写周期

  1. 在什么时刻刷新?【常考选择题】

假设DRAM内部结构排列成128 × 128的形式,读/写周期(存取周期)0.5us
2ms 共 2ms/0.5us = 4000 个周期

思路一:每次读写完都刷新一行
→ 系统的存取周期变为1us
前0.5us时间用于正常读写
后0.5us时间用于刷新某行

思路二:2ms内集中安排时间全部刷新
→ 系统的存取周期还是0.5us
有一段时间专门用于刷新,无法访问存储器,称为访存“死区”

思路三:2ms内每行刷新1次即可
→ 2ms内需要产生128次刷新请求
每隔2ms/128 =15.6us
一次每15.6us内有0.5us的“死时间“
【实际可以利用cpu不需要访问的时候进行刷新,如下图译码阶段】


  • DRAM的地址线复用技术

行、列地址分两次送,可使地址线更少,芯片引脚更少


3.2.3 只读存储器ROM

RAM芯片——易失性,断电后数据消失
ROM芯片——非易失性,断电后数据不会丢失

ROM:

  • MROM
  • PROM
  • EPROM
  • 闪存
  • SSD
  • 了解各种ROM

MROM (Mask Read-Only Memory)——掩模式只读存储器
厂家按照客户需求,在芯片生产过程中直接写入信息,之后任何人不可重写(只能读出)
可靠性高、灵活性差、生产周期长、只适合批量定制

PROM (Programmable Read-Only Memory)——可编程只读存储器
用户可用专门的PROM写入器写入信息,写一次之后就不可更改

EPROM(Easable Programmable Read-Only Memory)——可擦除可编程只读存储器
允许用户写入信息,之后用某种方法擦除数据,可进行多次重写
UVEPROM(ultraviolet rays)——用紫外线照射8~20分钟,擦除所有信息
EEPROMY也常记为E²PROM,第一个E是Electrically) ——可用“电擦除”的方式,擦除特定的字

Flash Memory ——闪速存储器(注:U盘SD卡就是闪存)
在EEPROM 基础上发展而来,断电后也能保存信息,且可进行多次快速擦除重写
注意:由于闪存需要先擦除在写入,因此闪存的“写”速度要比“读”速度更慢
【每个存储元只需单个MOS管,位密度比RAM高】

SSD (Solid state Drives)——固态硬盘
由控制单元+存储单元(Flash 芯片)构成,与闪速存储器的核心区别在于控制单元不一样,但存储介质都类似,可进行多次快速擦除重写。SSD速度快、功耗低、价格高。目前个人电脑上常。用SSD取代传统的机械硬盘

拓:手机辅存也使用Flash芯片,但相比SSD使用的芯片集成度高、功耗低、价格贵


  • 计算机内的重要ROM

CPU的任务:到主存中取指令并执行指令
断电后RAM内数据全部丢失

操作系统安装在辅存

一开始cpu中啥也没有,就需要从主板上的一块ROM芯片读取开机所需要的那些指令:

主板上的BIOS芯片 (ROM)存储了“自举装入程序”,负责引导装入操作系统 (开机)

所以主存逻辑上,由RAM+ROM组成,且二者常统一编址


  • 本节回顾

很多ROM芯片虽然名字是“Read-Only”,但很多ROM也可以“写”

闪存的写速度一般比读速度更慢,因为写入前要先擦除

RAM芯片是易失性的,ROM芯片是非易失性的。很多ROM也具有“随机存取”的特性


3.2.4 双端口RAM和多模块存储器

好消息!好消息!

本小节涉及两种内存优化技术,分别是“双端口RAM和“多模块存储器
其中,“双端口RAM已从408大纲删除,但由于部分自命题院校依然会考这个概念,所以仍然保留了这部分内容

  • 408考生简要了解“双端口RAM”即可,408考试不考
  • 408考生重点掌握“多模块存储器” ,这是考试重点。建议自命题考生认真学习“双端口RAM”,掌握基本概念即可,这个考点大概率以概念型选择题的形式考
  • 存取周期

存取周期:可以连续读/写的最短时间间隔

注:DRAM芯片的恢复时间比较长,有可能是存取时间的几倍 (SRAM的恢复时间较短)

【问】:
多核CPU都要访存,怎么办?
CPU的读写速度比主存快很多,主存恢复时间太长怎么办?


  • 知识总览

提升主存速度:

  • 双端口RAM
  • 多模块存储器
    • 单体多字存储器
    • 多体并行存储器
      • 高位交叉编址
      • 低位交叉编址
  • 实际应用:如何让你的电脑变成“双通道内存?

  • 双端口RAM

作用:优化多核CPU访问一根内存条的速度

需要有两组完全独立的数据线、地址线、控制线。CPU、RAM中也要有更复杂的控制电路

两个端口对同一主存操作有以下4种情况:

  1. 两个端口同时对不同的地址单元存取数据。✔
  2. 两个端口同时对同一地址单元读出数据。✔
  3. 两个端口同时对同一地址单元写入数据。✘
  4. 两个端口同时对同一地址单元,一个写入数据,另一个读出数据。✘

解决方法:置“忙”信号为0,由判断逻辑决定暂时关闭一个端口(即被延时) ,未被关闭的端口正常访问,被关闭的端口延长一个很短的时间段后再访问。

对比操作系绞读者-写者问题


  • 多体并行存储器

高位交叉编址的多体存储器:

低位交叉编址的多体存储器:

思考: 为什么要探讨“连续访问”的情况?


  • 应该取几个“体”?

低位交叉编址的多体存储器应该取几个“体”?

采用“流水线”的方式并行存取(宏观上并行,微观上串行)
宏观上,一个存储周期内,m体交叉存储器可以提供的数据量为单个模块的m倍。

两种常见描述:
存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数m≥T/r
存取周期为T,总线传输周期为r(把数据传给cpu),为了使流水线不间断,应保证模块数 m≥T/r

所以完美衔接的是模块数m=T/r,即上面的例子

思考: 给定一个地址x,如何确定它属于第几个存储体?


  • 多模块存储器

多体并行存储器:

每个模块都有相同的容量和存取速度。
各模块都有独立的读写控制电路、地址寄存器和数据寄存器它们既能并行工作,又能交叉工作。

单体多字存储器:

相当于将多体并行存储器的几个体合并,用一套控制电路、地址寄存器和数据寄存器
每个存储单元存储m个字
总线宽度也为m个字
一次并行读出m个字
每次只能同时取m个字,不能单独取其中某个字
指令和数据在主存内必须是连续存放的


  • 同学,你学计算机的? 那…

如何插入内存条,实现高位交叉的多体存储器(相当于单纯的扩容)?
如何插入内存条,实现低位交叉的多体存储器(俗称“双通道”)?【插图中相同颜色部分】
Tips:买内存条时,可挑选相同主频相同容量的两根来组成双通道

所以很多商家两个一起卖

我的电脑的内存情况:


3.3.1 主存储器与CPU的连接

  • 知识总览

存储器与CPU的连接:

  • 单块存储芯片与CPU的连接
  • 多块存储芯片与CPU的连接
    • 位扩展法
    • 字扩展法
      • 线选法
      • 片选法
    • 字位扩展法
  • 关于译码器知识的补充
  • 单块存储器与CPU的连接

如上图是8×8位的存储芯片

想要扩展主存字数怎么办?——字扩展

数据总线宽度>存储芯片字长,怎么办? ——位扩展

注:现在的计算机MAR、MDR通常集成在CPU内部。存储芯片只需要一个普通的寄存器(暂存输入、输出数据)


  • 现在的计算机

主存中包含多块存储芯片


  • 包含多块存储芯片


  • 存储器芯片的输入输出信号


  • 增加主存的存储字长-位扩展

如下图:8片8K x 1位的存储芯片 → 1个8K x 8位的存储器,容量8KB


  • 增加主存的存储字数-字扩展

线选法:

如下图:A14A_{14} A13A_{13}只能为01或10
n条线 → n个选片信号

译码片选法: n条线 → 2n2^n个选片信号

低电平有效加小圆圈,如下图:

考试中可能会考察你,然后将上图改成:

A14A_{14}完全不影响选择,但是合法地址变多了一倍,取0取1都对应到同一块存储器,所以这是不合理的。所以现实中完全不会这么做,这只是考试故意的。


  • 主存容量扩展-字位同时扩展


  • 补充:译码器

下图译码器型号74ls138

注:CPU可使用译码器的使能端控制片选信号的生效时间

RAM的读周期:【灰色是无效】


3.4.1 磁盘存储器

  • 本节总览

外部存储器:

  • 磁盘存储器——Key:磁盘存取时间的计算
  • 固态硬盘(SSD)
  • 外存储器

计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器。
所谓“磁表面存储”,是指把某些磁性材料薄薄地涂在金属铝或塑料表面上作为载磁体来存储信息。磁盘存储器、磁带存储器和磁鼓存储器均属于磁表面存储器。

磁表面存储器的优点:
①存储容量大,位价格低;
②记录介质可以重复使用;
③记录信息可以长期保存而不丢失,甚至可以脱机存档;
④非破坏性读出,读出时不需要再生。

磁表面存储器的缺点:
①存取速度慢;
②机械结构复杂;
③对工作环境要求较高。

外存储器既可以作为输入设备,也可以作为输出设备(既可以存数据,也可以读数据)


  • 磁盘存储器

1、磁盘设备的组成

①存储区域
一块硬盘含有若干个记录面,每个记录面划分为若干条磁道,而每条磁道又划分为若干个扇区,扇区(也称块)是磁盘读写的最小单位,也就是说磁盘按块存取。

磁头数:即记录面数,表示硬盘总共有多少个磁头,磁头用于读取/写入盘片上记录面的信息,一个记录面对应一个磁头。

柱面数:表示硬盘每一面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。

扇区数:表示每一条磁道上有多少个扇区。

②硬盘存储器:硬盘存储器由磁盘驱动器、磁盘控制器和盘片组成。

磁盘驱动器:核心部件是磁头组件和盘片组件,温彻斯特是一种可移动头固定盘片的硬盘存储器。
磁盘控制器:是硬盘存储器和主机的接口,主流的标准有IDE、SCSI、SATA等。

值得一提的是每个磁盘,可以在正反两面涂上磁性材质:

2、磁盘的性能指标

①磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。

非格式化容量是指磁记录表面可以利用的磁化单元总数。
格式化容量是指按照某种特定的记录格式所能存储信息的总量。

②记录密度:记录密度是指盘片单位面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示。

道密度是沿磁盘半径方向单位长度上的磁道数;
位密度是磁道单位长度上能记录的二进制代码位数;
面密度是位密度和道密度的乘积。

注意:磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,故每个磁道的位密度都不同。

③平均存取时间:【常考】

平均存取时间 =
寻道时间(磁头移动到目的磁道) +
旋转延迟时间(磁头定位到所在扇区) +
传输时间(传输数据所花费的时间)

④数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。

假设磁盘转数为r(转/秒),每条磁道容量为N个字节,则数据传输率为DrD_r=rN【理论最大值】

3、磁盘地址结构

主机向磁盘控制器发送寻址信息,磁盘的地址一般如图所示:

若系统中有4个驱动器,每个驱动器带一个磁盘,每个磁盘256个磁道、16个盘面,每个盘面划分为16个扇区,则每个扇区地址要18位二进制代码:

4、磁盘的工作过程

硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步是取控制第二步是执行控制字。
硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。

所以如下设计:


  • 磁盘阵列

RAID ( Redundant Array of lnexpensive Disks,廉价余磁盘阵列)是将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。

RAID的分级如下所示。在RAID1~RAID5的几种方案中,无论何时有磁盘损坏,都可以随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏。

RAID0:无冗余余和无校验的磁盘阵列。
RAID1:镜像磁盘阵列。
RAID2:采用纠错的海明码的磁盘阵列。
RAID3:位交叉奇偶校验的磁盘阵列。
RAID4:块交叉奇偶校验的磁盘阵列。
RAID5:无独立校验的奇偶校验磁盘阵列

RAID0:逻辑上相邻的两个扇区在物理上存到两个磁盘,类比第三章“低位交叉编址的多体存储器”

RAID1:很粗暴,存两份数据【冗余,并行访问,对比校验】

RAID2:逻辑上连续的几个bit物理上分散存储在各个盘中4bit信息位+3bit海明校验位一可纠正一位错

  • RAID0把连续多个数据块交替地存放在不同物理磁盘的扇区中,几个磁盘交叉并行读写,不仅扩大了存储容量,而且提高了磁盘数据存取速度,但RAID0没有容错能力
  • RAID1是为了提高可靠性,使两个磁盘同时进行读写,互为备份,如果一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半

RAID通过同时使用多个磁盘,提高了传输率;通过在多个磁盘上并行存取来大幅提高存储系统的数据吞吐量;通过镜像功能,可以提高安全可靠性;通过数据校验,可以提供容错能力。

  • RAID0:条带化,提高存取速度,没有容错能力
  • RAID1:镜像磁盘互为备份
  • RAID2~5:通过数据校验提高容错能力

3.4.2 固态硬盘SSD

计组,操作系统考研大纲新考点

操作系统:
固态硬盘;读写性能特性,磨损均衡

计算机组成原理:固态硬盘(SSD)


  • 机械硬盘 vs 固态硬盘


  • 固态硬盘的结构

每个闪存芯片由若干块组成,比如块大小:16KB~512KB

每个块再拆解为一个一个页,比如页大小,512B~4KB

系统读写以 页 为单位,磁盘中则是块(扇区),这里作区分


  • 理想情况下,固态硬盘的寿命

某固态硬盘采用磨损均衡技术,大小为2402^{40}B=1TB,闪存块的擦写寿命只有2102^{10}=1K次。某男子平均每天会对该固态硬盘写2372^{37}B=128GB数据。在最理想的情况下,这个固态硬盘可以用多久?

SSD采用磨损均衡技术,最理想情况下,SSD中每个块被擦除的次数都是完全均衡的。

1TB/128GB =8
因此,平均每8天,每个闪存块需要擦除一次。每个闪存块可以被擦除1K次,因此,经过8K天,约23年后,该固态硬盘被男子玩坏

所以没那么容易坏


3.5.1 Cache的基本概念和原理

  • 存储系统存在的问题


  • Cache工作原理

下图中Cache比内存快60倍

注:实际上, Cache被集成在CPU内部;Cache用SRAM实现,速度快,成本高


  • 局部性原理

程序A:

1
2
3
4
5
6
7
int sumarrayrows(int a[M][N]) {
int i,j,sum =0;
for (i=0;i<M;i++)
for (j=0;j<N;j++)
sum += a[il[j];
return sum;
}

空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的
Eg: 数组元素、顺序执行的指令代码

时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息
Eg: 循环结构的指令代码

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到cache中

程序B:

1
2
3
4
5
6
7
int sumarrayrows(int a[M][N]) {
int i,j,sum =0;
for (i=0;i<M;i++)
for (j=0;j<N;j++)
sum += a[il[j];
return sum;
}

程序B按“列优先”访问二维数组,空间局部性更差


  • 性能分析

tct_c为访问一次Cache所需时间,tmt_m为访问一次主存所需时间
命中率 H:CPU欲访问的信息已在Cache中的比率
缺失(未命中)率 M =1- H

Cache一主存系统的平均访问时间 t 为:(先访问Cache,若Cache未命中再访问主存)

t=Htc+(1H)(tc+tm)t=H t_{c}+(1-H)\left(t_{c}+t_{m}\right)

或:(同时访问 Cache和主存,若cache命中则立即停止访问主存)

t=Htc+(1H)tmt=H t_{c}+(1-H) t_{m}

【例3-2】 假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?

设Cache的存取周期为t,则主存的存取周期为5t

若Cache和主存同时访问,命中时访问时间为t,未命中时访问时间为5t
平均访问时间为 0.95 × t + 0.05 × 5t=1.2t

故性能为原来的5t1.2t\frac{5t}{1.2t} ≈ 4.17倍

若先访问Cache再访问主存,命中时访问时间为t,未命中时访问时间为 t+5t
平均访问时间为 0.95 × t+ 0.05 × 6t = 1.25t

故性能为原来的5t1.25t\frac{5t}{1.25t} = 4倍


  • 有待解决的问题

基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。如何界定“周围”?

将主存的 存储空间“分块” ,如: 每1KB为一块。!主存与Cache之间以“块”为单位进行数据交换

假设主存的地址共22位:4M=2222^{22},1K=2102^{10},整个主存被分为 2122^{12} =4096块

注:操作系统中通常将主存中的“一个”也称为”一个页/页面/页框
Cache中的“”也称为“

注意: 每次被访问的主存块定会被立即调入Cache

  • 如何区分 Cache与主存的数据块对应关系?

    ——Cache和主存的映射方式

  • Cache和主存的映射方式替换算法Cache 很小,主存很大。如果cache满了怎么办?

    ——替换算法

  • CPU修改了cache中的数据副本,如何确保主存中数据母本的一致性?

    ——Cache写策略


3.5.2 Cache和主存的映射方式

  • 本节总览

全相联映射

主存块可以放在Cache的任意位置

优点: Cache存储空间利用充分,命中率高;
缺点: 查找“标记”最慢,有可能需要对比所有行的标记

直接映射

每个主存块只能放到一个特定的位置:

Cache块号 = 主存块号 % Cache总块数

优点: 对于任意一个地址,只需对比一个“标记”,速度最快;
缺点: Cache 存储空间利用不充分,命中率低

组相联映射

Cache块分为若干组,每个主存块可放到特定分组中的任意一个位置

组号 = 主存块号 % 分组数

优点: 另外两种方式的折中,综合效果较好

术语:n路组相联映射——每n个Cache行为一组

  • 如何区分Cache中存放的是哪个主存块?

    给每个Cache块增加一个“标记”,记录对应的主存块号

  • 有“标记”就够了?

    还要增加“有效位

标记、有效位的二进制表示初始都为0

Cache中存储的信息:

  • 有效位(0/1) + 标记 + 整块数据
  • 其中“标记”用于指明对应的内存块,不同映射方式,“标记”的位数不同

  • 全相联映射(随意放)

假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行(即Cache块,与主存块的大小相等),行长为64B

256M = 2282^{28}主存的地址共28位:

主存块号 块内地址
22位 6位


  • 全相联映射”如何访存?

CPU 访问主存地址1…1101 001110:
①主存地址的前22位,对比Cache中所有块的标记;
②若标记匹配且有效位=1,则Cache命中,访问块内地址为001110 的单元。
③若未命中或有效位=0,则正常访问主存


  • 直接映射(只能放固定位置)

假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行(即Cache块,与主存块的大小相等),行长为64B

256M = 2282^{28}主存的地址共28位:

主存块号 块内地址
22位 6位

能否优化标记?

直接映射,主存块在Cache中的位置 = 主存块号 % Cache总块数
主存块号%2³相当于留下最后三位二进制数

若Cache总块数 = 2n2^n,则主存块号末尾n位直接反映它在Cache中的位置
将主存块号的其余位作为标记即可


  • "直接映射”如何访存?

CPU 访问主存地址0…01000 001110 :
①根据主存块号的后3位确定Cache行
②若主存块号的前19位与Cache标记匹配且有效位=1,则Cache命中,访问块内地址为001110的单元。
③若未中或有效位=0,则正常访问主存


  • 组相联映射(可放到特定分组)

假设某个计算机的主存地址空间大小为256MB,按字节编址,其数据Cache有8个Cache行(即Cache块,与主存块的大小相等),行长为64B

256M = 2282^{28}主存的地址共28位:

主存块号 块内地址
22位 6位

能否优化标记?

组相联映射,所属分组 = 主存块号 % 分组数组相联映射
主存块号%2²相当于留下最后两位二进制数

若Cache总组数 = 2n2^n,则主存块号末尾n位直接反映它在Cache中所属组的位置
将主存块号的其余位作为标记即可


  • “组相联映射”如何访存

CPU 访问主存地址1…1101 001110:
①根据主存块号的后2位确定所属分组号
②若主存块号的前20位与分组内的某个标记匹配且有效位=1, 则Cache命中,访问块内地址为001110的单元。
③若未命中或有效位=0,则正常访问主存


3.5.3 Cache替换算法

  • 替换算法解决的问题

对于全相联映射

Cache完全满了才需要替换需要在全局选择替换哪一块

对于直接映射

如果对应位置非空,则毫无选择地直接替换;所以无需考虑算法

对于组相联映射

分组内满了才需要替换需要在分组内选择替换哪一块

下面以全相联映射为例子说明四种替换算法:

  • 随机算法(RAND)
  • 先进先出算法(FIFO)
  • 近期最少使用(LRU)
  • 最近不经常使用(LFU)

  • 随机算法(RAND)

随机算法 (RAND,Random)——若Cache已满,则随机选择一块替换

设总共有4个cache块,初始整个Cache为空。采用全相联映射,依次访问主存块 {1,2,3,4,1,2,5,1,2,3,4,5}

随机算法一一实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定


  • 先进先出算法(FIFO)

先进先出算法(FIFO,First In First Out)——若Cache已满,则替换最先被调入Cache 的块

设总共有4个cache块,初始整个Cache为空。采用全相联映射,依次访问主存块 {1,2,3,4,1,2,5,1,2,3,4,5}

先进先出算法——实现简单,最开始按#0#1#2#3放入Cache,之后轮流替换 #0#1#2#3
FIFO依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的

抖动现象:频繁的换入换出现 (刚被替换的块很快又被调入)


  • 近期最少使用(LRU)

近期最少使用算法(LRu,Least Recently Used )——为每一个Cache块设置个“计数器”,用于记录每个Cache块已经有多久没被访问了。当Cache满后替换“计数器”最大的

①命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变;
【Cache块的总数 = 2n2^n,则计数器只需n位。且Cache装满后所有计数器的值一定不重复】
②未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行全加1;
③未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装行的块的计数器置0,其余全加1.

设总共有4个cache块,初始整个Cache为空。采用全相联映射,依次访问主存块 {1,2,3,4,1,2,5,1,2,3,4,5}

LRU算法——基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。【所以考试常考】

若被频繁访问的主存块数量 >Cache行的数量,则有可能发生“抖动“,如: {1,2,3,4,5, 1,2,3,4,5, 1,2…}


  • 最近不经常使用(LFU)

最不经常使用算法(LFU,Least Frequently Used )——为每一个Cache块设置一个“计数器“,用于记录每个Cache块被访问过几次。当Cache满后替换“计数器”最小的

新调入的块计数器 = 0,之后每被访问一次计数器+1。需要替换时,选择计数器最小的一行
若有多个计数器最小的行可按行号递增或FIFO策略进行选择

设总共有4个cache块,初始整个Cache为空。采用全相联映射,依次访问主存块 {1,2,3,4,1,2,5,1,2,3,4,5}

LFU算法——曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块)
【比如之前的某个块一直被访问,导致计数器增加到一个很大的值,进而导致未来不用了,但是很难淘汰它】
并没有很好地遵循局部性原理,因此实际运行效果不如 LRU


3.5.4 Cache写策略

  • 本节总览

Cache 写策略:

  • 写命中

    • 全写法
    • 写回法
  • 写不命中

    • 写分配法
    • 非写分配法

为何不讨论读命中、读不命中的情况?
读操作不会导致Cache和主存的数据不一致


  • 写命中

写回法(write-back)——当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存

减少了访存次数,但存在数据不一致的隐患

添加一个脏位,表示是否被修改过

全写法(写直通法,write-through)——当CPU对Cache写命中时,必须把数据同时写入Cache和主存。

访存次数增加,速度变慢,但更能保证数据一致性

所以全写法一般使用写缓冲(write buffer)
SRAM实现的FIFO队列;
在专门的控制电路控制下逐一写回。

使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞


  • 写不命中

写分配法(write-allocate)——当CPU对Cache写不命中时,把主存中的块调入Cache,在Cach中修改。通常搭配写回法使用。

非写分配法(not-write-allocate)——当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。
不调入Cache,只有“读”未命中时才调入Cache


  • 多级Cache

现代计算机常采用多级Cache
离CPU越近的速度越快,容量越小
离CPU越远的速度越慢,容量越大


3.6.1 页式存储器

和操作系统第三章高度重合,经常作为综合考点

  • 页式存储

4KB的程序被分为4个“页”每个页面的大小和“物理块”的大小相同

页式存储系统:一个程序(进程)在逻辑上被分为若干个大小相等的“页面/页“,“页面”大小与“”的大小相同。每个页面可以离散地放入不同的主存块中。


  • 虚地址 vs 实地址

逻辑地址 (虚地址):程序员视角看到的地址
物理地址 (实地址):实际在主存中的地址

取变量x至ACC存器机器指令: 000001 001000000011操作码+地址码(使用逻辑地址)

操作系统将程序分“页“
所以现在要做的就是把逻辑地址转化为物理地址


  • 页表: 逻辑页号→主存块号

取变量x至ACC存器机器指令: 000001 001000000011操作码+地址码(使用逻辑地址)

页表数据存放在主存里

CPU执行的机器指令中,使用的是“逻辑地址”,因此需要通“页表”将逻辑地址转为物理地址
页表的作用:记录了每个逻辑页面存放在哪个主存块中


  • 地址变换过程

取变量x至ACC存器机器指令: 000001 001000000011操作码+地址码(使用逻辑地址)

CPU访问某个主存地址:这个块的数据可能在Cache中【局部性】;同理 → 快表TLB


  • 地址变换过程(增加TLB)

注意区别:快表中存储的是页表项的副本; Cache中存储的是主存块的副本

CPU查快表为什么比慢表快
快表使用SRAM,慢表使用DRAM;快表是一种“相联存储器”可以按内容寻访【3.1小节提到相联存储器】


  • 知识回顾


3.6.2 虚拟存储器

这部分主要还是看操作系统第三章

  • 套娃警告: 虚拟存储系统

微信(1GB),需要全部调入内存?
——调入部分即可

思考: 打游戏时候的“Loading”界面背后是在干嘛?
——将游戏地图相关数据调入内存

如何界定一部分?——分页


  • 页式虚拟存储器

有效位: 这个页面是否已调入主存
脏位: 这个页面是否被修改过
引用位: 用于“页面置换算法”,比如,可以用来统计这个页面被访问过多少次
物理页: 即主存块号
磁盘地址: 即这个页面的数据在磁盘中的存放位置


  • 存储器的层次化结构

注:有的教材把安装在电脑内部的磁盘称为“辅存”,把U、光盘等称为“外存”;也有的教材把磁盘、U盘、光盘等统为“辅存”或“外存”

如上图,辅存中的数据要调入主存后,才能被CPU访问

主存—辅存:实现虚拟存储系统,解决了主存容量不够的问题【操作系统决定,哪些页面调入主存】
Cache—主存:解决了主存与CPU速度不匹配的问题【硬件决定主存块调入Cache】


  • 段式虚拟存储器

段式虚拟存储器一一按照功能模块拆分。如上图: #0段是自己的代码,#1段是库函数代码,#2段是变量

装入位字段用来指示该段是否已经调入主存,“1”表示已装入,“0”表示未装入


  • 段页式虚拟存储器

把程序按逻辑结构分段,每段再划分为固定大小的页主存空间也划分为大小相等的页,程序对主存的调入、调出仍以页为基本传送单位。
每个程序对应一个段表,每段对应一个页表。

虚拟地址 = 段号 + 段内页号 + 页内地址


第四章 指令系统

4.1.1 指令格式

  • 现代计算机

本章重点探讨控制器支持的指令如何设计


  • 回忆计算机的工作过程

1.2.2 各个硬件的工作原理

操作码:指明了“做什么“
地址码:指明了“对谁动手”

有的指令不需要地址码(停机)


  • 本节总览

指令格式:

  • 操作码、地址码 的概念
  • 根据地址码数目不同分类
  • 根据指令长度分类
  • 根据操作码的长度不同分类
  • 根据操作类型分类

  • 指令的定义

指令(又称机器指令) :
是指示计算机执行某种操作的命令, 是计算机运行的最小功能单位。

一台计算机的所有指令的集合构成该机的指令系统,也称为指令集

注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。

Snipaste_2023-07-07_20-09-14

Eg:x86架构、ARM架构


  • 指令格式

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

一条指令通常要包括操作码字段和地址码字段两部分:

一条指令可能包含 0个、1个、2个、3个、4个 地址码…
根据地址码数目不同,可以将指令分为 零地址指令、一地址指令、二地址指令……


  • 零地址指令

1、不需要操作数,如空操作、停机、关中断等指令

2、堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶【并不是不需要】


  • 一地址指令

1、只需要单操作数,如加1、减1、取反、求补等
指令含义:OP(A1)→A1,
完成一条指令需要3次访存: 取指→读A1→写A1

2、需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC)
指令含义: (ACC)OP(A1)→ACC,
完成一条指令需要2次访存: 取指→读A1

注: A1指某个主存地址,(A1)表示A1所指的地址中的内容
类比: c语言指针、指针所指位置的内容


  • 二、三地址指令

二地址指令

常用于需要两个操作数的算术运算、逻辑运算相关指令
指令含义: (A1)OP(A2)→A
完成一条指令需要访存4次,取指→读A1→读A2→写A1

三地址指令

常用于需要两个操作数的算术运算、逻辑运算相关指令
指令含义: (A1)OP(A2)→A3
完成一条指令需要访存4次,取指→读A1→读A2→写A3


  • 四地址指令

指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址
完成一条指令需要访存4次,取指→读A1→读A2→写A3

正常情况下: 取指令之后 PC+1,指向下一条指令
四地址指令: 执行指令后,将PC的值修改为 A4所指地址

地址码的位数有什么影响?
n位地址码的直接寻址范围 = 2n2^n,
若指令总长度固定不变,则地址码数量越多,寻址能力越差


  • 指令-按地址码数目分类

零地址指令、一地址指令、二地址指令、三地址、四地址。


  • 指令-按指令长度分类

指令字长:一条指令的总长度 (可能会变)

机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)

存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)

半字长指令、单字长指令、双字长指令 一一 指令长度是机器字长的多少倍

指令字长会影响取指令所需时间。如: 机器字长 = 存储字长 = 16bit,则取一条双字长指令需要两次访存

定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等


  • 指令-按操作码长度分类

定长操作码:指令系统所有指令的操作码长度都相同

操作码n位→2n2^n条指令

控制器的译码电路设计简单,但灵活性较低

可变长操作码:指令系统中各指令的操作码长度可变

控制器的译码电路设计复杂,但灵活性较高

下一小节会有:

定长指令字结构 + 可变长操作码 → 扩展操作码指令格式

不同地址数的指令使用不同长度的操作码


  • 指令-按操作类型分类

数据传送

LOAD 作用:把存储器中的数据放到寄存器中
STORE作用:把寄存器中的数据放到存储器中

算术逻辑操作

算术:加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反

移位操作

算术移位、逻辑移位、循环移位(带进位和不带进位)

转移操作:改变PC

无条件转移JMP
程序条件转移 JZ:结果为0;JO: 结果溢出;JC: 结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令

输入输出操作

CPU寄存器与I/O端口之间的数据传送(端口即I/O接口中的寄存器)

分类:

  1. 数据传送类: 进行主存与CPU之间的数据传送

    ——数据传送

  2. 运算类

    ——算术逻辑操作、移位操作

  3. 程序控制类:改变程序执行的顺序

    ——转移操作

  4. 输入输出类 (I/O) : 进行CPU和I/O设备之间的数传送

    ——输入输出操作


4.1.2 扩展操作码指令格式

  • 本节总览

指令由操作码和若干个地址码组成。

定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等

定长操作码:指令系统所有指令的操作码长度都相同
可变长操作码:指令系统中各指令的操作码长度可变


定长指令字结构 + 可变长操作码 → 扩展操作码指令格式
不同地址数的指令使用不同长度的操作码


  • 扩展操作码

扩展操作码举例1

三地址指令:指令字长为16位,每个地址码占4位:前4位为基本操作码字段OP,另有3个4位长的地址字段A1、A2和A3。

4位基本操作码若全部用于三地址指令,则有16条。但至少须将1111留作扩展操作码之用,即三地址指令为15条;

1111 1111留作扩展操作码之用,二地址指令为15条;

1111 1111 1111留作扩展操作码之用,一地址指令为15条;

零地址指令为16条;

以上是一种设计方法还有其他扩展操作码设计方法。

设计扩展操作码指令格式时,必须注意以下两点:(对比哈夫曼树前缀编码)

  1. 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
  2. 各指令的操作码一定不能重复。

通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

扩展操作码举例2

设指令字长固定为16位,试设计一套指令系统满足:

设地址长度为n,上一层留出m种状态,下一层可扩展出m×2n2^n种状态,如上图蓝字部分


  • 指令操作码

操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。

操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如:指出是算术加运算,还是减运算;是程序转移,还是返回操作。

操作码分类:

定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。

  • 一般n位操作码字段的指令系统最大能够表示2n2^n条指令。
  • 优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利;
  • 缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。

扩展操作码(不定长操作码):全部指的操作码字段的位数不固定,且分散地放在指令字的不同位置上。

  • 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
  • 优:在指令字长有限的前提下仍保持比较丰富的指令种类;
  • 缺:增加了指令译码和分析的难度,使控制器的设计复杂化。

4.2.1 指令寻址

  • 知识总览

指令寻址:

  • 顺序寻址
  • 跳跃寻址

指令寻址:如何确定下一条指令的存放地址?

一条指令的结构:


  • 回忆计算机的工作过程

1.2.2 各个硬件的工作原理

程序计数器PC:指明下一条指令的存放地址

对于上图主存地址只有一位:下一条指令的地址: (PC) + 1 → PC

按字节编址怎么办?
采用变长指令字结构怎么办?


  • 指令寻址

指令寻址 → 下一条 欲执行 指令地址 → (始终由程序计数器PC给出)

顺序寻址:(PC) + “1” → PC
这里的 1 理解为1个指令字长,实际加的值会因指令长度、编址方式而不同。若指令nB,则+n。

跳跃寻址:由转移指令指出

如下图:该系统采用定长指令字结构,指令字长=存储字长=16bit=2B,主存按字编址

JMP:无条件转移把PC中的内容改成7【无条件转移指令,类似c语言的 goto】

注:每一条指令的执行都分为“取指令”、“执行指令”两个阶段


4.2.2 数据寻址

  • 指令寻址 v.s.数据寻址

寻址方式:

  • 指令寻址:下一条 欲执行 指令地址 → (始终由程序计数器PC给出)
    • 顺序寻址
    • 跳跃寻址
  • 数据寻址:确定 本条指令地址码指明的真实地址

  • 知识总览

增加寻址方式位

一地址指令:

二地址指令:

求出操作数的真实地址,称为有效地址(EA)

接下来假设指令字长=机器字长=存储字长,且以一地址指令为例,
并且假设操作数为3【要找到的数为3】


  • 直接寻址

直接寻址:指令字中的形式地址A就是操作数的真实地址EA,即EA=A

一条指令的执行:
取指令 访存1次
执行指令 访存1次
暂不考虑存结果
共访存2次

优点:
简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:
A的位数决定了该指令操作数的寻址范围操作数的地址不易修改。


  • 间接寻址

间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)。

一次间接寻址:

一条指令的执行:
取指令 访存1次
执行指令 访存2次
暂不考虑存结果
共访存3次

两次间接寻址:(注意存储字最高位)

优点:
可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)
便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:
指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。


  • 寄存器寻址

寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA=RiR_i,其操作数在由RiR_i所指的寄存器内。

一条指令的执行:
取指令 访存1次
执行指令 访存0次(访问寄存器,不是访存)
暂不考虑存结果
共访存1次

优点:
指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。
缺点:
寄存器价格昂贵,计算机中寄存器个数有限。


  • 寄存器间接寻址

寄存器间接寻址:寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址即EA=(RiR_i)。

一条指令的执行:
取指令 访存1次
执行指令 访存1次
暂不考虑存结果
共访存2次

特点:
与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。


  • 隐含寻址

隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。

优点:
有利于缩短指令字长
缺点:
需增加存储操作数或隐含地址的硬件。


  • 立即寻址

立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式。
#表示立即寻址特征。

一条指令的执行:
取指令 访存1次
执行指令 访存0次
暂不考虑存结果
共访存1次

优点:
指令执行阶段不访问主存,指令执行时间最短
缺点:
A的位数限制了立即数的范围。
如A的位数为n,且立即数采用补码时,可表示的数据范围为-2^(n-1)~2^(n-1) -1


  • 本节回顾

个人觉得隐含寻址这里错了,应该有一次访存

总共10中,剩下的后面介绍


4.2.3 数据寻址2_偏移寻址

  • 知识总览


  • 偏移寻址

基址寻址:以程序的起始存放地址作为“起点”
EA=(BR)+A

变址寻址:程序员自已决定从哪里作为“起点”
EA=(IX)+A

相对寻址:以程序计数器PC所指地址作为“起点“
EA=(PC)+A

区别在于偏移的不一样“起点”


  • 基址寻址

基址寻址:将CPU中 基址寄存器(BR) 的内容加上指令格式中的形式地址A,而形成操作数的有效地址,
EA=(BR)+A

注:
BR——base address register
EA——effective address
Tips:可对比操作系统第三章第一节学习OS课中的“重定位存器”就是“基址寄存器”

有的计算机没有专门设置基址寄存器

在指令中指明,要将哪个通用寄存器作为基址寄存器使用,如下图:

那么要用几个bit指明寄存器?
——根据通用寄存器总数判断

注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定

优点:
可扩大寻址范围(基址寄存器的位数大于形式地址A的位数) ;
用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边的浮动)


  • 基址寻址的作用

如上图,当程序在主存中的位置变化时,采用基址寻址无需修改指令中的地址

优点:便于程序“浮动”,方便实现多道程序并发运行形式地址

拓展:程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统PCB中)


  • 变址寻址

变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,
EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用存器作为变址寄存器

注: IX——index register

这和基址寻址又有什么不呢?

——注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变IX作为偏移量),形式地址A不变(作为基地址)
【基址寻址中,BR保持不变作为基地址,A作为偏移量,正好相反】

优点:
在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序


  • 变址寻址的作用

对于程序:

1
2
3
for (int i = 0; i < 10; i++) {
sun += a[i];
}

未引入变址寻址:

引入变址寻址:

对于图中“比较10-(IX)”,后面再说

在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序


  • 基址&变址复合寻址

基址寻址: EA=(BR)+A
变址寻址: EA=(IX)+A
先基址后变址寻址: EA=((BR) + A) + (IX)

注:实际应用中往往需要多种寻址方式复合使用(可理解为复合函数)


  • 相对寻址

相对寻址:把程序计数器PC的内容加上指令格式中的形 式地址A而形成操作数的有效地址,
即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示

如上图:
当前指令存放地址=1000
若当前指令字长=2B,则PC+2
若当前指令字长=4B,则PC+4
因此取出当前指令后PC可能为1002 or 1004

注:王道书的小错误一一“A是相对当前指令地址的位移量” ✘,因为当前指令取出后,PC会自动+“1”
所以相对寻址是相对于下一条指令的偏移

优点:
操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动) 。相对寻址广泛应用于转移指令


  • 相对寻址的作用

对于之前的for循环例子

问题:随着代码越写越多,你想挪动for循环的位置?

优点: 这段代码在程序内浮动时不用更改跳转指令的地址码

拓展:ACC加法指令的地址码,可采用“分段”方式解决,即可采用程序段、数据段分开。


  • 本节回顾

注意: 取出当前指令后,PC会指向下一条指令,相对寻址是相对于下一条指令的偏移


  • 硬件如何实现数的“比较”

解释之前的“比较10-(IX)”

高级语言视角:

1
2
3
4
5
6
if (a > b) {
……
}
else {
……
}

硬件视角:

  • 通过”cmp指令”比较a和 b(如cmp a,b),实质上是用a-b
  • 相减的结果信息会记录在程序状态字寄存器中(PSW)
  • 根据PSW的某几个标志位(CF、ZF、SF、OF)进行条件判断,来决定是否转移

有的机器把PSW称为“标志寄存器”

注:无条件转移指令jmp 2,就不会管PSW的各种标志位

汇编语言中,条件跳转指令有很多种,如je 2 表示当比较结果为a=b时跳转到2
jg 2表示当比较结果为a>b时跳转到2


4.2.3 数据寻址3_堆栈寻址

  • 堆栈寻址

堆栈寻址:操作数存放在中,隐含使用堆指针(SP)作为操作数地址。

堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出 (LIFO)“原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针 (SP)

注: SP —— Stack Pointer

硬堆栈:用寄存器实现,所以不用访存,成本高

假设SP指向栈顶元素,R0为栈顶
现在要完成一次加法:

注意:栈顶在小地址方向 和 栈顶在大地址方向,SP的变化,上图是在小地址方向,大地址与之相反

软堆栈:从主存中划分区域,所以每次操作需要一次访存,成本低

堆栈可用函数调用时,保存当前函数的相关信息(可参考数据结构,算法空间复杂度)


  • 本节回顾


4.3.1 高级语言与机器级代码之间的对应

高级语言 → 汇编语言 → 机器语言

机器级代码:汇编语言和机器语言一一对应,都属于机器级代码

2022年开始要求掌握机器级代码

考试要求:

  • 只需关注x86汇编语言,若考察其他汇编语言题目会详细注释
  • 题目给出某段简单程序的C语言、汇编语言、机器语言表示。能结合C语言看懂汇编语言的关键语句 (看懂常见指令、选择结构、循环结构、函数调用)
  • 汇编语言、机器语言一一对应,要能结合汇编语言分析机器语言指令的格式、寻址方式
  • 不会考:将C语言人工翻译为汇编语言或机器语言
  • x86汇编语言指令基础

起源:Intelx86架构CPU(代号8086的CPU)

指令:

  • 作用:
    • 改变程序执行流
    • 处理数据
  • 格式:操作码 + 地址码
    • 操作码:说明去怎么处理?
    • 地址码:说明数据在哪?
      • 在寄存器:在指令中给出“寄存器名”,x86架构的CPU有哪些寄存器?
      • 在主存里:在指令中给出“主存地址“,怎么在指令中指明读写长度?
      • 在指令里:直接在指令中给出要操作的数也就是“立即寻址”

  • 以 mov 指令为例

格式:

1
2
mov 目的操作数d, 源操作数s
# mov指令功能: 将源操作数s复制到目的操作数d所指的位置

destination: 目的地
source: 来源、发源地

举例:

1
2
3
4
mov eax, ebx				# 将寄存器 ebx 的值复制到寄存器 eax
mov eax, 5 # 将立即数 5 复制到寄存器 eax
mov eax, dword ptr [af996h] # 将内存地址 af996h 所指的32bit值复制到寄存器 eax
mov byte ptr [af996h], 5 # 将立即数 5 复制到内存地址 af996h 所指的一字节中

x86架构不允许两个操作数都来自主存

如何指明内存的读写长度:
dword ptr——双字,32bit
word ptr——单字,16bit
byte ptr一一字节,8bit
不加修饰符,默认32位


  • x86架构CPU,有哪些寄存器?

【奔腾】

变址寄存器可用于线性表、字符串的处理
堆栈寄存器用于实现函数调用

1
2
3
mov eax, ebx				# 寄存器→寄存器
mov eax, dword ptr [af996h] # 主存→寄存器
mov eax,5 # 立即数→寄存器

对于通用寄存器:

两个变址寄存器只能固定使用32bit
两个堆栈寄存器只能固定使用32bit

1
2
3
mov ax, bx					# 寄存器→寄存器
mov ax, word ptr [af996h] # 主存→寄存器
mov ax,5 # 立即数→寄存器

1
2
3
mov al, bl					# 寄存器→寄存器
mov al, byte ptr [af996h] # 主存→寄存器
mov al,5 # 立即数→寄存器

考试常见的是使用32位的寄存器


  • 更多的例子
1
2
3
4
5
6
7
mov eax, dword ptr [ebx]	# 将 ebx 所指主存地址的32bit 复制到 eax 寄存器中
mov dword ptr [ebx], eax # 将 eax 的内容复制到 ebx 所指主存地址的 32bit
mov eax, byte ptr [ebx] # 将 ebx 所指的主存地址的 8bit 复制到 eax
mov eax, [ebx] # 若未指明主存读写长度,默认 32 bit
mov [af996h], eax # 将 eax 的内容复制到 af996h 所指的地址(未指明长度默认32bit
mov eax, dword ptr [ebx+8] # 将 ebx+8 所指主存地址的32bit 复制到eax 寄存器中所指主存地址的 32bit 复制到eax 寄存器中
mov eax, dword ptr [af996h-12h] # 将 af996h-12h 所指主存地址的32bit 复制到eax 寄存器中所指主存地址的 32bit 复制到eax 寄存器中

  • 总结

指令:

  • 作用:

    • 改变程序执行流
    • 处理数据
  • 格式:操作码 + 地址码

    • 操作码:说明去怎么处理?

    • 地址码:说明数据在哪?

      • 在寄存器:

        在汇编指令中,给出寄存器名
        通用寄存器: eax、ebx、ecx、edx
        变址寄存器: esi、edi
        堆栈寄存器: ebp、esp

      • 在主存里:

        在汇编增令中,给出读写长度、主存地址
        dword ptr [地址] #32bit
        word ptr [地址] #16bit
        byte ptr [地址] #8bit

      • 在指令里:

        在汇编指令中,直接给出常量, 即“立即寻址”可用十进制表示、也可用十六进制(常以h结尾)


4.3.2 常用的x86汇编指令

  • 本节总览

指令格式:操作码 + 地址码

  • 操作码:说明去怎么处理

    算数运算:加、减、乘、除、取负数、自增++、自减–

    逻辑运算:与、或、非、异或、左移、右移
    其他

  • 地址码:说明数据在哪?


  • 常见的算数运算指令

destination: 目的地(d 目的操作数)
source: 来源地 (s 源操作数)
目的操作数 d 不可以是常量【显而易见的】

功能 英文 汇编指令 注释
add add d, s # 计算d+s,结果存入d
subtract sub d, s # 计算d-s,结果存入d
multiply mul d, s
imul d, s
# 无符号数d*s,乘积存入d
# 有符号数d*s,乘积存入d
divide div s
idiv s
# 无符号数除法 edx:eax/s,商存入eax,余数存入edx
# 有符号数除法 edx:eax/s,商存入eax,余数存入edx
取负数 negative neg d # 将d取负数,结果存入d
自增++ increase inc d # 将d++,结果存入d
自减– decrease dec d # 将d–,结果存入d

上面的除,因为除数是32位,所以计算前需要先把被除数扩展为64位


  • 关于王道书的解释
1
2
3
4
5
add <reg>,<reg> / sub <reg>,<reg>
add <reg>,<mem> / sub <reg>,<mem>
add <mem>,<reg> / sub <mem>,<reg>
add <reg>,<con> / sub <reg>,<con>
add <mem>,<con> / sub <mem>,<con>

<reg> 寄存器 register
<mem> 内存 memory
<con> 常数 constant

x86架构不允许两个操作数都来自主存


  • 常见的逻辑运算指令
功能 英文 汇编指令 注释
and and d, s # 将 d、s 逐位相与,结果放回d
or or d, s # 将 d、s 逐位相或,结果放回d
not not d # 将 d 逐位取反,结果放回d
异或 exclusive or xor d, s # 将 d、s 逐位异或,结果放回d
左移 shift left shl d, s # 将d逻辑左移s位,结果放回d (通常s是常量)
右移 shift right shr d, s # 将d逻辑右移s位,结果放回d (通常s是常量)

  • 其他指令

用于实现分支结构、循环结构的指令: cmp、test、jmp、jxxx

用于实现函数调用的指令: push、pop、call、ret

用于实现数据转移的指令: mov


4.3.3 AT&T格式和Intel格式

  • AT&T格式 v.s. Intel格式

之前学的是Intel格式,往年408考的都是这个格式

AT&T格式——Unix、Linux的常用格式

Intel格式——Windows的常用格式


4.3.4 选择语句的机器级表示

  • 无条件跳转指令

格式:

1
jmp <地址>	# PC 无条件转移至<地址>

举例:

1
2
3
jmp 128		# <地址>可以用常数给出
jmp eax # <地址>可以来自于寄存器
jmp [999] # <地址>可以来自于主存

特别的:跳转到标号的位置
特征——有冒号名字可以自己取

1
jmp NEXT	# <地址>可以用“标号”锚定

举例:

1
2
3
4
5
6
mov eax,7
mov ebx,6
jmp NEXT
mov ecx,ebx
NEXT: # 用”标号”锚定位置
mov ecx,eax

  • 条件转移指令——jxxx
1
cmp a, b	# 比较a和b两个数

a、b两个数可能来自寄存器/主存/常量

1
2
3
4
5
6
je <地址>		# jump when equal,若a==b则跳转
jne <地址> # jump when not equal,若a!=b则跳转
jg <地址> # jump when greater than,若a>b则跳转
jge <地址> # jump when greater than or equal to,若a>=b则跳转
jl <地址> # jump when less than,若a<b则跳转
jle <地址> # jump when less than or equal to,若a<=b则跳转

条件转移指令一般要和 cmp 指令一起使用:

1
2
cmp eax,ebx		# 比较寄存器eax和ebx里的值
jg NEXT # 若 eax > ebx,则跳转到 NEXT:

  • 示例: 选择语句的机器级表示

原程序:

1
2
3
4
5
6
if (a > b) {
c = a;
}
else {
c = b;
}

翻译成汇编1:

1
2
3
4
5
6
7
8
9
mov eax,7		# 假设变量a=7,存入eax
mov ebx,6 # 假设变量b=6,存入ebx
cmp eax,ebx # 比较变量a和b
jg NEXT # 若a>b,转移到NEXT :
mov ecx,ebx # 假设用ecx存储变量c,令c=b
jmp END # 无条件转移到END :
NEXT:
mov ecx,eax # 假设用ecx存储变量c,令c=a
END:

翻译成汇编2:

1
2
3
4
5
6
7
8
9
mov eax,7		# 假设变量a=7,存入eax
mov ebx,6 # 假设变量b=6,存入ebx
cmp eax,ebx # 比较变量a和b
jle NEXT # 若a≤b,转移到NEXT :
mov ecx,eax # 假设用ecx存储变量c,令c=a
jmp END # 无条件转移到END:
NEXT:
mov ecx,ebx # 假设用ecx存储变量c,令c=b
END:

  • 历年真题

【2019 统考真题】已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数 f1的源程序(阴影部分) 及其在 32 位计算机 M上的部分机器级代码如下:

其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机 M 按字节编址,int 型数据占32 位。请回答下列问题:
……

写汇编语言代码时,一般会以函数名作为“标号”,标注该函数指令的起始地址


  • 扩展: cmp 指令的底层原理

cmp指令本质上是进行 a-b 减法运算,并生成标志位OF、ZF、CF、SF

ALU每次运算的标志位都自动存入PSW 程序状态字寄存器 (Intel称其为“标志寄存器”)【每次计算都会覆盖标志位】

1
2
3
4
5
6
je <地址>		# 若a==b则跳转,ZF==1 ?
jne <地址> # 若a!=b则跳转,ZF==0 ?
jg <地址> # 若a>b则跳转,ZF==0 && SF==OF ?
jge <地址> # 若a>=b则跳转,SF==OF ?
jl <地址> # 若a<b则跳转,SF!=OF ?
jle <地址> # 若a<=b则跳转,SF!=OF || ZF==1 ?

4.3.5 循环语句的机器级表示

  • 用条件转移指令实现循环

原程序:

1
2
3
4
5
// 求 1 + 2 + 3 + …… + 100
int result = 0;
for (int i = 1; i <= 100; i++) {
result += i;
}

翻译成汇编语言:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# --- ①循环前的初始化 ---
mov eax, 0 # 用 eax 保存 result,初值为0
mov edx, 1 # 用 edx 保存 i,初始值为1

# --- ②是否直接跳过循环? ---
cmp edx, 100 # 比较 i 和 100
jg L2 # 若i>100,转跳到 L2 执行#循环主体

# --- ③循环主体 ---
L1:
add eax, edx # 实现 result +=i #若 i<=100,转跳到 L1 执行
inc edx # inc 自增指令,实现 i++

# --- ④是否继续循环? ---
cmp edx, 100 # 比较 i 和 100
jle L1

L2: # 跳出循环主体

用条件转移指令实现循环,需要4个部分构成:
①循环前的初始化
②是否直接跳过循环?
③循环主体
④是否继续循环?

个人觉得:就三步
①初始化
②判断
③循环体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# --- ①初始化 ---
mov eax, 0 # 用 eax 保存 result,初值为0
mov edx, 1 # 用 edx 保存 i,初始值为1

# --- ②判断 ---
L1:
cmp edx, 100 # 比较 i 和 100
jg L2 # 若i>100,转跳到 L2 执行#循环主体

# --- ③循环体 ---
add eax, edx # 实现 result +=i #若 i<=100,转跳到 L1 执行
inc edx # inc 自增指令,实现 i++
jmp L1 # 循环

L2: # 跳出循环主体

  • 用loop指令实现循环

原程序:

1
2
3
for (int i = 500; i > 0; i--) {
某些处理
}

翻译成汇编:

1
2
3
4
5
6
mov ecx, 500	# 用ecx作为循环计数器
Looptop: # 循环的开始
……
某些处理
……
loop Looptop # eCX--,若ecx!=0,跳转到Looptop

loop Looptop等价于:

1
2
3
dec ecx
cmp ecx, 0
jne Looptop

理论上,能用 loop 指令实现的功能一定能用条件转移指令实现

使用 loop 指令可能会使代码更清晰简洁

补充:loopx 指令——如loopnz,loopz
loopnz——当 ecx!=0 && ZF==0 时,继续循环
loopz一一当 ecx!=0 && ZF==1 时,继续循环


4.3.6.1 Call和ret指令(函数调用的机器级表示)

  • 高级语言的函数调用

函数的栈帧 (Stack Frame) : 保存函数大括号内定义的局部变量、保存函数调用相关的信息


  • x86汇编语言的函数调用

函数调用指令:call <函数名>
函数返回指令:ret

通常用函数名作为函数起始地址的<标号>


  • call、ret指令

注:x86处理器中程序计数器 PC (Program Counter)通常被称为IP (Instruction Pointer)

call 指令的作用:
①将IP旧值压栈保存(保存在函数的栈顶部)
②设置IP新值无条件转移至被调用函数的第一条指令

ret 指令的作用:
从函数的栈帧顶部找至IP旧值将其出栈并恢复IP寄存器


  • 总结:函数调用的机器级表示


  • 小朋友,你是否有很多问号 ?

如何传递调用参数、返回值?

如何访问栈帧里的数据?

栈帧内可能包含哪些内容?

为什么倒过来了?


4.3.6.2 如何访问栈帧(函数调用的机器级表示)

  • 函数调用栈在内存中的位置

所以注:大多数教材的图示,通常栈底在上,栈顶在下


  • 标记栈帧范围: EBP、ESP寄存器

ebp:指向当前栈帧的”底部“
esp:指向当前栈帧的“顶部“

注:x86 系统中,默认以4字节为栈的操作单位


  • 访问栈帧数据: push、pop 指令

push、pop 指令实现入栈、出栈操作,x86 默认以4字节为单位。指令格式如下:

1
2
Push ♦	// 先让esp减4,再将♦压入
Pop ♠ // 栈顶元素出栈写入♠,再让 esp加4

注1: ♦可以是立即数、寄存器、主存地址
注2: ♠可以是寄存器、主存地址

例:

1
2
3
4
5
6
push eax		# 将寄存器eax的值(211)压栈
push 985 # 将立即数985压栈
push [ebp+8] # 将主存地址[ebp+8]里的数据(666)压栈

pop eax # 栈顶元素出栈,写入寄存器eax
pop [ebp+8] # 栈顶元素出栈,写入主存地址[ebp+8]

结果如图:


  • 访问栈帧数据: mov 指令

例:

1
2
3
4
5
6
sub esp, 12			# 栈顶指针-12
mov[esp+8], eax # 将eax的值复制到主存[esp+8]
mov[esp+4], 958 # 将985复制到主存[esp+4]
mov eax, [ebp+8] # 将主存[ebp+8]的值复制到eax
mov [esp], eax # 将eax的值复制到主存[esp]
add esp, 8 # 栈顶指针+8

可以用 mov 指令,结合 esp、ebp 指针访问栈帧数据

可以用减法/加法指令,即 sub/add 修改栈顶指针 esp 的值


  • 总结: 如何仿问栈帧?

方法一:push、pop

方法二:mov 指令,结合 esp、ebp 指针访问栈帧数据


4.3.6.3 如何切换栈帧(函数调用的机器级表示)

怎么切换?

  • 函数调用时,如何切换栈帧?

call 指令的作用:
①将IP旧值压栈保存(效果相当于push IP
②设置IP新值无条件转移至被调用函数的第一条指令(效果相当于jmp add

ret 指令的作用:
从函数的栈帧顶部找至IP旧值将其出栈并恢复IP寄存器

注:每个栈帧底部,用于保存上一层栈帧的基址


  • 总结:函数调用的机器级表示


  • 历年真题

【2019 统考真题】已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数 f1的源程序(阴影部分) 及其在 32 位计算机 M上的部分机器级代码如下:

其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机 M 按字节编址,int 型数据占32 位。请回答下列问题:
……

【2017年真题】44.(10 分)在按字节编址的计算机M上,题43 中f1 的部分源程序(阴影影部分)与对应的机器级代码(包括指令的虚拟地址) 如下:
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令。请回答下列问题。


4.3.6.4 如何传递参数和返回值(函数调用的机器级表示)

  • 一个栈帧内可能包含哪些内容?
1
2
3
4
5
6
7
8
9
int caller() {
int temp1 = 125;
int temp2 = 80;
int sum = add(temp1, temp2);
return sum
}
int add(int x, int y) {
return x + y;
}

内容 是否存在
栈帧最底部一定是上一层栈帧基址(ebp旧值) 一定存在。用于恢复上一层函数的栈帧
通常将局部变量集中存储在栈帧底部区域 不一定存在。有些函数可能不定义局部变量
gcc 编译器将每个栈帧大小设置为 16B 的整数倍 (当前函数的栈除外)因此栈帧内可能出现空闲未使用的区域 不一定存在。如果其他部分刚好是16B整数倍,则不会留下“零头
通常将调用参数集中存储在栈帧顶部区域 不一定存在。有些函数调用不需要传参数
栈帧最顶部一定是返回地址(当前函数的栈帧除外 ) 一定存在 (发生调用时 )。但凡调用其他函数,就必须记录返回地址

  • 汇编代码实战

点击空降 8:36~15:17

直接看视频吧


  • 总结: 函数调用的机器级表示


  • 拓展: 一个栈帧内可能包含哪些内容?

不一定存在。如果这些寄存器值不是运算的中间结果,则可以不保存


  • 总结


4.4 CISC和RISC

  • 本章总览

指令系统:

  • 指令格式
    ——如何用二进制代码表示指令
  • 指令寻址方式
    ——给出下一条指令的地址
    ——给出要操作的对象的地址
  • CISC和RISC
    ——两种设计方向

  • CISC和RISC
CISC RISC
Complex Instruction Set Computer Reduced Instruction Set Computer
设计思路: 一条指令完成一个复杂的基本功能 设计思路: 一条指令完成一个基本“动作”;
多条指令组合完成一个复杂的基本功能
代表:x86架构,主要用于笔记本、台式机等 代表:ARM架构,主要用于手机、平板等

80-20规律: 典型程序中 80% 的语句仅仅使用处理机中 20% 的指令

比如设计一套能实现整数、矩阵加/减/乘运算的指令集:
CISC的思路:除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令

一条指令可以由一个专门的电路完成

有的复杂指令用纯硬件实现很困难
→采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令
RISC思路:只提供整数的减乘指令

一条指令一个电路,电路设计相对简单,功耗更低

这些特性可以方便实现“并行”、“流水线”

总结

回忆:

乘法指令可以访存,一定是CISC


第五章 中央处理器

5.0 回忆过去

1.2.2 各个硬件的工作原理:

  • 运算器的基本组成

  • 控制器的基本组成

  • 计算机的工作过程


  • 本章总览


5.1 CPU的功能和基本结构

  • CPU的功能

1、指令控制。完成取指令、分析指令和执行指令的操作,即程序的顺序控制

2、操作控制。一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。

3、时间控制。对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。

4、数据加工。对数据进行算术和逻辑运算

5、中断处理。对计算机运行过程中出现的异常情况和特殊请求进行处理


  • 运算器和控制器的功能

运算器:对数据进行加工

控制器:协调并控制计算机各部件执行程序的指令序列,基本功能包括取指令、分析指令、执行指令

  1. 取指令:自动形成指令地址;自动发出取指令的命令。
  2. 分析指令:操作码译码(分析本条指令要完成什么操作);产生操作数的有效地址。
  3. 执行指令:根据分析指令得到的“操作命令”和“操作数地址”形成操作信号控制序列,控制运算器、存储器以及I/O设备完成相应的操作。
  4. 中断处理:管理总线及输入输出;处理异常情况(如掉电)和特殊请求(如打印机请求打印一行字符)。

  • 运算器的基本结构
  1. 算术逻辑单元:主要功能是进行算术/逻辑运算。
  2. 通用寄存器组:如AX、BX、CX、DX、SP等,用于存放操作数 (包括源操作数、目的操作数及中间结果)和各种地址信息等。SP是堆栈指针,用于指示栈顶的地址。
  3. 暂存寄存器:用于暂存从主存读来的数据,这个数据不能存放在通用寄存器中,否则会破坏其原有内容
  4. 累加寄存器:它是一个通用寄存器,用于暂时存放ALU运算的结果信息,用于实现加法运算。
  5. 程序状态字寄存器:保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息,如溢出标志(OP)、符号标志 (SF)、零标志 (ZF)、进位标志(CF)等。PSW中的这些位参与并决定微操作的形成
  6. 移位器:对运算结果进行移位运算。
  7. 计数器:控制乘除运算的操作步数。
  • 专用数据通路方式:根据指令执行过程中的数据和地址的流动方向安排连接线路

问题:如果直接用导线连接,相当于多个寄存器同时并且一直向ALU传输数据

解决方法1.使用多路选择器根据控制信号选择一路输出

解决方法2.使用三态门可以控制每一路是否输出,如: R0out为1时,R0中的数据输出到A端; R0out为0时,R0中的数据无法输出到B端A端(感觉这里错了,说的是A端吧)

性能较高,基本不存在数据冲突现象,但结构复杂,硬件量大,不易实现。

  • CPU内部单总线方式:将所有寄存器的输入端和输出端都连接到一条公共的通路上。

结构简单,容易实现,但数据传输存在较多冲突的现象,性能较低。


  • 控制器的基本结构

  1. 程序计数器PC:用于指出下一条指令在主存中的存放地址。CPU就是根据PC的内容去主存中取指令的。因程序中指令 (通常) 是顺序执行的,所以PC有自增功能。
  2. 指令寄存器IR:用于保存当前正在执行的那条指令
  3. 指令译码器:仅对操作码字段进行译码,向控制器提供特定的操作信号。
  4. 微操作信号发生器:根据IR的内容(指令)、PSW的内容(状态信息)及时序信号,产生控制整个计算机系统所需的各种控制信号,其结构有组合逻辑型和存储逻辑型两种。
  5. 时序系统:用于产生各种时序信号,它们都是由统一时钟 (CLOCK)分频得到。
  6. 存储器地址寄存器:用于存放所要访问的主存单元的地址。
  7. 存储器数据寄存器:用于存放向主存写入的信息或从主存中读出的信息。

  • CPU的基本结构

图中MDRinE中的E表示从外部来
用户可见的寄存器(可编程):图中褐色框;
不可见:图中灰色框

本章主要探讨CU


  • 本节回顾

管理多条通路: 多路选择器MUX与三态门

用户可见的寄存器:通用寄存器组、程序状态字寄存器PSW、程序计数器PC
用户不可见的寄存器:MAR、MDR、IR、暂存寄存器


5.2 指令周期的数据流

  • 指令周期

指令周期:CPU从主存中每取出并执行一条指令所需的全部时间。
指令周期常常用若干机器周期来表示,机器周期又叫CPU周期

一个机器周期又包含若时钟周期 (也称节拍T周期CPU时钟周期,它是CPU操作的最基本单位)。

每个指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等,举例如下:


  • 指令周期流程

CPU又是如何区分处于哪个时期?设置触发器

四个工作周期都有CPU访存操作,只是访存的目的不同。 取指周期FE=1是为了取指令间址周期IND=1是为了取有效地址执行周期EX=1是为了取操作数中断周期INT=1是为了保存程序断点


  • 指令周期的数据流-取指周期

  1. 当前指令地址送至存储器地址寄存器,记做:(PC) → MAR
  2. CU发出控制信号,经控制总线传到主存,这里是读信号,记做:1 → R
  3. 将MAR所指主存中的内容经数据总线送入MDR,记做:M(MAR) → MDR 【M(MAR) 即:MEM(MAR)】
  4. 将MDR中的内容(此时是指令)送入IR, 记做:(MDR) → IR
  5. CU发出控制信号,形成下一条指令地 址,记做:(PC)+1 → PC

  • 指令周期的数据流-间址周期

  1. 将指令的地址码送入MAR, 记做:Ad(IR) → MAR 或Ad(MDR) → MAR 【因为从取值周期可以知道,IR是从MDR中复制一份的】
  2. CU发出控制信号,启动主存做读操作, 记做:1 → R
  3. 将MAR所指主存中的内容经数据总线 送入MDR,记做:M(MAR) → MDR
  4. 有效地址送至指令的地址码字段, 记做:MDR→ Ad(IR)

  • 指令周期的数据流-执行周期

执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。 不同指令的执行周期操作不同,因此没有统一的数据流向。


  • 指令周期的数据流-中断周期

中断:暂停当前任务去完成其他任务。 为了能够恢复当前任务,需要保存断点。 一般使用堆栈来保存断点,这里用SP表示栈顶地址,假设SP指向栈顶元素,进栈操作是先修改指针后存入数据

  1. CU控制将SP减1,修改后的地址送入MAR,记做: (SP)-1 → SP,(SP) → MAR
    本质上是将断点存入某个存储单元,假设其地址为a,故可记做:a → MAR

  2. CU发出控制信号,启动主存做写操作, 记做:1 → W

  3. 将断点(PC内容) 送入MDR, 记做:(PC) → MDR

  4. CU控制将中断服务程序的入口地址 (由向量地址形成部件产生)送入PC, 记做:向量地址→ PC


  • 指令执行方案

一个指令周期通常要包括几个时间段(执行步骤),每个步骤完成 指令的一部分功能,几个依次执行的步骤完成这条指令的全部功能。

  • 方案1.单指令周期

对所有指令都选用相同的执行时间来完成 。
指令之间串行执行;指令周期取决于执行时间最长的指令的执行时间。
缺点:对于那些本来可以在更短时间内完成的指令,要使用这个较长的周期来完成,会降低整个系统的运行速度。

  • 方案2.多指令周期

对不同类型的指令选用不同的执行步骤来完成 。
指令之间串行执行;可选用不同个数的时钟周期来完成不同指令的执行过程 。
缺点:需要更复杂的硬件设计。

  • 方案3.流水线方案

在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中 。
指令之间并行执行。


5.3.1 数据通路-单总线结构

大题高频考点

  • 指令周期的数据流


  • 数据通路

数据通路:数据在功能部件之间传送的路径。

信息从哪里开始,中间经过哪些部件,最后传到哪里

由控制部件(下图中的微操作信号发生器)产生的控制信号建立数据通路

数据通路的基本结构:

  1. CPU内部单总线方式。如上图,本小节主要探讨这部分内容
  2. CPU内部多总线方式。
  3. 专用数据通路方式。5.1 CPU的功能和基本结构 中 运算器的基本结构中提到

  • 数据通路-CPU内部单总线方式

图中的寄存器信号(PCin、IRin……)都是由CU发出

内部总线是指同一部件,如CPU内部连接各寄存器及运算部 件之间的总线;
系统总线是指同一台计算机系统的各部件,如CPU、内存、 通道和各类I/O接口间互相连接的总线。

  1. 寄存器之间数据传送

比如把PC内容送至MAR,实现传送操作的流程及控制信号为:

(PC)→Bus ———— PCout有效,PC内容送总线(Bus)
Bus→MAR ———— MARin有效,总线内容送MAR

也可写为:(PC)→Bus→MAR
也有的教材写为:PC→Bus→MAR

所以加不加括号看题,重要的是描述清楚数据流向,建议都加上,或者与题目示例保持一致

  1. 主存与CPU之间的数据传送

比如CPU从主存读取指令,实现传送操作的流程及控制信号为:

(PC)→Bus→MAR ———— PCout和MARin有效,现行指令地址→MAR
1 → R —— ——CU发读命令(通过控制总线发出,图中未画出(补上了))
MEM(MAR)→MDR ———— MDRinMDRinE有效【加上E表示来自外部】
MDR→Bus→IR ———— MDRout和IRin有效,现行指令→IR

  1. 执行算术或逻辑运算

比如一条加法指令,微操作序列及控制信号为:

Ad(IR)→Bus→MAR ———— MDRout和MARin有效 或 AdIRout和MARin有效
1 → R —— ——CU发读命令(通过控制总线发出,图中未画出(补上了))
MEM(MAR)→MDR ———— MDRinMDRinE有效【加上E表示来自外部】
MDR→Bus→Y ———— MDRout和Yin有效,操作数→Y
(ACC)+(Y)→Z ———— ACCout和ALUin有效,CU向ALU发送加命令
Z→ACC ———— Zout和ACCin有效,结果→ACC
【Y和Z是暂存寄存器】


  • CPU内部单总线方式-例题

设有如图所示的单总线结构,分析指令 ADD (R0),R1 的指令流程和控制信号。【出过两年大题】

  1. 分析指令功能和指令周期
    功能: ((R0))+(R1)→(R0)
    取指周期、间址周期、执行周期
  2. 写出各阶段的指令流程

取指周期:公共操作

或者

间址周期:完成取数操作,被加数在主存中,加数已经放在寄存器R1中。
【发现这里和之前介绍的有所不同,这是由于教材不同导致的,主要还是看题目。
之前:访存,将间接地址转化成直接地址,然后写回IR中
本题:直接访存找到了操作数,放到MDR中】

执行周期:完成取数操作,被加数在主存中,加数 已经放在寄存器R1中。

为什么第三步是MARout?
——因为要写回(R0)这个地址,但是在间址周期还存有地址(R0),所以直接控制MAR输出即可


  • 本节回顾

区别内部总线与系统总线

学会各阶段的微操作序列和控制信号

CPU内部总线:

  • 单总线
    ALU需要配合暂存器使用
  • 多总线
    ALU不需要

5.3.2 数据通路-专用通路结构

  • 专用数据通路


  • 专用数据通路方式-取指周期
  1. (PC)→MAR ———— C0有效
  2. (MAR)→主存 ———— C1有效
  3. 1→R ———— 控制单元向主存发送读命令
  4. M(MAR)→MDR ———— C2有效
  5. (MDR)→IR ———— C3有效
  6. (PC)+1→PC ———— (图中没有就不写)
  7. Op(IR)→CU ———— C4有效


  • 专用数据通路方式-例题

下图是一个简化了的CPU与主存连接结构示意图(图中省略了所有的多路选择器)。其中有一个累加寄存器(ACC)、一个状态数据寄存器和其他4个寄存器:主存地址寄存器(MAR)、主存数据寄存器(MDR)、程序寄存器(PC)和指令寄存器(IR),各部件及其之间的连线表示数据通路,箭头表示信息传递方向。 要求:

(1)请写出图中a、b、c、d 4个寄存器的名称。
(2)简述图中取指令的数据通路。
(3)简述数据在运算器和主存之间进行存/取访问的数据通路。
(4)简述完成指令LDA X的数据通路(X为主存地址,LDA的功能为(X)→ACC)。
(5)简述完成指令ADD Y的数据通路(Y为主存地址,ADD的功能为(ACC)+(Y)→ACC)。
(6)简述完成指令STA Z的数据通路(Z为主存地址,STA的功能为(ACC)→Z)。

:(1)
d 能自动“+1”,是PC
PC内容是地址,送MAR,故c是MAR
b 与微操作信号发生器相连,是IR
与主存相连的寄存器是MAR和MDR,c是MAR, 则a是MDR

(2)
(PC)→MAR
M(MAR)→MDR
(MDR)→IR
不放心可以加上:
OP(IR)→微操作信号发生器 (译码,OP(IR)表示IR中的操作码)
(PC) + 1 = PC

(3)
存/取的数据放到ACC中
设数据地址已放入MAR
取:
M(MAR) → MDR
MDR → ALU → ACC【由于ALU不是寄存器,所以不加括号】
存:
(ACC) → MDR
(MDR) → M(MAR)

(4)
X → MAR 或者Ad(IR) → MAR【X是一个数,所以不加“()”】
M(MAR) → MDR
(MDR) → ALU → ACC

(5)
Y → MAR 或者Ad(IR) → MAR【Y是一个数,所以不加“()”】
M(MAR) → MDR
(MDR) → ALU, (ACC) → ALU
ALU → ACC 【应该要有个暂存寄存器,等电路稳定再输出结果,图中没有就不管了】

(6)
Z → MAR 或者Ad(IR) → MAR【Z是一个数,所以不加“()”】
(ACC) → MDR
(MDR) → M(MAR)


  • 本节回顾

对于一个部件有多个输入,可以采用多路选择器或者三态门


5.4.1 硬布线控制器设计

控制器的设计:

  • 硬布线控制器
  • 微程序控制器
  • 内容回顾

CPU发出一个微命令,可完成对应微操作。
如: 微命令1 使得 PCout、MARin 有效。完成对应的微操作1(PC) → MAR

一个节拍内可以并行完成多个“相容的微操作

同一个微操作可能在不同指令的不同阶段被使用,如图

不同指令的执行周期所需节拍数各不相同。为了简化设计,选择定长的机器周期,以可能出现的最大节拍数为准(通常以访存所需节拍数作为参考)

若实际所需节拍数较少,可将微操作安排在机器周期末尾几个节拍上进行(如上图执行周期和中断周期,微操作放在T1、T2,而不放在T0)

根据 指令操作码目前的机器周期节拍信号机器状态条件,即可确定现在这个节拍下应该发出哪些“微命令


  • 硬布线控制器

控制单元CU采用硬布线方式设计就是硬布线控制器

那么什么时候CU发出C1微操作命令?

——所有指令的取指周期并且处于T0节拍下,一定要完成(PC)→MAR。则可知 C1=FE·T0,所以如下设计

Tips:逻辑表达式是电路的数学化描述

这只是个简单的


  • 颤抖吧! 感受恐惧!

M (MAR)→MDR 微操作命令的逻辑表达式:
FET1+INDT1(ADD+STA+LDA+JMP+BAN)+EXT1(ADD+LDA)FE·T_1+IND·T_1(ADD+STA+LDA+JMP+BAN)+EX·T_1(ADD+LDA)

上图中蓝色线接到操作码译码器

首先这么复杂考试肯定不考

注: 一般不考电路,莫慌~


  • 硬布线控制器的设计

设计步骤:

  1. 分析每个阶段的微操作序列(取值、间址、执行、中断 四个阶段)
    ——确定哪些指令在什么阶段、在什么条件下会使用到的微操作
    ——主要还是执行阶段,其他三个都差不多
  2. 选择CPU的控制方式
    ——采用定长机器周期还是不定长机器周期? 每个机器周期安排几个节拍?
    ——假设采用同步控制方式(定长机器周期),一个机器周期内安排3个节拍。
  3. 安排微操作时序
    ——如何用3个节拍完成整个机器周期内的所有微操作?
  4. 电路设计
    ——确定每个微操作命令的逻辑表达式并用电路实现

首先还好不考电路设计


  • 分析每个阶段的微操作序列

罗列出所有指令在各个阶段的微操作序列,就可以知道在什么情况下需要使用这个微操作

注:中断周期内的微操作序列就不分析了,原理类似


  • 安排微操作时序的原则

原则一 微操作的 先后顺序不得 随意 更改

前:(PC)→MAR
后:M(MAR)→MDR

原则二 被控对象不同 的微操作,尽量安排在 一个节拍 内完成

(PC)→MAR —— 被控对象:寄存器
1 → R —— 被控对象:主存

原则三 占用 时间较短 的微操作,尽量 安排在 一个节拍 内完成,并 允许有先后顺序


  • 安排微操作时序-取指周期

分析:

安排:

因为(4)(5)两个微操作占用时间较短,根据原则三安排在一个节拍

为什么(3)(4)不能安排在一起?
——M(MAR)→MDR 从主存取数据,用时较长,因此必须一个时钟周期才能保证微操作的完成

为什么(4)(5)可以安排在一起?
——MDR→IR 是CPU内部寄存器的数据传送,速度很快,因此在一个时钟周期内可以紧接着完成 OP(IR)→ID
也就是可以一次同时发出两个微命令。


  • 安排微操作时序-间址周期


  • 安排微操作时序-执行周期

非访存指令和访存指令——是否有间址周期


  • 组合逻辑设计

设计步骤:

  1. 列出操作时间表
    ——列出在取指、间址、执行、中断周期,T0、T1、T2 节拍内有可能用到的所有微操作(王道书 表5.1)
  2. 写出微操作命令的最简表达式
  3. 画出逻辑图

第一步:列出操作时间表

把上面三个表的M (MAR)→MDR 挑出来,其微操作命令的逻辑表达式:
FET1+INDT1(ADD+STA+LDA+JMP+BAN)+EXT1(ADD+LDA)FE·T_1+IND·T_1(ADD+STA+LDA+JMP+BAN)+EX·T_1(ADD+LDA)
= T1{FE+IND(ADD+STA+LDA+JMP+BAN)+EX(ADD+LDA)}T_1\{FE+IND(ADD+STA+LDA+JMP+BAN)+EX(ADD+LDA)\}


  • 画出逻辑图

FET1+INDT1(ADD+STA+LDA+JMP+BAN)+EXT1(ADD+LDA)FE·T_1+IND·T_1(ADD+STA+LDA+JMP+BAN)+EX·T_1(ADD+LDA)
= T1{FE+IND(ADD+STA+LDA+JMP+BAN)+EX(ADD+LDA)}T_1\{FE+IND(ADD+STA+LDA+JMP+BAN)+EX(ADD+LDA)\}


  • 硬布线控制器的设计

设计步骤:

  1. 分析每个阶段的微操作序列
  2. 选择CPU的控制方式
  3. 安排微操作时序
  4. 电路设计
    (1)列出操作时间表
    (2)写出微操作命令的最简表达式
    (3)画出逻辑图

硬布线控制器的特点
指令越多,设计和实现就越复杂,因此一般用于 RISC(精简指令集系统)
如果扩充一条新的指令,则控制器的设计就需要大改,因此扩充指令较困难。
由于使用纯硬件实现控制,因此执行速度很快。微操作控制信号由组合逻辑电路即时产生


5.4.2 微程序控制器的基本原理

  • 硬布线控制器的设计思路

硬布线控制器:微操作控制信号由组合逻辑电路根据当前的指令码、状态和时序,即时产生
时序信息包含机器周期、节拍


  • 微程序控制器的设计思路

采用“存储程序”的思想,CPU出厂前将所有指令的“微程序“存入“控制器存储器”中

程序:由指令序列组成
微程序:由微指令序列组成,每一种指令对应一个微程序

指令是对程序执行步骤的描述
微指令是对指令执行步骤的描述

微命令微操作一一对应
微指令中可能包含多个微命令

指令周期:从主存取出并执行一条机器指令所需的时间
微周期 (微指令周期):从控制器存储器取出一条微指令并执行相应微操作所需的时间

顺序控制:指明下一务微指令的地址


  • 微程序控制器的基本结构

微地址形成部件:产生初始微地址和后继微地址,以保证微指令的连续执行。

顺序逻辑:根据某些机器标志和时序信息确定下一条微指令的存放地址

标志:根据指令地址码的寻址特征位判断是否要跳过间址周期

CLK:根据中断信号判断是否进入中断周期

CMAR:别名: μPC,微地址寄存器,接收微地址形成部件送来的微地址,为在CM中读取微指令作准备。

地址译码:将地址码转化为存储单元控制信号。

控制存储器CM:用于存放各指令对应的微程序,控制存储器可用只读存储器ROM构成

CMDR:别名: μIR,用于存放从CM中取出的微指令,"它的位数同微指令字长相等。

思考:所有指令的取指周期、间址周期、中断周期所对应的微指令序列都一样,是否可以共享使用?


  • 微程序控制器的工作原理

实际中,取指周期的微指令序列固定从CM的#0开始存放

标志:根据指令地址码的寻址特征位判断是否要跳过间址周期
CLK:根据中断信号判断是否进入中断周期

举例:取数指令 LDA X
取指周期: #0、#1、#2
间址周期: #3、#4 … #7
执行周期: #13、#14、#15
中断周期: #8、#9 … #12

【高频选择题考点】:
通常是公用的,故如果某指令系统中有n条机器指令,则CM中微程序段的个数至少是n+1个(n个执行周期微程序段 + 1个取值周期微程序段)

为什么不加上间址周期微程序和中断周期微程序?
——一些早期的CPU、物联网设备的CPU可以不提供间接寻址和中断功能,因此这类CPU可以不包含间址周期中断周期的微程序段

Tips:物理上,取指周期、执行周期看起来像是两个微程序,但逻辑上应该把它们看作一个整体,因此,“一条指令对应一个微程序“的说法是正确的,所以上面说微程序n个也是对的


5.4.3 微指令设计

  • 微程序控制器的工作原理

微指令的具体格式应该怎么设计?
如何根据微指令发出相应的微命令?

微命令与微操作一一对应,一个微命令对应一根输出线
有的微命令可以并行执行,因此一条微指令可以包含多个微命令


  • 微指令的格式

相容性微命令:可以并行完成的微命令。
互斥性微命令:不允许并行完成的微命令。

  1. 水平型微指令

一条微指令能定义 多个 可并行的微命令

优点:微程序短,执行速度快;
缺点:微指令长,编写微程序较麻烦。

  1. 垂直型微指令

一条微指令只能定义 一个 微命令,由微操作码字段规定具体功能

优点:微指令短、简单、规整,便于编写微程序;
缺点:微程序长,执行速度慢,工作效率低

  1. 混合型微指令

在垂直型的基础上增加一些不太复杂的并行操作

微指令较短,仍便于编写;微程序也不长,执行速度加快。


  • 微指令的编码方式

微指令的编码方式又称为微指令的控制方式,它是指如何对微指令的控制字段(上图左半边部分)进行编码,以形成控制信号。编码的目标是在保证速度的情况下,尽量缩短微指令字长

(1)直接编码(直接控制)方式
在微指令的操作控制字段中,每一位代表一个微操作命令,某位为“1”表示该控制信号有效

优点:简单、直观,执行速度快,操作并行性好。
缺点:微指令字长过长,n个微命令就要求微指令的操作字段有n位,造成控存CM容量极大。

(2)字段直接编码方式
将微指令的控制字段分成若干“段”,每段经译码后发出控制信号

微命令字段分段的原则:
互斥性微命令分在同一段内,相容性微命令分在不同段
每个小段中包含的信息位不能太多,否则将增加译码线路的复杂性和译码时间。
③一般每个小段还要留出一个状态,表示本字段不发出任何微命令。因此,当某字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作

优点:可以缩短微指令字长。
缺点:要通过译码电路后再发出微命令,因此比直接编码方式慢

【例题】某计算机的控制器采用微程序控制方式,微指令中的操作控制字段采用字段直接编码法,共有33个微命令,构成5个互斥类,分别包含7、3、12、5和6个微命令,则操作控制字段至少有多少位?

第1个互斥类有7个微命令,要留出1个状态表示不操作,所以需要表示8种不同的状态,故需要3个二进制位。以此类推,后面4个互斥类各需要表示4、13、6、7种不同的状态,分别对应2、4、3、3个二进制位。
故操作控制字段的总位数为 3 + 2 + 4 + 3 + 3 = 15位

Tips:若采用 直接编码 方式,则控制字段需要33位

(3)字段间接编码方式
一个字段的某些微命令需由另一个字段中的某些微命令来解释,由于不是靠字段直接译码发出的微命令,故称为字段间接编码又称隐式编码

优点:可进一步缩短微指令字长
缺点:削弱了微指令的并行控制能力,故通常作为字段直接编码方式的一种辅助手段。

【常考前两种】


  • 微指令的地址形成方式

【常考1、3】

  1. 微指令的 下地址字段 指出
    —— 微指令格式中设置一个下地址字段,由微指令的下地址字段直接指出后继微指令的地址,这种方式又称为断定方式
  2. 根据机器指令的 操作码 形成
    —— 当机器指令取至指令寄存器后,微指令的地址由操作码经微地址形成部件形成。
  3. 增量计数器法
    —— (CMAR)+1→CMAR
  4. 分支转移
    —— 转移方式:指明判别条件;转移地址:指明转移成功后的去向。
  5. 通过测试网络
    —— 其实就是之前提到的微程序控制器的基本结构的顺序逻辑
  6. 由硬件产生微程序入口地址
    第一条微指令地址 由专门 硬件 产生(用专门的硬件记录取指周期微程序首地址)
    中断周期由 硬件 产生 中断周期微程序首地址(用专门的硬件记录)

  • 例题-断定方式

某计算机采用微程序控制器,共有32条指令,公共的取指令微程序包含2条微指令,各指令对应的微程序平均由4条微指令组成,采用断定法 (下地址字段法)确定下条微指令地址,则微指令中下地址字段的位数至少是多少位?

【解】其实就是问总共需要存储多少条微指令?

32 × 4 + 2 = 130条
32个执行周期程序段 + 1个取指周期程序段
【间址周期和中断周期可以没有】

标注出130个不同的位置至少需要多少个二进制位?
下地址字段的位数至少是8位


5.4.4 微程序控制单元的设计

  • 微程序控制单元的设计

设计步骤:

  1. 分析每个阶段的微操作序列

  2. 写出对应机器指令的微操作命令及节拍安排

    (1)写出每个周期所需要的微操作(参照硬布线)
    (2)补充微程序控制器特有的微操作:

    a.取指周期:
    Ad(CMDR)→CMAR —— 每条微指令结束之后都需要进行
    OP(IR)→微地址形成部件→CMAR —— 取指周期的最后一条微指令完成后,要根据指令操作码确定其执行周期的微程序首地址

    b.执行周期:
    OP(IR)→微地址形成部件→CMAR —— 每条微指令结束之后都需要进行

  3. 确定微指令格式

    根据微操作个数决定采用何种编码方式,以确定微指令的操作控制字段的位数。根据CM中存储的微指令总数,确定微指令的顺序控制字段的位数。最后按操作控制字段位数和顺序控制字段位数就可确定微指令字长

  4. 编写微指令码点

    根据操作控制字段每一位代表的微操作命令,编写每一条微指令的码点

还需考虑 如何读出 这3条微指令(设为a,b,c)以及如何转入下一个机器周期:

取指周期的第一条微指令地址由硬件自动给出
用微指令 a 的下地址表示 b 的地址

Ad(CMDR)→CMAR —— 用当前微指令的下地址表示找到下一条微指令
OP(IR)→微地址形成部件→CMAR —— 根据指令操作码确定其执行周期微指令序列的首地址

修改:

显然,微程序控制器的速度比硬布线控制器更慢

但是王道书中:

都行,不必纠结,只要保证同一个节拍内的操作可以并行即可


  • 微程序设计分类

1、静态微程序设计和动态微程序设计

静态 —— 微程序无需改变,采用 ROM
动态 —— 通过 改变微指令微程序 改变机器指令有利于仿真,采用 EPROM

2、毫微程序设计(就再套一层呗)

毫微程序设计的基本概念:
微程序设计微程序解释机器指令
毫微程序设计毫微程序解释微程序


  • 硬布线与微程序的比较

【高频考点】


5.6.1 指令流水线的基本概念

  • 指令流水线的定义

一条指令的执行过程可以分成多个阶段 (或过程)根据计算机的不同,具体的分法也不同。

取指:根据PC内容访问主存储器,取出一条指令送到IR中。
分析:对指令操作码进行译码,按照给定的寻址方式和地址字段中的内容形成操作数的有效地址EA,并从有效地址EA中取出操作数。
执行:根据操作码字段,完成指令规定的功能,即把运算结果写到通用寄存器或主存中。

特点: 每个阶段用到的硬件不一样。

设取指、分析、执行3个阶段的时间都相等,用t表示 ,按以下几种执行方式分析n条指令的执行时间:

  1. 顺序执行方式

总耗时T = n×3t = 3nt

传统冯·诺依曼机采用顺序执行方式,又称串行执行方式。
优点:控制简单,硬件代价小。
缺点:执行指令的速度较慢,在任何时刻,处理机中只有一条指令在执行,各功能部件的利用率很低。

2、一次重叠执行方式

总耗时T = 3t + (n-1) × 2t =(1+2n)t

优点:程序的执行时间缩短了1/3,各功能部件的利用率明显提高。 缺点:需要付出硬件上较大开销的代价,控制过程也比顺序执行复杂了。

  1. 二次重叠执行方式(理想情况下 )

总耗时T = 3t + (n-1) × t = (2+n)t

与顺序执行方式相比,指令的执行时间缩短近2/3。这是一种理想的指令执行方式,在正常情况下,处理机中同时有3条指令在执行。

注:也可以把每条指令的执行过程分成4个或5个阶段,分成5个阶段是比较常见的做法。


  • 流水线的表示方法

指令执行过程图

主要用于分析指令执行过程以及影响流水线的因素(见下一个视频)

时空图

主要用于分析流水线的性能

空间:不同的阶段所对应的不同的硬件资源


  • 流水线的性能指标

吞吐率 —— 吞吐率是指在单位时间内流水线所完成的任务数量,或是输出结果的数量

设任务数为n;处理完成n个任务所用的时间为TkT_k
则计算流水线吞吐率 (TP)的最基本的公式为 TP=nTkTP=\frac{n}{T_k}

理想情况下,流水线的时空图如下:
【理想情况:各阶段花费时间相同;每个阶段结束后能立即进入下一阶段。】

一条指令的执行分为k个阶段,每个阶段耗时Δt,一般取Δt = 一个时钟周期

Tk = (k+n-1)Δt; TP=n(k+n1)ΔtTP=\frac{n}{(k+n-1)Δt}

当连续输入的任务当连续输入的任务n-o0时最高效率为Emax-1。时,得最大吞吐率为TPmax=1ΔtTP_{max}=\frac{1}{Δt}

图中装入时间:使得各个硬件部件投入工作的时间
排空时间:使得各个硬件部件退出工作的时间

加速比 —— 完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。

设T0表示不使用流水线时的执行时间,即顺序执行所用的时间;Tk表示使用流水线时的执行时间
则计算流水线加速比 (S) 的基本公式为 S=T0TkS=\frac{T_0}{T_k}

那么对于上面的图 S=knΔt(k+n1)Δt=knk+n1S=\frac{knΔt}{(k+n-1)Δt} = \frac{kn}{k+n-1}

当连续输入的任务n→∞时,得最大吞吐率为Smax=kS_{max}=k

效率 —— 流水线的设备利用率称为流水线的效率。

在时空图上,流水线的效率定义为完成n个任务占用的时空区有效面积n个任务所用的时间与k个流水段所围成的时空区总面积之比。

则流水线效率 (E) 的一般公式为
E=n 个任务占用 k 时空区有效面积 n 个任务所用的时间与 k 个流水段所围成的时空区总面积 =T0kTkE=\frac{n \text { 个任务占用 } k \text { 时空区有效面积 }}{n \text { 个任务所用的时间与 } k \text { 个流水段所围成的时空区总面积 }}=\frac{T_{0}}{k T_{k}}

由图可知,空闲区域(左上角 + 右下角)不变,当连续输入的任务n→∞时,最高效率为Emax=1。


5.6.2 指令流水线的影响因素和分类

  • 机器周期设置

IF:instruction fetch

图中的经典五段式流水线是MIPS架构提出的,MIPS是第一个RISC;在MIPS架构下,虽然有的指令不需要经过某个机器周期的操作,但是也需要经过这个周期

各部件实际耗时可能是:100ns、80ns、70ns、50ns、50ns
为方便流水线的设计,将每个阶段的耗时取成一样,以最长耗时为准即此处应将机器周期设置为100ns。

因此流水线每一个功能段部件后面都要有一个缓冲寄存器(图中蓝色框内部分),或称为锁存器其作用是保存本流水段的执行结果,提供给下一流水段使用

IF和M阶段可以看到cache拆开变成了两个,这样可以方便并行

M阶段,可能写回,或者不写回(修改cache内容)

ID阶段,译码的同时要把操作数从通用寄存器中取出,放到锁存器A和B中,(在RISC中,操作数一定来自通用寄存器,如果来自主存,需要先从主存放到通用寄存器中),如果是指令是立即寻址,就直接将结果放到锁存器Imm中


  • 影响流水线的因素
  1. 结构相关(资源冲突)(结构冒险)

由于多条指令在同一时刻争用同一资源而形成的冲突称为结构相关

解决办法:
⑴后一相关指令暂停一周期
⑵资源重复配置: 数据存储器+指令存储器;如下图

  1. 数据相关(数据冲突) (数据冒险)

数据相关指在一个程序中,存在必须等前一条指令执行完才能执行后一条指令的情况,则这两条指令即为数据相关。

解决办法:
(1)把遇到数据相关的指令及 其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行。可分为硬件阻塞(stall)和软件插 入“NOP”两种方法。

(2)数据旁路技术。 (转发机制)

(3)编译优化:通过编译器调 整指令顺序来解决数据相关。

  1. 控制相关(控制冲突)(控制冒险)

当流水线遇到转移指令和其他改变PC值的指令而造成断流时,会引起控制相关。

解决办法:
(1)转移指令分支预测。简单预测 (永远猜ture或false) 、动态预测 (根据历史情况动态调整)
(2)预取转移成功和不成功两个控制流方向上的目标指令(需要增加硬件–硬件代价)
(3)加快和提前形成条件码(类似之前的并行进位的并行加法器,把信息提前往后放)
(4)提高转移方向的猜准率(优化(1))


  • 流水线的分类
  1. 部件功能级、处理机级和处理机间级流水线

根据流水线使用的级别的不同,流水线可分为部件功能级流水线、处理机级流水线和处理机间流水线。

部件功能级流水就是将复杂的算术逻辑运算组成流水线工作方式。例如,可将浮点加法操作分成求阶 差、对阶、尾数相加以及结果规格化等4个子过程。

处理机级流水是把一条指令解释过程分成多个子过程,如前面提到的取指、译码、执行、访存及写回5个子过程。

处理机间流水是一种宏流水,其中每一个处理机完成某一专门任务,各个处理机所得到的结果需存放 在与下一个处理机所共享的存储器中。

  1. 单功能流水线和多功能流水线

流水线可以完成的功能,流水线可分为单功能流水线和多功能流水线。

单功能流水线指只能实现一种固定的专门功能的流水线;

多功能流水线指通过各段间的不同连接方式可以同时或不同时地实现多种功能的流水线。

  1. 动态流水线和静态流水线

同一时间内各段之间的连接方式,流水线可分为静态流水线和动态流水线。

静态流水线指在同一时间内,流水线的各段只能按同一种功能的连接方式工作。 (例如ALU运行加法时不能再执行减法)

动态流水线指在同一时间内,当某些段正在实现某种运算时,另一些段却正在进行另一种运算。这样对提高流水线的效率很有好处,但会使流水线控制变得很复杂。 (例如ALU实现加减法并行)

  1. 线性流水线和非线性流水线

按流水线的各个功能段之间是否有反馈信号,流水线可分为线性流水线与非线性流水线。

线性流水线中,从输入到输出,每个功能段只允许经过一次,不存在反馈回路。

非线性流水线存在反馈回路,从输入到输出过程中,某些功能段将数次通过流水线,这种流水线适合进行线性递归的运算。


  • 流水线多发技术
  1. 超标量技术

每个时钟周期内可 并发多条独立指令
要配置多个功能部件
不能调整 指令的 执行顺序
通过编译优化技术,把可并行执行的指令搭配起来

  1. 超流水技术

一个时钟周期再分段 ( 3 段)
在一个时钟周期内 一个功能部件使用多次( 3 次)
不能调整 指令的 执行顺序
靠编译程序解决优化问题

流水线速度是原来速度的 3 倍

  1. 超长指令字

编译程序挖掘 出指令间 潜在并行性
多条并行操作 的指令组合成 一条
具有 多个操作码字段超长指令字(可达几百位)
采用 多个处理部件


5.6.3 五段式指令流水线

常考大题,难度大

  • 五段式指令流水线

①IF取指→②ID译码&取数→③EX 执行→④M访存→⑤WB写回寄存器

考试中常见的五类指令:
运算类指令、LOAD指令、STORE指令、条件转移指令、无条件转移指令


  • 运算类指令的执行过程

注:
Rs:指源操作数 (source)
Rd:指目的操作数(destination)

运算指令举例 指令的汇编格式 功能
加法指令(两个寄存器相加) ADD Rs, Rd (Rs)+(Rd)→Rd
加法指令(寄存器与立即数相加) ADD #996, Rd 996+(Rd)→Rd
算数左移指令 SHL Rd (Rs)+(Rd)→Rd

运算类指令:
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:取出操作数至ID段锁存器
EX:运算,将结果存入EX段锁存器
M:空段
WB:将运算结果写回指定寄存器


  • LOAD指令的执行过程

LOAD Rd, 996(Rs) —— (996 + (Rs)) → Rd
或者简写为:
LOAD Rd, mem —— (mem) → Rd

LOAD指令:
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm
EX:运算,得到有效地址
M:从数据Cache中取数并放入锁存器(未命中才访存,但是因为访存耗时,为了保证流水线流畅工作,大概率能在数据Cache中找到)
WB:将取出的数写回寄存器

通常,RISC处理器只有“取数LOAD”和“存数STORE”指令才能访问主存


  • STORE指令的执行过程

STORE Rd, 996(Rs) —— Rd → (996 + (Rs))
或者简写为:
STORE Rd, mem —— Rd → (mem)

STORE指令:
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:将基址寄存器的值放到锁存器A,将偏移量的值放到Imm,将要存的数放到B
EX:运算,得到有效地址。并将锁存器B的内容放到锁存器 store。
M:写入数据Cache
WB:空段


  • 条件转移指令的执行过程

beq Rs, Rt, #偏移量 —— 若(Rs)==(Rt),则(PC)+指令字长+(偏移量×指令字长)→PC; 否则(PC)+指令字长→PC
bne Rs, Rt, #偏移量 —— 若(Rs)!=(Rt),则(PC)+指令字长+(偏移量×指令字长)→PC; 否则(PC)+指令字长→PC

注:通常在IF段结束止之后PC就会自动+“1”

条件转移指令:(转移类指令常采用相对寻址)
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:进行比较的两个数放入锁存器A、B;偏移量放入Imm
EX:运算,比较两个数
M:将目标PC值写PC(图中没画全)
WB:空段

为什么写回PC放在M段?
首先WB的写回,是写回通用寄存器,但是PC不是通用寄存器;
很多教材把写回PC的功能段称为“WrPc段”其耗时比M段更短,可安排在M段时间内完成


  • 无条件转移指令的执行过程

jum #偏移量 —— (PC)+指令字长+(偏移量×指令字长)→PC

无条件转移指令:(转移类指令常采用相对寻址)
IF:根据PC从指令Cache取指令至IF段的锁存器
ID:偏移量放入Imm
EX:将目标PC值写回PC(图中没画全)
M:空段
WB:空段

为什么写回PC放在EX段?
“WrPC段”耗时比EX段更短,可安排在EX段时间内完成。WrPc段越早完成就越能避免控制冲突。当然,也有的地方会在WB段时间内才修改PC的值


  • 例题

假设某指令流水线采用“按序发射,按序完成”方式,没有采用转发技术处理数据相关,并且同一寄存器的读和写操作不能在同一个时钟周期内进行。若高级语言程序中某赋值语句为x = a + b,x、a和b均为int型变量,它们的存储单元地址分别表示为[x]、[a]和[b]。该语句对应的指令序列及其在指令流中的执行过程如下图所示。

1
2
3
4
LOAD R1, [a]
LOAD R2, [b]
ADD R1, R2
STORE R2, [x]

则这4条指令执行过程中13的ID段和14的IF段被阻塞的原因各是什么?

【解】:
I3与I1和I2存在数据相关;
I4的IF段必须在I3进入ID段后才能开始,否则会覆盖IF段锁存器的内容


5.7.1 多处理器系统的基本概念

Tips:大纲只要求掌握“基本概念”,意味着一定只考选择题

  • 总览

多处理器的基本概念:

  • SISD、SIMD、MISD、MIMD向量处理器的基本概念

    • SISD(单指令流单数据流)

      • 特性:
        各指令序列只能并发、不能并行,每条指令处理一两个数据
        不是 数据级并行技术
      • 硬件组成:
        一个处理器 + 一个主存储器
        若采用指令流水线,需设置多个功能部件,采用多模块交叉存储器
    • SIMD(单指令多数据流)

      • 特性:
        各指令序列只能并发、不能并行,但每条指令可同时处理很多个具有相同特征的数据
        是一种 数据级并行技术
      • 硬件组成:
        一个指令控制部件 (CU) + 多个处理单元/执行单元 (如ALU) + 多个局部存储器 + 一个主存储器
        一每个执行单元有各自的寄存器组、局部存储器、地址寄存器
        不同执行单元执行同一条指令,处理不同的数据
    • MISD(多指令流多数据流)

      多条指令并行执行,处理同一个数据。现实中不存在这种计算机

    • MIMD(多指令流多数据流)

      • 特性:
        各指令序列并行执行,分别处理多个不同的数据
        是一种 线程级并行、甚至是线程级以上并行技术
      • 进一步分类
        • 多处理器系统 —— 共享内存多处理器(相同的东西)
          • 特性:
            各处理器之间,可以通过LOAD/STORE指令,访问同一个主存储器,可通过主存相互传送数据
          • 硬件组成
            一台计算机内,包含多个处理器 + 一个主存储器
            多个处理器共享单一的物理地址空间
        • 多计算机系统
          • 特性:
            各计算机之间,不能通过LOAD/STORE指令直接访问特性 一对方的存储器,只能通过“消息传递”相互传送数据
          • 硬件组成:
            由多台计算机组成,因此拥有多个处理器 + 多个主存储器
            每台计算机拥有各自的私有存储器,物理地址空间相互独立
    • 向量处理机 (SIMD思想的进阶应用)

      • 特性:
        一条指令的处理对象是“向量“
        擅长对向量型数据并行计算、浮点数运算,常被用于超级计算机中,处理科学研究中巨大运算量
      • 硬件组成:
        多个处理单元,多组“向量寄存器
        主存储器应采用“多个端口同时读取”的交叉多模块存储器
        主存储器大小限定了机器的解题规模,因此要有大容量的、集中式的主存储器
  • 共享内存多处理器 (Shared MemorymultiProcessor,SMP) 的基本概念
    —— 多处理器系统(相同的东西)
    —— 多核处理器(一个东西,命名角度不同而已)

    • 多处理器系统(简称)
    • 多个处器共享一个主存储器
    • 多个处理器共享单一的地址空间,都可以通过LOAD、STORE指令访问共享的主存储器
    • 干扰项:与 多计算机系统 作区别
  • 多核处理器 (multi-core) 的基本概念
    —— 共享内存多处理器(一个东西,命名角度不同而已)

    • 一个CPU芯片中包含多个处理器,即多个核 (core),因此通常也称为 片级多处理器(Chip-LevelMultiProcessing,CMP)。意思是:一块芯片上集成了多个处理器
    • 所有核共享一个LLC(Last-Level Cache),并共享主存储器

  • SISD
    单指令流单数据流

eg:计组课程一直在学的就是SISD,每条指令可以处理一两个数据


  • SIMD
    单指令多指令数据流

Key:对结构类似的大量数据进行相同处理。一条指令处理很多个数据

eg1:某些显卡常采用SIMD,图像处理时,常对每个像素点进行完全一样的渲染(比如加个粉红色滤镜)
eg2:可用于优化for循环中对数组元素的重复处理


  • MIMD——共享存储多处理器系统

eg: Intel i5、i7处理器


  • MIMD——多计算机系统

eg:多台计算机组成的“分布式计算系统”


  • 向量处理器

eg:向量处理机的LOAD指令,可以将一个向量取到向量寄存器中;加法指令,可以实现两个向量相加应用于:向量计算、大量浮点数计算,空气动力学、核物理学、巨型矩阵计算问题很多超级计算机如中国的“银河”就是向量处理器


5.7.2 硬件多线程的基本概念

Tips:大纲只要求掌握“基本概念”,意味着一定只考选择题

  • 细粒度多线程
  • 粗粒度多线程
  • 同时多线程(SMT)
  • 三种硬件多线程


  • 一个不太严谨的示意图

不支持硬件多线程的处理器:
切换线程要保存环境,增加耗费

支持硬件多线程的处理器:


第六章 总线

6.1.1 总线概述

  • 总线简图

每个总线可能由很多根信号线组成


  • 总线的物理实现

如上,4根信号线组成“一根”总线,所有硬件部件都可以通过这根总线传递数据
可并行发送4bit数据。同一时刻只能有一个部件发送数据,但是可有多个部件接受数据


  • 总线的定义

总线是一组能为多个部件 分时 共享 的公共信息传送线路

共享是指总线上可以挂接多个部件,各个部件之间互相交换的信息都可以通过这组线路分时共享。
分时是指同一时刻只允许有一个部件向总线发送信息,如果系统中有多个部件,则它们只能分时地向总线发送信息。

为什么要用总线?
早期计算机外部设备时大多采用分散连接方式(就是专门的线路),不易实现随时增减外部设备。
为了更好地解决I/O设备和主机之间连接的灵活性问题,计算机的结构从分散连接发展为总线连接。


  • 总线的特性

1、机械特性:尺寸、形状、管脚数、排列顺序

2、电气特性:传输方向和有效的电平范围

3、功能特性:每根传输线的功能(地址、数据、控制)

4、时间特性:信号的时序关系


  • 总线分类

按数据传输格式:

  • 串行总线
  • 并行总线

按总线功能(连接的部件):

  • 片内总线
  • 系统总线
  • 通信总线

按时序控制方式:

  • 同步总线
  • 异步总线

  • 串行总线与并行总线

串行总线:

优点:只需要一条传输线,成本低廉,广泛应用于长距离传输;应用于计算机内部时,可以节省布线空间。
缺点:在数据发送和接收的时候要进行拆卸和装配,要考虑串行-并行转换的问题。

并行总线:

优点:总线的逻辑时序比较简单,电路实现起来比较容易。
缺点:信号线数量多,占用更多的布线空间;远距离传输成本高昂;由于工作频率较高时的信号线之间会产生严重干扰,对每条线等长的要求也越高,所以无法持续提升工作频率。【所以不一定并行总线的传输速度就比串行总线的快】

总线带宽 = 总线工作频率 × 总线宽度(bit/s)【6.1.2 总线的性能指标】
1、工作频率相同时,串行总线传输速度比并行总线慢。
2、并行总线的工作频率无法持续提高,而串行总线可以通过不断提高工作频率来提高传输速度,最终超过并行总线。


  • 总线的分类(按总线功能)

数据通路表示的是数据流经的路径
数据总线是承载的媒介

  1. 片内总线

片内总线是芯片内部的总线。
它是CPU芯片内部寄存器与寄存器之间、寄存器与ALU之间的公共连接线

  1. 系统总线

系统总线是计算机系统内各功能部件 (CPU、主存、I/O接口)之间相互连接的总线。
按系统总线传输信息内容的不同,又可分为3类:数据总线地址总线控制总线
1)数据总线用来传输各功能部件之间的数据信息,它是双向传输总线,其位数与机器字长、存储字长有关
2)地址总线用来指出数据总线上的源数据或目的数据所在的主存单元或I/O端口的地址它是单向传输总线,地址总线的位数与主存地址空间的大小有关
3)控制总线传输的是控制信息,包括CPU送出的控制命令主存(或外设) 返回CPU的反馈信号

  1. 通信总线

通信总线是用于计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间信息传送的总线,通信总线也称为外部总线。


  • 系统总线

数据总线DB:传输各功能部件之间的数据信息,包括指令和操作数;位数(信号线根数)与机器字长、存储字长有关;双向。

地址总线AB:传输地址信息,包括主存单元或I/O端口的地址;位数(根数)与主存地址空间大小及设备数量有关;单向。

控制总线CB:传输控制信息一根控制线传输一个信号
有出: CPU送出的控制命令
有入: 主存(或外设) 返回CPU的反馈信号。


  • 系统总线的结构

  • 单总线结构

注:单总线并不是指只有一根信号线,系统总线按传送信息的不同可以细分为地址总线、数据总线和控制总线。

结构:CPU、主存、I/O设备 (通过I/O接口) 都连接在一组总线上,允许I/O设备之间、I/O设备和CPU之间或I/O设备与主存之间直接交换信息。
优点:结构简单,成本低,易于接入新的设备。
缺点:带宽低、负载重,多个部件只能争用唯一的总线,且不支持并发并行传送操作。

  • 双总线结构

主存总线:支持突发(猝发)传送:送出一个地址,收到多个地址连续的数据
通道是具有特殊功能的处理器能对I/O设备进行统一管理。通道程序放在主存中。

结构:双总线结构有两条总线,一条是主存总线,用于CPU、主存和通道之间进行数据传送;另一条是I/O总线,用于多个外部设备与通道之间进行数据传送。
优点:将较低速的I/O设备从单总线上分离出来,实现存储器总线和I/O总线分离。
缺点:需要增加通道等硬件设备。

  • 三总线结构

DMA:Direct Memory Access,直接内存访问

结构:三总线结构是在计算机系统各部件之间采用3条各自独立的总线来构成信息通路,这3条总线分别为主存总线I/O总线和直接内存访问DMA总线
优点:提高了I/O设备的性能,使其更快地响应命令,提高系统吞吐量。
缺点:系统工作效率较低。


  • 四总线结构简介

首先不考,但是现代计算机一般采用这种

  1. 桥接器:用于连接不同的总线,具有数据缓冲、转换和控制功能。
  2. 靠近CPU的总线速度较快
  3. 每级总线的设计遵循总线标准(见本章第4节)。

拓展:搜索“北桥芯片“、”南桥芯片”(桥接器)


6.1.2 总线的性能指标

  1. 总线的传输周期(总线周期)
  2. 总线时钟周期
  3. 总线的工作频率
  4. 总线的时钟频率
  5. 总线宽度
  6. 总线带宽
  7. 总线复用
  8. 信号线数
  • 总线的性能指标
  1. 总线的传输周期(总线周期)

    一次总线操作所需的时间(包括申请阶段(仲裁)、寻址阶段、传输阶段和结束阶段),通常由若干个总线时钟周期构成。

  2. 总线时钟周期

    机器的时钟周期。计算机有一个统一的时钟,以控制整个计算机的各个部件,总线也要受此时钟的控制。

    现在的计算机中总线时钟周期也有可能由桥接器提供

总线周期与总线时钟周期的关系比较魔幻
大多数情况下,一个总线周期包含多个总线时钟周期
有的时候,一个总线周期就是一个总线时钟周期
有的时候,一个总线时钟周期可包含多个总线周期

  1. 总线的工作频率

    总线上各种操作的频率,为总线周期的倒数。 若总线周期=N个时钟周期,则总线的工作频率=时钟频率/N。 实际上指一秒内传送几次数据

  2. 总线的时钟频率

    即机器的时钟频率,为时钟周期的倒数。 若时钟周期为T,则时钟频率为1/T。 实际上指一秒内有多少个时钟周期

  3. 总线宽度

    又称为总线位宽,它是总线上同时能够传输的数据位数, 通常是指数据总线的根数,如32根称为32位(bit)总线。

  4. 总线带宽

    可理解为总线的数据传输率,即单位时间内总线上可传输数据的位数,通常用每秒钟传送信息的字节数来衡量,单位可用字节/秒(B/s)表示。

    总线带宽 = 总线工作频率 × 总线宽度(bit/s)= 总线工作频率 × (总线宽度/8)
    = 总线宽度总线周期bit/s\frac{总线宽度}{总线周期}(bit/s) = 总线宽度/8总线周期B/s\frac{总线宽度/8}{总线周期}(B/s)

    注:总线带宽是指总线本身所能达到的最高传输速率。在计算实际的有效数据传输率时,要用实际传输的数据量除以耗时。

  5. 总线复用

    总线复用是指一种信号线在不同的时间传输不同的信息。 可以使用较少的线传输更多的信息,从而节省了空间和成本。

  6. 信号线数

    地址总线、数据总线和控制总线3种总线数的总和称为信号线数。


  • 总线的性能指标-带宽

【例题】某同步总线采用数据线和地址线复用方式,其中地址/数据线有32根,总线时钟频率为66MHz,每个时钟周期传送两次数据(上升沿和下降沿各传送一次数据)。
1)该总线的最大数据传输率(总线带宽)是多少?
2)若该总线支持突发(猝发)传输方式,传输一个地址占用一个时钟周期,则一次“主存写”总线事务传输128位数据所需要的时间至少是多少?

【解】
1)每个时钟周期传送两次数据 → 总线工作频率是时钟频率的两倍
总线工作频率 = 2 × 66MHz =132MHZ
总线宽度 = 32bit = 4B
总线带宽 = 总线工作频率 × 总线宽度 = 132 × 4 MB/s = 528 MB/s

2)2突发(猝发)传输方式:一次总线事务中,主设备只需给出一个首地址,从设备就能从首地址开始的若干连续单元读出或写入多个数据。
发送首地址占用1个时钟周期,128位数据需传输4次,占用2个时钟周期
一个时钟周期 = 1/66MHz ≈ 15ns
总耗时 =(1+2) × 15ns = 45ns


6.2 总线仲裁 (408不考,简单了解即可)

  • 总线仲裁的基本方式

同一时刻只能有一个设备控制总线传输操作,可以有一个或多个设备从总线接收数据。

将总线上所连接的各类设备按其对总线有无控制功能分为:
主设备:获得总线控制权的设备。
从设备:被主设备访问的设备,只能响应从主设备发来的各种总线命令

为什么要仲裁?
总线作为一种共享设备,不可避免地会出现同一时刻有多个主设备竞争总线控制权的问题。

总线仲裁的定义:
多个主设备同时竞争主线控制权时,以某种方式选择一个主设备优先获得总线控制权称为总线仲裁

总线仲裁分类

  • 集中仲裁方式
    • 链式查询方式
    • 计数器定时查询方式
    • 独立请求方式
  • 分布仲裁方式

  • 集中仲裁方式

工作流程:

  1. 主设备发出请求信号;
  2. 若多个主设备同时要使用总线,则由总线控制器的判优、仲裁逻辑按一定的优先等级顺序确定哪个主设备能使用总线;
  3. 获得总线使用权的主设备开始传送数据

链式查询方式

总线忙”信号的建立者是获得总线控制权的设备
优先级:离总线控制器越的部件,其优先级越高;离总线控制器越的部件,其优先级越低

优点:链式查询方式优先级固定。
只需很少几根控制线就能按一定优先次序实现总线控制,结构简单,扩充容易。
缺点:对硬件电路的故障敏感,并且优先级不能改变
当优先级高的部件频繁请求使用总线时,会使优先级较低的部件长期不能使用总线。

计数器定时查询方式

结构特点:用一个计数器控制总线使用权,相对链式查询方式多了一组设备地址线,少了一根总线响应线BG;它仍共用一根总线请求线。

当总线控制器收到总线请求信号,判断总线空闲时,计数器开始计数,计数值通过设备地址线发向各个部件。

当地址线上的计数值与请求使用总线设备的地址一致时,该设备获得总线控制权。同时,中止计数器的计数及查询。

优点:
1、计数初始值可以改变优先次序
计数每次从“0”开始,设备的优先级就按顺序排列,固定不变;
计数从上一次的终点开始,此时设备使用总线的优先级相等;
计数器的初值还可以由程序设置
2、对电路的故障没有链式敏感
缺点:
1、增加了控制线数
若设备有n个,则需log2n+2\left\lceil\log _{2} n\right\rceil+2条控制线
2、控制相对比链式查询相对复杂

独立请求方式

结构特点:每一个设备均有一对总线请求线BRi和总线允许线BGi。

当总线上的部件需要使用总线时,经各自的总线请求线发送总线请求信号,在总线控制器中排队。

当总线控制器按一定的优先次序决定批准某个部件的请求时, 则给该部件发送总线响应信号。

优点:
1、响应速度快,总线允许信号 BG直接从控制器发送到有关设备, 不必在设备间传递或者查询。
2、对优先次序的控制相当灵活。
缺点:
1、控制线数量多
若设备有n个,则需要2n+1条控制线。 其中+1为BS线,其用处为:用于设备向总线 控制部件反馈已经使用完毕总线。
2、总线的控制逻辑更加复杂


  • 集中仲裁方式小节


  • 分布仲裁方式

特点:不需要中央仲裁器,每个潜在的主模块都有自己的仲裁器和仲裁号,多个仲裁器竞争使用总线。

当设备有总线请求时,它们就把各自唯一的仲裁号发送到共享的仲裁总线上;
每个仲裁器将从仲裁总线上得到的仲裁号与自己的仲裁号进行比较;
如果仲裁总线上的号优先级高,则它的总线请求不予响应,并撤销它的仲裁号;
最后,获胜者的仲裁号保留在仲裁总线上。


6.3 总线操作和定时

  • 总线周期的四个阶段

1)申请分配阶段:由需要使用总线的主模块(或主设备)提出申请,经总线仲裁机构决定将下一传输周期的总线使用权授予某一申请者。也可将此阶段细分为传输请求总线仲裁两个阶段。

2)寻址阶段:获得使用权的主模块通过总线发出本次要访问的从模块的地址及有关命令,启动参与本次 传输的从模块。

3)传输阶段:主模块和从模块进行数据交换,可单向或双向进行数据传送。

4)结束阶段:主模块的有关信息均从系统总线上撤除,让出总线使用权。

总线定时是指总线在双方交换数据的过程中需要时间上配合关系的控制,这种控制称为总线定时,它的实质是一种协议或规则

  • 同步通信(同步定时方式) —— 由 统一时钟 控制数据传送
  • 异步通信(异步定时方式) —— 采用 应答方式,没有公共时钟标准
  • 半同步通信 —— 同步、异步结合
  • 分离式通信 —— 充分 挖掘 系统 总线每瞬间 的 潜力

  • 同步定时方式-读命令

系统采用一个统一的时钟信号来协调发送和接收双方的传送定时关系。

假设:假设CPU作为主设备,某个输入设备作为从设备

1)CPU在T1时刻的上升沿给出地址信息

2)在T2的上升沿给出读命令(低电平有效),与地址信息相符合的输入设备按命令进行一系列的内部操作, 且必须在T3的上升沿来之前将CPU所需的数据送到数据总线上。

3)CPU在T3时钟周期内,将数据线上的信息传送到其内部寄存器中。

4)CPU在T4的上升沿撤销读命令,输入设备不再向数据总线上传送数据,撤销它对数据总线的驱动。

如果从设备跟不上节奏,在T3给不出数据,就寄了~

注:
上升沿:数字电平从0变为1的一瞬间
下降沿:数字电平从1变为0的一瞬间


  • 同步定时方式

同步定时方式是指系统采用一个统一的时钟信号来协调发送和接收双方的传送定时关系。

时钟产生相等的时间间隔,每个间隔构成一个总线周期。

在一个总线周期中,发送方和接收方可进行一次数据传送。

因为采用统一的时钟,每个部件或设备发送或接收信息都在固定的总线传送周期中,一个总线的传送周期结束,下一个总线传送周期开始。

优点:传送速度快,具有较高的传输速率;总线控制逻辑简单。

缺点:主从设备属于强制性同步;不能及时进行数据通信的有效性检验,可靠性较差。

同步通信适用于总线长度较短及总线所接部件的存取时间比较接近的系统。


  • 异步定时方式

在异步定时方式中,没有统一的时钟,也没有固定的时间间隔,完全依靠传送双方相互制约的“握手”信号来实现定时控制。

主设备提出交换信息的“请求”信号,经接口传送到从设备;从设备接到主设备的请求后,通过接口向主设备发出“回答”信号。

根据“请求”和“回答”信号的撤销是否互锁,分为以下3种类型。
1)不互锁方式
2)半互锁方式
3)全互锁方式

优点:
总线周期长度可变,能保证两个工作速度相差很大的部件或设备之间可靠地进行信息交换,自动适应时间的配合。
缺点:
比同步控制方式稍复杂一些,速度比同步定时方式慢。

1)不互锁方式 —— 速度最快,可靠性最差
主设备发出“请求”信号后,不必等到接到从设备的“回答”信 号,而是经过一段时间,便撤销“请求”信号。
而从设备在接到“请求”信号后,发出“回答”信号,并经过一段时间,自动撤销“回答”信号。双方不存在互锁关系。

2)半互锁方式
主设备发出“请求”信号后,必须待接到从设备的“回答”信号 后,才撤销“请求”信号,有互锁的关系。 而从设备在接到“请求”信号后,发出“回答”信号,但不必等待获知主设备的“请求”信号已经撤销,而是隔一段时间后自动撤销“回答”信号,不存在互锁关系。

3)全互锁方式 —— 最可靠,速度最慢
主设备发出“请求”信号后,必须待从设备“回答”后,才撤销 “请求”信号; 从设备发出“回答”信号,必须待获知主设备“请求”信号已撤 销后,再撤销其“回答”信号。双方存在互锁关系。


  • 半同步通信

同步 :
发送方 用系统 时钟前沿 发信号
接收方 用系统 时钟后沿 判断、识别

异步:
允许不同速度的模块和谐工作

半同步通信:统一时钟的基础上,增加一个“等待”响应信号WAIT\overline{WAIT}


  • 分离式通信

上述三种通信的共同点:

总线传输周期(以输入数据为例)

• 主模块发地址 、命令 ———— 使用总线

• 从模块准备数据 ———— 不使用总线,但是占用总线,导致总线空闲

• 从模块向主模块发数据 ———— 使用总线

分离式通信的一个总线传输周期

  • 子周期1 主模块申请占用总线,使用完后放弃总线的使用权
  • 子周期2 从模块申请占用总线,将各种信息送至总线上

特点:

  1. 各模块均有权申请占用总线
  2. 采用同步方式通信,不等对方回答
  3. 各模块准备数据时,不占用总线
  4. 总线利用率提高

6.4 总线标准 (408不考,简单了解即可)

  • 来,商量一个总线标准?

并行?串行?
—— 并行

几根数据线?几根地址线?
—— 32根数据线。数据线、地址线复用

用哪种总线仲裁方式?
—— 链式查询方式

用哪种总线定时方式?
—— 同步定时方式,每四个时钟完成一次数据传输。

总线工作频率?
—— 985MHz

电气特性?
—— 每根线传送1bit数据,0~0.5V为低电平,4.8~5.2V为高电平。低电平表示1,高电平表示0

……

按照一起制定的标准,各自研发硬件设备(类比软件里的"接口”)


  • 总线标准的基本概念

总线标准是国际上公布或推荐的互连各个模块的标准,它是把各种不同的模块组成计算机系统时必须遵守的规范。按总线标准设计的接口可视为通用接口,在接口的两端,任何一方只需根据总线标准的要求完成自身方面的功能要求,而无须了解对方接口的要求。

根据总线在计算机系统中的位置,可分为:
系统总线:通常与CPU直接相连,用于连接CPU与北桥芯片、或CPU与主存等
局部总线:没有直接与CPU连接,通常是连接高速的北桥芯片,用于连接了很多重要的硬件部件(如显卡、声卡等)
设备总线、通信总线:通常由南桥芯片控制,用于连接计算机与计算机,或连接计算机与外部I/O设备


  • 系统总线标准

【ISA、EISA是一种并行总线】。

最早的PC总线是IBM公司1981年在PC/XT电脑采用的系统总线,它基于8bit的8088 处理器,被称为PC总线或者PC/XT总线。

1984年,IBM 推出基于16-bit Intel 80286处理器的PC/AT 电脑,系统总线也相应地扩展为16bit,并被称呼为PC/AT 总线。而为了开发与IBM PC 兼容的外围设备,行业内便逐渐确立了以IBM PC总线规范为基础的ISA(工业标准架构:Industry Standard Architecture )总线。

ISA总线最大传输速率仅为8MB/s ,数据传送需要CPU或DMA接口来管理,传输速率过低、CPU占用率高、占用硬件中断资源等,很快使ISA总线在飞速发展的计算机技术中成为瓶颈。不支持总线仲裁

因此在1988年,康柏、惠普等9厂商协同把ISA 扩展到32-bit,这就是著名的EISA (Extended ISA,扩展ISA)总线。EISA 总线的工作频率仍旧仅有8MHz ,并且与8/16bit 的ISA总线完全兼容,带宽提高了一倍,达到了32MB/s。从CPU中分离出了总线控制权,支持多个总线主控器和突发传送。可惜的是,EISA 仍旧由于速度有限,并且成本过高,在还没成为标准总线之前,在20世纪90年代初的时候,就给PCI 总线给取代了。

后来Intel提出来FBS(前端总线),再进一步提出了QPI


  • 局部总线标准

CPU的主频提高,数据宽度增大及处理能力的增强使得系统的性能迅速提高。虽然系统总线在不断发展,仍然跟不上软件和CPU的发展速度,仍然不能充分利用CPU的强大处理能力。大部分时间内,CPU都处于等待状态,特别是在日益强大的CPU处理能力和存储器容量的支持和激励下,操作系统和应用程度变得越来越复杂,而显示卡和硬盘控制器因位于8位或16位系统I/O总线上,相对极高的CPU的速度而言,传输数据的速度低的多,从而影响了系统的整体工作效率。

因此,为提高系统的整体性能,解决总线传输问题的一个办法是将外设直接挂在CPU局部总线上并以CPU速度运行,将外设挂到CPU局部总线能够极大地提高外设的运行速度,而成本只有轻微的上浮,这个性能/价格比为局部总线创造了一个巨大的市场潜力。

1991,视频电子标准协会针对视频显示的高数据传输率要求而推出了VESA总线,又叫做视频局部总线(VESA local bus),简称VL-BUS总线,由CPU总线演化而来,是针对多媒体PC要求高速传送活动图像的大数据应运而生的。

【VASE是一种并行总线】

由于ISA/EISA总线速度缓慢,造成硬盘、显示卡还有其它的外围设备只能通过慢速并且狭窄的瓶颈来发送和接受数据,使得整机的性能受到严重的影响。为了解决这个问题,1992年Intel 在发布486处理器的时候,也同时提出了32-bit 的PCI(周边组件互连) 总线。

最早提出的PCI总线工作在33MHz 频率之下,传输带宽达到了133MB/s(33MHz * 32bit/8),比ISA总线有了极大的改善,基本上满足了当时处理器的发展需要目前计算机上广泛采用的是这种32-bit、33MHz 的PCI 总线,可扩展到64bit。

【PCI总线是一种并行总线】

特点:
1、高性能;不依附于某个具体的处理器,支持突发传送
2、良好的兼容性。
3、支持即插即用
4、支持多主设备。
5、具有与处理器和存储器子系统完全并行操作的能力。
6、提供数据和地址奇偶校验的能力。
7、可扩充性好,可采用多层结构提高驱动能力
8、采用多路复用技术,减少了总线引脚个数。

PCI总线是独立于CPU的局部总线,可将显示卡、声卡、网卡、硬盘控制器等高速的外围设备直接挂在CPU总线上,打破了瓶颈,使得CPU的性能得到充分的发挥。可惜的是,由于PCI总线只有133MB/s的带宽,对付声卡、网卡、视频卡等绝大多数输入/输出设备也许显得绰绰有余,但对于胃口越来越大的3D显卡却力不从心,并成为了制约显示子系统和整机性能的瓶颈。因此,PCI总线的补充——AGP总线就应运而生了。

Intel 于1996年7月正式推出了AGP(加速图形接口,Accelerated Graphics Port)接口,这是显示卡专用的局部总线,是基于PCI 2.1 版规范并进行扩充修改而成,工作频率为66MHz ,1X模式下带宽为266MB/S,是PCI总线的两倍。后来依次又推出了AGP 2X 、AGP 4X,现在则是AGP 8X ,传输速度达到了2.1GB/S。

【AGP总线是一种并行总线】

Intel 在2001年春季的IDF上,正式公布了旨在取代PCI总线的第三代I/O技术,最后却被正式命名为PCI-Express,Express 意思是高速、特别快的意思。

PCI Express总线是一种完全不同于过去PCI总线的一种全新总线规范,与PCI总线共享并行架构相比,PCI Express总线是一种点对点串行连接的设备连接方式,点对点意味着每一个PCI Express设备都拥有自己独立的数据连接,各个设备之间并发的数据传输互不影响,而对于过去PCI那种共享总线方式,PC总线上只能有一个设备进行通信,一旦PCI总线上挂接的设备增多,每个设备的实际传输速率就会下降,性能得不到保证。

在传输速率方面,PCI Express总线利用串行的连接特点将能轻松将数据传输速度提到一个很高的频率,达到远超出PCI总线的传输速率。与此同时,PCI Exress总线支持双向传输模式,还可以运行全双工模式

支持热拔插

【PCI-E总线是一种串行总线】


  • 设备总线标准

RS-232C是应用于串行二进制交换的数据终端设备(DTE)和数据通信设备(DCE) 之间的标准接口。

RS-232C是美国电子工业协会EIA (Electronic Industry Association)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数。RS-232C总线标准设有25条信号线,包括一个主通道和一个辅助通道。

该标准规定采用一个25个脚的DB-25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来IBM的PC机将RS232简化成了DB-9连接器,从而成为事实标准。而工业控制的RS-232口一般只使用RXD、TXD、GND三条线。

【RS-232C总线是一种串行总线】

SCSI (小型计算机系统接口)是一种用于计算机和能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。 SCSI是一种智能的通用接口标准。

1、IDE的工作方式需要CPU的全程参与,CPU读写数据的时候不能再进行其他操作,这种情况在Windows 95/NT的多任务操作系统中,自然就会导致系统反应的大大减慢。而SCSI接口,则完全通过独立的高速的SCSI卡来控制数据的读写操作,CPU就不必浪费时间进行等待,显然可以提高系统的整体性能。不过,IDE接口为改善这个问题也做了很大改进已经可以使用DMA模式而非PIO模式来读写,数据的交换由DMA通道负责,对CPU的占用可大大减小。尽管如此,比较SCSI和IDE在CPU的占用率,还是可以发现SCSI仍具有相当的优势。

2、SCSI的扩充性比IDE大,一般每个IDE系统可有2个IDE通道,总共连4个IDE设备,而SCSI接口可连接7-15个设备,比IDE要多很多,而且连接的电缆也远长于IDE。

3、虽然SCSI设备价格高些,与IDE相比,SCSI的性能更稳定、耐用,可靠性也更好

【SCSI总线是一种并行总线】

由于可移动计算机(笔记本)用户对PC卡的需求变了,要求强度高,能耗低,尺寸小,而且对这几条性能的要求都很高。所以PC卡的标准也相应地变了。 1991年,PCMCIA定义了原本用于内存卡的68个脚的I/O连接线路标准。同时增加了插槽使用说明。生产商意识到软件需要提高兼容性,因而这项标准也就得到了相应的应用。

PCMCIA总线分为两类,一类为16位的PCMCIA,另一类为32位的CardBus。

CardBus是一种用于笔记本计算机的新的高性能PC卡总线接口标准,就像广泛地应用在台式计算机中的PCI总线一样该总线标准与原来的PC卡标准相比,具有以下的优势:
第一是32位数据传输和33MHz操作。CardBus快速以太网PC卡的最大吞量接近90 Mbps,而6位快速以太网PC卡仅能达到20-30 Mbps。第二,总线自主。使PC卡可以独立于主CPU,与计算机内存间直接交换数据,这样CPU就可以处理其它的任务
第三,3.3V供电,低功耗。提高了电池的寿命,降低了计算机内部的热扩散,增强了系统的可靠性。
第四,后向兼容16位的PC卡。老式以太网和Modem设备的PC卡仍然可以插在CardBus插槽上使用。PCMCIA支持即插即用。

【PCMCIA总线是一种并行总线】

USB是在1994年底由英特尔等多家公司联合在1996年推出后,已成功替代串口和并口,已成为当今电脑与大量智能设备的必配接口。USB属于设备总线是设备和设备控制器之间的接口

USB所有新版本都向下兼容,可以连接鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机数码相机、移动硬盘、外置光软驱、USB网卡、ADSL Modem、Cable Modem等几乎所有的外部设备。

1、可以热插拔、即插即用
2、具有很强的连接能力和很好的可扩充性。采用菊花链(如下图)形式将多外设连接起来,可使用USB集线器链式连接127个外设

3、标准统一。以前大家常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,可是有了USB之后这些应用外设统统可以用同样的标准与个人电脑连接,这时就有了USB硬盘、USB鼠标、USB打印机等等。
4、高速传输
5、连接电缆轻巧,可为低压(5V)外设供电

【USB总线是一种串行总线】

差模信号:如上图,根据2、3的压差来确定1bit数据,差模信号的抗干扰能力很强,因此工作频率可以很高
注意: USB 每次只能传输1bit数据

ATA(又叫PATA,parallel)

Integrated Drive Electronics (电子集成驱动器) 本意是指把“硬盘控制器”与“体”集成在一起的硬盘驱动器。

用于IDE硬盘的接口最初被称为IDE接口,后来扩展为CD-ROM、磁带机、可移动磁盘、LS-120磁盘等设备的接口。

硬盘和光驱通过IDE接口与主板连接。

【IDE总线是一种并行总线】

Serial ATA即串行高级技术附件,它是一种完全不同于并行ATA的新型硬盘接口类型,由于采用串行方式传输数据而知名。是由APT Technologies、DELL、IBM、Intel、Maxtor、Quantum,Seagate等公司合作开发用于取代并行ATA接口技术。

与并行ATA相比,SATA具有比较大的优势。
首先,Serial ATA以连续串行的方式传送数据,可以在较少的位宽下使用较高的工作频率来提高数据传输的带宽Serial ATA一次只会传送1位数据,这样能减少SATA接口的针脚数目,使连接电缆数目变少,效率也会更高。同时还能降低系统能耗,减小系统复杂性。
其次,Serial ATA的起点更高、发展潜力更大,Serial ATA 1.0定义的数据传输率可达150MB/sec,这比目前最块的并行ATA(即ATA/133)所能达到133MB/sec的最高数据传输率还高,而在已经发布的Serial ATA 2.0的数护将达到300MB/sec,最终Serial ATA 3.0将实现600MB/sec的最高数据传输率。

【SATA总线是一种串行总线】


  • 速度对比

画红框考频比较高


  • 总线标准的发展

趋势:串行总线替代并行总线


  • 为何串行总线取代并行总线

并行总线:用m根线每次传送m个比特,用高/低电平表示1/0,通常采用同步定时方式,由于线间信号干扰,因此总线工作频率不能太高。另外,各条线不能有长度差,长距离并行传输时工艺难度大。

串行总线:用两根线每次传送一个比特,采用“差模信号表示1/0,通常采用异步定时方式,总线工作频率可以很高。现在的串行总线通常基于包传输,如80bit为一个数据包,包与包之间有先后关系,因此可以用多个数据通路分别串行传输多个数据包。因此某种程度上现在的串行总线也有“并行”的特点


  • 实例


第七章 输入/输出系统

7.1.1 输入输出系统和IO控制方式

  • 现代计算机

“I/O”就是“输入/输出” (Input/Output)

I/O 设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备


  • 常见的I/O设备

鼠标、键盘——输入设备

显示器、打印机一一输出设备

硬盘、光盘一一即可输入、又可输出的设备(有的教材称为:外存设备)

以上可统称“外部设备


  • 主机如何与I/O设备进行交互

l/O接口: 又称I/O控制器(I/O Controller) 、设备控制器,负责协调主机与外部设备之间的数据传输

I/O控制器多种多样,也会制定相应的标准,如:用于控制USB设备的I/O接口、用于控制SATA3.0硬盘的I/O接口等
(I/O控制器就是一块芯片,常被集成在主板上)


  • I/O控制器(I/O接口)

现在的I/O接口(芯片)也会被集成在南桥芯片内部


  • I/O控制方式简介

1
2
3
4
5
6
7
#include<stdio.h>
int main() {
char i;
scanf("%c", &i); # 等待键盘I/O完成
printf("i = %c\n", i);
return 0;
}

数据流:键盘→I/O接口的数据寄存器→数据总线→CPU某寄存器→主存(变量i的对应位置)

CPU如何控制键盘I/O的完成?

1)程序查询方式:CPU不断轮询检查控制器中的“状态寄存器”,检测到状态为“已完成”之后,再从数据寄存器取出输入数据

2)程序中断方式:等待键盘I/O时CPU可以先去执行其他程序,键盘I/O完成后I/O控制器向CPU发出中断请求,CPU响应中断请求,并取走输入数据

思考:对于快速I/O设备,如“磁盘”,每准备好一个字就给CPU发送一次中断请求,会导致什么问题
答:CPU需要花大量的时间来处理中断服务程序,CPU利用率严重下降。


  • DMA控制方式

DMA:Direct Memory Access,直接内存访问

DMA控制方式:主存与高速I/O设备之间有条直接数据通路 (DMA总线)。CPU向DMA接口发出“读/写”命令,并指明主存地址、磁盘地址、读写数据量等参数。
DMA控制器自动控制磁盘与主存的数据读写,每完成一整块数据读写(如1KB为一整块) ,才向CPU发出一次中断请求


  • 通道控制方式

有的商用中型机、大型机可能会接上超多的I/0设备,如果都让CPU来管理,那么CPU就太累了……

通道是具有特殊功能的处理器,能对I/O设备进行统一管理。

通道:可以理解为是“弱鸡版的CPU”。通道可以识别并执行一系列通道指令,通道指令种类、功能通常比较单一


  • I/O系统的基本组成

一般来说,I/O系统由I/O软件I/O硬件两部分构成。

  1. I/O硬件
    包括输入设备、输出设备、外部设备、I/O接口 、I/O总线等

  2. I/O软件
    包括驱动程序、用户程序、管理程序、升级补丁等。
    通常采用I/O指令和通道指令实现主机和I/O设备的信息交换。

    1)I/O指令 CPU指令的一部分

    注: I/O 指令与普通指令格式略有不同,操作码指明了CPU要对I/O接口做什么,命令码指明了I/O接公要对设备做什么,设备码指明对哪个设备进行操作。

    2)通道指令 通道能识别的指令

    通道程序提前编制好放在主存
    在含有通道的计算机中,CPU执行I/O指令对通道发出命令,由通道执行一系列通道指令,代替CPU对I/O设备进行管理


7.1.2 外部设备

  • 外部设备

外部设备也称外围设备,是除了主机以外的、能直接或间接与计算机交换信息的装置。

  • 输入设备

用于向计算机系统输入命令和文本、数据等信息的部件。键盘和鼠标是最基本的输入设备。

  • 输出设备

用于将计算机系统中的信息输出到计算机外部进行显示、交换等的部件。显示器和打印机 是最基本的输出设备。

  • 外存设备

是指除计算机内存及CPU缓存等以外的存储器。硬磁盘、光盘等是最基本的外存设备。


  • 输入设备

键盘是最常用的输入设备,通过它可发出命令或输入数据。 键盘通常以矩阵的形式排列按键,每个键用符号标明它的含义和作用。每个键相当于一个开关,当按下键时,电信号连通; 当松开键时,弹簧把键弹起,电信号断开。

键盘输入信息可分为3个步骤:
①查出按下的是哪个键;
②将该键翻译成能被主机接收的编码,如ASCII码;
③将编码传送给主机。

鼠标是常用的定位输入设备,它把用户的操作与计算机屏幕上 的位置信息相联系。常用的鼠标有机械式和光电式两种。

工作原理: 当鼠标在平面上移动时,其底部传感器把运动的方向和距离检测出来,从而控制光标做相应运动。


  • 输出设备——显示器

按显示设备所用的显示器件分类:
阴极射线管(CRT)显示器
液晶显示器(LCD)
LED显示器
……

按所显示的信息内容分类:
字符显示器
图形显示器
图像显示器
……

性能指标:

  • 屏幕大小
    以对角线长度表示,常用的有12~29英寸等。

  • 分辨率
    所能表示的像素个数,屏幕上的每一个光点就是一个像素,以宽、高的像素的乘积表示,例如,800×600、 1024×768和1280×1024等。

  • 灰度级
    灰度级是指黑白显示器中所显示的像素点的亮暗差别,在彩色显示器中则表现为颜色的不同,灰度级越多,图像层次越清楚逼真,典型的有8位(256级)、16位等。n位可以表示2n种不同的亮度或颜色。

  • 刷新
    光点只能保持极短的时间便会消失,为此必须在光点消失之前再重新扫描显示一遍,这个过程称为刷新。刷新频率:单位时间内扫描整个屏幕内容的次数,按照人的视觉生理,刷新频率大于30Hz时才不会感到闪烁,通常显示器刷新频率在60~120Hz。

  • 显示存储器(VRAM)
    也称刷新存储器,为了不断提高刷新图像的信号,必须把一帧图像信息存储在刷新存储器中。其存储容量由图像分辨率和灰度级决定,分辨率越高,灰度级越多,刷新存储器容量越大

    VRAM容量 = 分辨率 * 灰度级位数
    VRAM带宽 = 分辨率 * 灰度级位数 * 帧数

VRAM举例:

1440 * 900 * 3B ≈ 3.7MB(一帧的大小即为显存的理论最小值)

如果显示器刷新率=60Hz,则显存带宽至少要 3.7*60=222MB

注:现代计算机中,显存除了作为当前显示帧的缓存,还会用于保存即将消边的图像数据。

集成显卡计算机中,通常分配一片内存作为显存

  • 阴极射线管(CRT)显示器

CRT显示器主要由电子枪、偏转线圈、荫罩、高压石墨电极和荧光粉涂 层及玻璃外壳5部分组成。具有可视角度大、无坏点、色彩还原度高、 色度均匀、可调节的多分辨率模式、响应时间极短等目前LCD难以超过(这句话已经跟不上时代了)的优点。

  • 液晶显示器(LCD)

原理:利用液晶的电光效应,由图像信号电压直接控制薄膜晶 体管,再间接控制液晶分子的光学特性来实现图像的显示。

特点:体积小、重量轻、省电、无辐射、绿色环保、画面柔、 不伤眼等。

  • LED(发光二极管)显示器

原理:通过控制半导体发光二极管进行显示,用来显示文字、图 形、图像等各种信息。

LCD与LED是两种不同的显示技术,LCD是由液态晶体组成的显示屏,而LED则是由发光二极管组成的显示屏。与LCD相比,LED显示器在亮度、功耗、可视角度 和刷新速率等方面都更具优势。


  • 显示器 - 阴极射线管(CRT)显示器

按显示信息内容不同可分为:

  • 字符显示器。

显示字符的方法以点阵为基础。点阵是指由m×n个点组成的阵列。点阵的多少取决于显示字符的质量和字符窗口的大小。字符窗口是指每个字符在屏幕 上所占的点数,它包括字符显示点阵和字符间隔。

点阵存入由ROM构成的字符发生器中,在CRT进行光栅扫描的过程中,从字符发生器中依次读出某个字符的点阵,按照点阵中0和1代码不同控制扫描电 子束的开或关,从而在屏幕上显示出字符。对应于每个字符窗口,所需显示字符的ASCII代码被存放在视频存储器VRAM中,以备刷新。

  • 图形显示器

将所显示图形的一组坐标点和绘图命令组成显示文件存放在缓冲存储器中, 缓存中的显示文件传送给矢量(线段)产生器,产生相应的模拟电压,直接 控制电子束在屏幕上的移动。为了在屏幕上保留持久稳定的图像,需要按一 定的频率对屏幕进行反复刷新。 这种显示器的优点是分辨率高且显示的曲线平滑。目前高质量的图形显示器 采用这种随机扫描方式。缺点是当显示复杂图形时,会有闪烁感。

  • 图像显示器

现在的电脑手机的显示器

按扫描方式不同可分为:

  • 光栅扫描显示器
  • 随机扫描显示器

  • 输出设备——打印机

打印机是计算机的输出设备之一,用于将计算机处理结果打印在相关介质上。

按印字原理不同可分为

  • 击打式打印机:利用机械动作使印字机构与色带和纸相撞而打印字符

    优:
    设备成本低
    印字质量好
    缺:
    噪声大
    速度慢

    如:机打发票银行回执单(防伪性好)

  • 非击打式打印机:采用电、磁、光、喷墨等物理、化学方法来印刷字符

    优:
    速度快
    噪声小
    缺:
    成本高(对于现在来说不一定高)

按打印机工作方式不同可分为

  • 串行打印机:逐字打印 速度慢
  • 行式打印机:逐行打印 速度快

按工作方式可分为

  • 针式打印机

    原理:在联机状态下,主机发出打印命令,经接口、检测和控制电路,间歇驱动纵向送纸和打印头横 向移动,同时驱动打印机间歇冲击色带,在纸上打印出所需内容。

    特点:针式打印机擅长“多层复写打印”,实现各种票据或蜡纸等的打印。它工作原理简单,造价低 廉,耗材(色带)便宜,但打印分辨率和打印速度不够高。

  • 喷墨式打印机

    原理:带电的喷墨雾点经过电极偏转后,直接在纸上形成所需字形。彩色喷墨打印机基于三基色原理, 即分别喷射3种颜色墨滴,按一定的比例混合出所要求的颜色。

    特点:打印噪声小,可实现高质量彩色打印,通常打印速度比针式打印机快;但防水性差,高质量打 印需要专用打印纸。

  • 激光打印机

    原理:计算机输出的二进制信息,经过调制后的激光束扫描,在感光鼓上形成潜像,再经过显影、转 印和定影,便在纸上得到所需的字符或图像。

    特点:打印质量高、速度快、噪声小、处理能力强;但耗材多、价格较贵、不能复写打印多份,且对 纸张的要求高。激光打印机是将激光技术和电子显像技术相结合的产物。感光鼓(也称为硒鼓) 是激光打印机的核心部件。


7.2 I/O接口

  • I/O接口的作用

  • 数据缓冲:通过数据缓冲寄存器(DBR)达到主机和外设工作速度的匹配
  • 错误或状态监测:通过状态寄存器反馈设备的各种错误、状态信息,供CPU查用
  • 控制和定时:接收从控制总线发来的控制信号、时钟信号
  • 数据格式转换:串-并、并-串 等格式转换
  • 与主机和设备通信:实现 主机—I/O接口—I/O设备 之间的通信

  • I/O接口

内部接口:内部接门与系统总线相连,实质上是与内存、CPU相连。数据的传输方式只能是并行传输(已过时)。

外部接口:外部接口通过接口电缆与外设相连,外部接口的数据传输可能是串行方式,因此I/O接口需具有串/并转换功能。

①发命令:发送命令字到/0控制寄存器,向设备发送命令(需要驱动程序的协助)
②读状态:从状态寄存器读取状态字,获得设备或I/O控制器的状态信息
③读/写数据:从数据缓冲寄存器发送或读取数据,完成主机与外设的数据交换

控制寄存器、状态寄存器在使用时间上是错开的,因此有的I/O接口中可将二者合二为一

lO控制器中的各种寄存器称为I/O端口

数据线:读写数据、状态字、控制字、中断类型号(有的教材也把命令字称为控制字)

地址线:指明I/O端口

控制线:读/写IO端口的信号、中断请求信号

如何确定要操作的设备?
有的计算机每个设备对应一组寄存器,操作不同的寄存器就是在操作不同的设备


  • 接口与端口

I/O端口是指接口电路中可以被CPU直接访问的寄存器

如何访问I/O端口?
I/O端口要想能够被CPU访问,必须要有端口地址,每一个端口都对应着一个端口地址。


  • 统一编址v.s.独立编址

统一编址:

靠不同的地址码区分内存和I/O设备。访存类的指令都可以访问I/O端口
(RISC机器常用)

独立编址:

靠不同的指令区分内存和I/O设备。只能用专门的I/O指令访问I/O端口
(Intel处理器常用,IN、OUT就是IO指令)


  • I/O端口及其编址
  1. 统一编址

把I/O端口当做存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口,又称存储器映射方式

靠不同的地址码区分内存和I/O设备,I/O地址要求相对固定在地址的某部分

如系统总线中地址线共10根,则可以访问的存储单元个数为2102^{10}=1024个,假设要给10个I/O端口编址:
1、0~9表示I/O地址,10~1023为主存单元地址
2、0~1013表示I/O地址,1014~1023为主存单元地址
3、10~19表示I/O地址,0~9、20~1023为主存单元地址

优点:
不需要专门的输入/输出指令,可使CPU访问I/O的操作更灵活、更方便,还可使端口有较大的编址空间。

缺点:
端口占用了存储器地址,使内存容量变小,而且,利用存储器编址的I/O设备进行数据输入/输出操作,执行速度较慢。

  1. 独立编址

I/O端口地址与存储器地址无关,独立编址CPU需要设置专门的输入/输出指令访问端口,又称I/O映射方式

靠不同的指令区分内存和I/O设备。

优点:
输入/输出指令与存储器指令有明显区别, 程序编制清晰,便于理解。

缺点:
输入/输出指令少,一般只能对端口进行传送操作,尤其需要CPU提供存储器读/写、I/O设备读/写两组控制信号,增加了控制的复杂性。


  • I/O接口的类型

按数据传送方式可分为

  • 并行接口:一个字节或一个字所有位同时传送。
  • 串行接口:一位一位地传送。

注:这里所说的数据传送方式指的是外设和接口一侧的传送方式,而在主机和接口一侧, 数据总是并行传送的(已过时)。接口要完成数据格式转换。

按主机访问I/O设备的控制方式可分为

  • 程序查询接口
  • 中断接口
  • DMA接口

按功能选择的灵活性可分为

  • 可编程接口
  • 不可编程接口

7.3.1 程序查询方式

  • I/O方式简介

程序查询方式:

程序中断方式:

DMA方式:


  • 程序查询方式

模拟打印3个字符“abc”

x86中的IO指令实例
IN Rd, Rs:把IO端口Rs 的数据输入到CPU寄存器 Rd
OUT Rd, Rs:把CPU寄存器 Rs 的数据输出到IO端口 Rd


  • 程序查询方式流程图

优点:接口设计简单、设备量少。
缺点:CPU在信息传送过程中要花费很多时间用于查询和等待,而且在一段时间内只能和一台外设交换信息,效率大大降低。


  • 程序查询方式-例题

在程序查询方式的输入/输出系统中,假设不考虑处理时间,每一个查询操作需要100个时钟周期, CPU的时钟频率为50MHz。现有鼠标和硬盘两个设备,而且CPU必须每秒对鼠标进行30次查询,硬盘以32位字长为单位传输数据,即每32位被CPU查询一次,传输率为2×2202^{20}B/s。求CPU对这两个设备查询所花费的时间比率,由此可得出什么结论?

时间的角度:
一个时钟周期为 1/50MHz = 20ns
一个查询操作耗时 100 × 20ns = 2000ns
1)鼠标
每秒查询鼠标耗时 30 × 2000ns = 60000ns
查询鼠标所花费的时间比率 = 60000ns/1s = 0.006%
对鼠标的查询基本不影响CPU的性能
2)硬盘
每32位需要查询一次,每秒传送2×2202^{20}B
每秒需要查询(2×2202^{20}B)/32 = 2192^{19}
查询硬盘耗时 2192^{19}× 2000n = 512 × 1024 × 2000ns
≈ 1.05×10910^{9}
查询硬盘所花费的时间比率 = (1.05× 10910^{9} ns)/1s = 105%
CPU将全部时间都用于对硬盘的查询也不能满足磁盘传输的要求

频率的角度:
CPU的时钟频率为50MHz,即每秒50× 106 个时钟周期
1)鼠标
每秒查询鼠标占用的时钟周期数 30 × 100 = 3000
查询鼠标所花费的时间比率 = 3000/(50× 10610^{6} ) = 0.006%
对鼠标的查询基本不影响CPU的性能
2)硬盘
每秒需要查询(2×2202^{20}B)/32 = 2192^{19}
每秒查询硬盘占用的时钟周期数 2192^{19}× 100≈ 5.24×10710^{7}
查询硬盘所花费的时间比率 = (5.24×10710^{7} )/(50× 10610^{6} ) ≈ 105%
CPU将全部时间都用于对硬盘的查询也不能满足磁盘传输的要求


  • 本节回顾

CPU一旦启动I/O,必须停止现行程序的运行,并在现行程序中插入一段程序

主要特点:CPU有“踏步”等待现象,CPU与I/O串行工作。

优点:接口设计简单、设备量少。
缺点:CPU在信息传送过程中要花费很多时间用于查询和等待,而且如果采用独占查询,则在一段时间内只能和一台外设交换信息,效率大大降低。

独占查询:CPU 100%的时间都在查询I/O状态,完全串行(如上图)
定时查询:在保证数据不丢失的情况下,每隔一段时间CPU就查询一次I/O状态。查询的间隔内CPU可以执行其他程序


7.3.2 中断的作用和原理

  • 中断的基本概念

程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂 时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。

工作流程:

  1. 中断请求
    • 中断源向CPU发送中断请求信号。
  2. 中断响应
    • 响应中断的条
    • 中断判优:多个中断源同时提出请求时通过中断判优逻辑响应一个中断源。
  3. 中断处理
    • 中断隐指令。
    • 中断服务程序。

  • 中断请求的分类

看操作系统的第一章

外中断(也称中断)【狭义的中断】

  • 非屏蔽中断:关中断(中断标志位IF=0)时也会被响应
  • 可屏蔽中断:关中断时不会被响应

IF:Interrupt Flag,存在PSW中,8086芯片的PSW如下

关中断的作用:实现原子操作
开中断 IF=1 允许中断
关中断 IF=0 不允许中断


  • 中断请求标记

每个中断源向CPU发出中断请求的时间是随机的。

为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR, 当其状态为“1”时,表示中断源有请求。

这些触发器可组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。

对于外中断,CPU是在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号【对于执行时间很长 的指令,可在执行 过程中设置若干个 “查询断点”】, 以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻
CPU响应中断必须满足以下3个条件:
① 中断源有中断请求。
② CPU允许中断即开中断。
③ 一条指令执行完毕,且没有更紧迫的任务。


  • 中断判优-实现
    有多个中断信号同时到来,先处理哪个?

中断判优既可以用硬件实现,也可用软件实现:
硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,也可以分散在各个中断源中;
软件实现是通过查询程序实现的。


  • 中断判优-优先级设置

1、硬件故障中断属于最高级,其次是软件中断(系统调用);

2、非屏蔽中断优于可屏蔽中断;

3、DMA请求优于I/O设备传送的中断请求;

4、高速设备优于低速设备;

5、输入设备优于输出设备;

6、实时设备优于普通设备


  • 中断处理过程

由K地址开始,当前指令执行结束 后,PC内容为K+1
进入中断服务程序的方法是把该程序第一条指令的地址放入PC
回到主程序的方法是把K+1放入PC

软件无法完成保存PC的任务,应由硬件实现:中断隐指令
中断隐指令:保存原程序的PC值,并让PC指向中断服务程序的第一条指令


  • 中断处理过程-中断隐指令

中断隐指令的主要任务:
关中断
在中断服务程序中,为了保护中断现场(即CPU主要寄存器中的内容)期间不被新的中断所打断,必须关中断,从而保证被中断的程序在中断服务程序执行完毕之后能接着正确地执行下去。

保存断点
为了保证在中断服务程序执行完毕后能正确地返回到原来的程序,必须将原来程序的断点(即程序计数器(PC)的内容【和psw的内容】)保存起来。 可以存入堆栈,也可以存入指定单元。

引出中断服务程序
引出中断服务程序的实质就是取出中断服务程序的入口地址并传送给程序计数器(PC)。

那么怎么知道中断服务程序的入口地址呢:软件查询法、硬件向量法


  • 中断处理过程-硬件向量法

硬件 产生 向量地址 再由 向量地址 找到 入口地址


  • 中断处理过程-中断服务程序

中断服务程序的主要任务:
保护现场
一是保存程序断点(PC),已由中断隐指令完成;
二是保存通用寄存器和状态寄存器的内容【应该是讲错了,psw是中断隐指令保存的】,由中断服务程序完成。 可以使用堆栈,也可以使用特定存储单元。

中断服务(设备服务)
主体部分,如通过程序控制需打印的字符代码送 入打印机的缓冲存储器中。

恢复现场
通过出栈指令或取数指令把之前保存的信息送回寄存器中。

中断返回
通过中断返回指令回到原程序断点处。


  • 总结: 中断处理过程

单重中断:执行中断服务程序时不响应新的中断请求。 (本节内容)

多重中断:又称中断嵌套,执行中断服务程序时可响 应新的中断请求。


7.3.3 多重中断

  • 单重中断与多重中断


  • 中断屏蔽技术

中断屏蔽技术主要用于多重中断,CPU要具备多重中断的功能,须满足下列条件。
① 在中断服务程序中提前设置开中断指令。
② 优先级别高的中断源有权中断优先级别低的中断源。
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。

硬件排队器是收到多个中断请求时,只响应其中一个固定优先级

中断屏蔽是调整多重中断的优先级

屏蔽字设置的规律:

  1. 一般用‘1’表示屏蔽,’0’表示正常申请。
  2. 每个中断源对应一个屏蔽字(在处理该中断源的中断服务程序时,屏蔽寄存器中的内容为该中断源对应的屏蔽字)。
  3. 屏蔽字中‘1’越多,优先级越高。每个屏蔽字中至少有一个’1’(至少要能屏蔽自身的中断)。

【例题】设某机有4个中断源A、B、C、D,其硬件排队优先次序为A>B>C>D,现要求将中断处理次序改为D>A>C>B。
1)写出每个中断源对应的屏蔽字。
2)按下图所示的时间轴给出的4个中断源的请求时刻,画出CPU执行程序的轨迹。设每个中断源的中断服 务程序时间均为20us。

【解】
1)
中断源A的屏蔽字为1110
中断源B的屏蔽字为0100
中断源C的屏蔽字为0110
中断源D的屏蔽字为1111

2)


  • 扩展(了解一哈)

IF:Interrupt Flag,存在PSW中,8086芯片的PSW如下

IF(Interrupt Flag)开/关中断标志。
当IF=1时,表示开中断,当IF=0时表示关中断

INTR:可屏蔽中断请求 (interrupt request)信号,输入,用来申请一个硬件中断。当IF=1时,若INTR 保持高电平,则在当前指令执行完毕后就进入中断响应周期

NMI:非屏蔽中断 (non-maskable interrupt)输入信号。与INTR信号类似,但NMI中断不必检查IF标志位是否为1。常用于处理电源掉电紧急情况。

INTA:中断响应 (interrupt acknowledge)信号,输出。响应INTR 输入。该引脚常用来选通中断向量码以响应中断请求


7.3.4 程序中断方式

  • 程序中断方式

【例题】假定CPU主频为50MHz,CPI为4。设备D采用异步串行通信方式向主机传送7位ASCII字符,通信规程中有1位奇校验位和1位停止位,从D接收启动命令到字符送入I/O端口需要0.5ms。请回答下列问题,要求说明理由。
1)每传送一个字符,在异步串行通信线上共需传输多少位?在设备D持续工作过程中,每秒钟最多可向I/O端口送入多少个字符?
2)设备D采用中断方式进行输入/输出,示意图如下:

I/O端口每收到一个字符申请一次中断,中断响应需10个时钟周期,中断服务程序共有20条指令,其中第15 条指令启动D工作。若CPU需从D读取1000个字符,则完成这一任务所需时间大约是多少个时钟周期?CPU用于完成这一任务的时间大约是多少个时钟周期?在中断响应阶段CPU进行了哪些操作?

【解】

1)至少包含1位起始位和1位停止位,停止位可能有多位。 每传送一个字符需要传送1位起始位、7位数据位、 1位校验位、1位停止位,共需传送10位。 每0.5ms可送入1个字符 每秒可送入 1s/0.5ms = 2000 个字符

2)

主频50MHz,时钟周期为 1/50MHz = 20ns
0.5ms对应时钟周期数为 0.5ms/20ns = 25000
传送1个字符需要的时钟周期数为 25000 + 10 + 15×4 = 25070
传送1000个字符需要的时钟周期数为 25070×1000 = 25070000

CPU用于该任务的时间大约为 1000×(10+20×4)= 9×10410^4 个时钟周期

中断隐指令:
1、关中断 2、保存断点(PC) 3、引出中断服务程序


7.3.5 DMA方式

  • DMA控制器

对于程序中断方式:
每准备好一个数据都要中断CPU,由CPU运行中断服务程序来完成一次传送磁盘机、磁带机等高速设备需要大批量的数据传送 → CPU大量时间用于中断服务
由硬件实现控制大批量的数据传送 → DMA控制器

在DMA方式中,当I/O设备需要进行数据传送时,通过DMA控制器(DMA接口)向CPU提出DMA传送请求,CPU响应之后将让出系统总线,由DMA控制器接管总线进行数据传送。其主要功能有:

传送前:
1)接受外设发出的DMA请求,并向CPU发出总线请求。
2)CPU响应此总线请求,发出总线响应信号,接管总线控制权,进入DMA操作周期。

传送时:
3)确定传送数据的主存单元地址及长度,并能自动修改主存地址计数和传送长度计数。
4)规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作。

传送后:
5)向CPU报告DMA操作的结束


  • DMA控制器

名词 解释
控制/状态逻辑 由控制和时序电路及状态标志组
成,用于指定传送方向,修改传
送参数,并对DMA请求信号和
CPU响应信号进行协调和同步
DMA请求触发器 每当I/O设备准备好数据
后给出一个控制信号,
使DMA请求触发器置位。
数据缓冲寄存器 用于暂存每次传送的数据。
传送长度计数器 简称WC,用来记录传
送数据的长度,计数
溢出时,数据即传送
完毕,自动发中断请
求信号。
主存地址计数器 简称AR,存放要交
换数据的主存地址。
中断机构 当一个数据块传送完毕后触发中
断机构,向CPU 提出中断请求。

注:在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号被禁止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。


  • DMA传送过程

以数据输入为例


  • DMA方式的特点

换一种总线连接方式(之前提到的三总线)

主存和DMA接口之间有一条直接数据通路。
由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作

DMA方式具有下列特点:
① 它使主存与CPU的固定联系脱钩,主存既可被CPU访问,又可被外设访问。
② 在数据块传送时,主存地址的确定、传送数据的计数等都由硬件电路直接实现。
③ 主存中要开辟专用缓冲区,及时供给和接收外设的数据。
④ DMA传送速度快,CPU和外设并行工作,提高了系统效率。
⑤ DMA在传送开始前要通过程序进行预处理,结束后要通过中断方式进行后处理。

教材很乱,有的单总线,有的三总线

这种结构可能出现CPU和DMA控制器同时想要访问主存的情况,怎么解决?


  • DMA传送方式

主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时,不通过CPU。但当I/O设备和CPU同时访问主存时,可能发生冲突,为了有效地使用主存,DMA控制器与CPU通常采用以下3种方法使用主存。

(1)停止CPU访问主存

优点:
控制简单
缺点:
CPU 处于不工作状态或保持状态
未充分发挥 CPU 对主存的利用率

(2)DMA与CPU交替访存

如下图,一个CPU周期,分为C1 和C2 两个周期
C1专供DMA访存
C2专供CPU访存

优点:
不需要总线使用权的申请、建立和归还过程
缺点:
硬件逻辑更为复杂

(3)周期挪用(周期窃取)(周期—存取周期)

DMA 访问主存有三种可能:
CPU 此时不访存(不冲突)
CPU 正在访存(存取周期结束让出总线)
CPU 与 DMA 同时请求访存(I/O访存优先


  • DMA方式与中断方式