计算机组成原理(Computer Organization)相关内容。一级标题下为学科基础内容,其余为重点内容详解(理论为主)。本学科疑难点多而杂,请仔细阅读。
1 计算机系统概述
发展历程:
- 第1代:电子管
- 第2代:晶体管
- 第3代:中小规模集成电路
- 第4代:超大规模集成电路
系统组成:
- 运算器:计算机的执行部件,用于对数据进行加工处理。
- 控制器:计算机的指挥中心,由其控制各部件自动协调地进行工作。
- 存储器:计算机的存储部件,用于存放程序和数据。
- 输入设备:将程序和数据以机器所能识别和接受的信息形式输入到计算机
- 输出设备:将计算机处理的结果以某些形式输出。
1.1 冯·诺依曼机和存储程序
冯·诺依曼在研究EDVAC机时提出了存储程序的概念,存储程序的思想奠定了现代计算机的基本结构,以此概念为基础的各类计算机通称为冯·诺依曼机,其特点如下:
- 计算机硬件系统由运算器、存储器、控制器、输入设备和输出设备5大部件组成。
- 指令和数据以同等地位存储在存储器中,并可按地址寻访。
- 指令和数据均用二进制码表示。
- 指令由操作码和地址码组成:操作码用于表示操作的性质,地址码用于表示操作数在存储器中的位置。
- 指令在存储器内按顺序存放。通常,指令是顺序执行的,在特定条件下可根据运算结果或根据设定的条件改变执行顺序。
- 早期的冯·诺依曼机以运算器为中心,输入/输出设备通过运算器与存储器传送数据;现代计算机以存储器为中心。
存储程序的基本思想为将指令以二进制码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,之后就按该程序的规定顺序执行其他指令,直至程序执行结束。

1.2 计算机的工作过程
计算机的工作过程分为以下三个步骤:
- 把程序和数据装入主存储器。
- 将源程序转换成可执行文件。
- 从可执行文件的首地址开始逐条执行指令。
相关概念:
- 寄存器/部件:
- PC(Program Counter,程序计数器):存放下一条要执行指令的地址,取指时把地址送入MAR,自动自增。
- MAR(Memory Address Register,存储器地址寄存器):存放要访问的内存单元地址,送到地址总线,用于寻址。
- 主存(Memory):存放指令和数据。
- MDR(Memory Data Register,存储器数据寄存器):存放从内存读出/写入内存的数据或指令,连接CPU与内存。
- IR(Instruction Register,指令寄存器):存放当前正在执行的指令,指令从MDR送入IR。
- 累加器(Accumulator):运算器核心寄存器,存放操作数、运算中间结果、最终结果。
- 指令/控制:
- 操作码(Operation Code):指令中表示做什么操作(如加、减、取数、跳转)。
- 地址码(Address Code):指令中表示操作数的地址,用于找数据。
- 控制单元(Control Unit,CU):控制器核心,解析指令、产生控制信号,指挥全机各部件工作。
1.3 编译和解释
在计算机系统结构中,翻译的方式分为两种——编译和解释:
- 编译型语言的程序在执行之前,需要进行专门的编译过程,将程序编译成机器语言的文件,例如
.exe文件。只要源程序不改动,以后要运行时就无需重新编译。 - 解释型语言的程序不需要编译,而是在运行程序时逐句翻译,不生成目标程序。解释型语言没执行一次就要翻译一次,效率比较低。
Java是一种半编译半解释的解释型语言,并非直接编译成机器语言(二进制语言),而是编译成字节码(.class文件)后再用解释方式执行。编译后的.class文件属于中间代码,并不是.exe可执行程序这种二进制文件,故还需要JVM(Java虚拟机)进行解释。整个过程:.java文件 → 编译成.class字节码文件 → 由JVM解释执行。
C语言编译过程分为四个步骤:
- 由
.c文件到.i文件——预处理:将#include包含的头文件直接拷贝到.c文件中,再将#define定义的宏进行替换,同时删除代码中没用的注释。 - 由
.i文件到.s文件——编译 - 由
.s文件到.o文件——汇编 - 由
.o文件到可执行文件——链接:将翻译成的二进制内容与需要用到的库绑定在一起。

1.4 指令执行过程
程序中第一条指令的地址置于PC中。根据PC取出第一条指令,经过译码、执行步骤等,控制计算机各功能部件协同运行,完成这条指令的功能,并计算下一条指令的地址。用新得到的指令地址继续读出第二条指令并执行,直至程序结束位置。本节以取数指令(即将指令地址码指示的存储单元中的操作数取出后送至运算器的累加器ACC中)为例进行说明,其信息流程如下:
- 取指令:PC → MAR → M → MDR → IR
- 根据PC取指令至IR,将PC的内容送至MAR;MAR中的内容直接送至地址线,同时控制器将读信号送至读/写信号线;主存根据地址线上的地址和读信号,从指定存储单元读出指令,送到数据线上;MDR从数据线接收指令信息,并传至IR中。
- 分析指令:OP(IR) → CU
- 指令译码并送出控制信号。控制器根据IR中指令的操作码,生成相应的控制信号,送到不同的执行部件。在本例中,IR中是取数指令,因此读控制信号被送到总线的控制线上。
- 执行指令:Ad(IR) → MAR → M → MDR → ACC
- 执行取数操作。将IR中指令的地址码送至MAR;MAR中的内容送至地址线,同时控制器将读信号送至读/写信号线;从主存指定存储单元读出操作数,并通过数据线送至MDR;最后传至ACC中。
此外,每取完一条指令,还须为取下一条指令做准备,形成下一条指令的地址,即PC <- PC + 1。
1.5 主要性能指标
机器字长:计算机进行一次整数运算(顶点整数运算)所能处理的二进制数据的位数。通常与CPU的寄存器位数、加法器有关。因此机器字长一般等于内部寄存器的大小。字长越长,数的表示范围越大,计算精度越高。计算机字长通常选定为字节(8位)的整数倍。
数据通路带宽:数据总线一次所能并行传送信息的位数。这里所说的数据通路宽度是指外部数据总线的宽度,它与CPU内部的数据总线宽度(内部寄存器的大小)可能不同。各子系统通过数据总线连接形成的数据传送路径称为数据通路。
主存容量:主存储器所能存储信息的最大容量。通常以字节来衡量,也可用字数 × 字卡(如512K×16位)来表示。其中,MAR的位数反映存储单元的个数,MAR的位数反映可寻址范围的最大值(不一定是实际存储器的存储容量)。
运算速度:
- 吞吐量:系统在单位时间内处理请求的数量。它取决于信息能多快地输入内存,CPU能多快地取指令,数据能多快地从内存取出或存入,以及所得结果能多快地从内存送给一台外部设备。几乎每步都关系到主存,因此系统吞吐量主要取决于主存的存取周期。
- 响应时间:从用户提交请求到系统首次产生响应并获得其所需要的结果所用的时间。通常包括CPU时间(运行一个程序所花费的时间)与等待时间(用于磁盘访问、存储器访问、I/O操作、操作系统开销等的时间)。
- CPU时钟周期:通常为节拍脉冲或
T周期,即主频的倒数。是CPU中最小的时间单位,每个动作至少需要1个时钟周期。 - 主频:机器内部主时钟的频率,时钟周期的倒数。
- CPI(Clock-cycle Per Instruction):执行一条指令所需的时钟周期数。
- 执行时间:运行一个程序所花费的时间。
- MIPS:每秒执行多少百万条指令。
- FLOPS:每秒执行多少次浮点运算,另有MFLOPS、GFLOPS等。
2 数据的表示和运算
数制与编码:
- 数值:BCD码,用4位二进制来表示一位十进制数,有冗余状态。
- 字符:
- ASCII码:采用7位二进制数表示大小写字母、数字和专用符号。
- 汉字编码:包括输入编码、汉字内码、汉字字形码。
- 校验:
- 奇偶校验码:在原编码上加一个校验位,检验整个检验码中1的个数是否为奇数或偶数。
- 海明校验码:按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,产生多位检测信息,并得出出错位置。
- 循环冗余校验码:在
K位信息码后再拼接R位检验码,利用模2除法检验编码正确性。
定点数:
- 表示:
- 原码:用机器数的最高位表示该数的符号,其余的各位表示数的绝对值。
- 反码:正数与原码一样,负数除符号位外其余各位是原码的按位取反。
- 补码:正数与原码一样,负数是反码的末位加1。
- 移码:在真值
X上加上一个常数(偏置值),通常这个常数取2^n。
- 计算:移位、原码以及补码下的加减乘除。
浮点数:
- 表示:
- 组成:阶符、阶码、数符和尾数。
- 规格化:规定尾数的最高数位必须是一个有效值。
- IEEE754标准:尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数。
- 加减步骤:对阶、尾数求和、规格化。
算术逻辑单元:
- 一位全加器:最基本的加法单元,输入两位加数及低位的进位,输出和与高位进位。
- 串行加法器:一位全加器的简单相连,串行进位。
- 并行加法器:使用先行进位提高加法器的运算速度。
- ALU:功能较强的组合逻辑电路,能进行多种算术运算和逻辑运算。
2.1 IEEE754标准浮点数
按照IEEE754标准,常用的浮点数的格式如下:
m_{\mathrm{s}} |
E |
M |
|---|---|---|
| 数符 | 阶码部分,用移码表示 | 尾数数值位部分,用原码表示 |
IEEE754标准规定常用的浮点数格式有短浮点数(单精度,float型)、长浮点数(双精度,double型)、临时浮点数,详见下表:
| 类型 | 数符 | 阶码 | 尾数数值 | 总位数 | 偏置值 |
|---|---|---|---|---|---|
| 短浮点数 | 1 | 8 | 23 | 32 | 7FH(127) |
| 长浮点数 | 1 | 11 | 52 | 64 | 3FFH(1023) |
| 临时浮点数 | 1 | 15 | 64 | 80 | 3FFFH(16383) |
IEEE754标准的浮点数(除临时浮点数外),是尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数。
以短浮点数为例,最高位为数符位;其后是8位阶码,以2为底,用移码表示,阶码的偏置值为2^{8-1}-1=127;其后23位是原码表示的尾数数值位。对于规格化的二进制浮点数,数值的最高位总是1,为了能使尾数多表示一位有效位,将这个1隐含,因此尾数数值实际上是24位。隐含的1是一位整数。在浮点格式中表示的23位尾数是纯小数。例如,(12)_{10}=(1100)_{2},将它规格化后结果为1.1\times 2^3,其中整数部分的1将不存储在23位尾数内。
注意:短浮点数与长浮点数都采用隐含尾数最高数位的方法,因此可多表示一位尾数。临时浮点数又称扩展精度浮点数,无隐含位。
2.2 C语言中的浮点数及类型转换
C语言中的float和double类型分别对应于IEEE754单精度浮点数和双精度浮点数。long double类型对应于扩展双精度浮点数,但long double的长度和格式随不同类型的编译器和处理器而各有不同。
C程序在进行等式的赋值和判断时会出现强制类型转换,其中char → int → long → double和float → double最为常见,且从前到后范围和精度都从小到大,转换过程没有损失。此外,还存在以下几种重要的强转情形:
- 从
int转换为float时,虽然不会发生溢出,但int可保留32位,float只可保留24位,可能发生数据舍入。 - 从
int或float转换为double时,因为double的有效位数更多,因此能保留精确值。 - 从
double转换为float时,因为float表示范围更小,因此可能发生溢出。此外,由于有效位数变少,因此可能被舍入。 - 从
float或double转换为int时,因为int没有小数部分,所以数据可能会向0方向被截断(仅保留整数部分),影响精度。另外,由于int的表示范围更小,因此可能发生溢出。
2.3 二进制表示的意义
从可行性来说,采用二进制,只有0和1两个状态,能够表示0、1两种状态的电子器件很多,例如开关的接通和断开、晶体管的导通和截止、磁元件的正负剩磁、电位电平的高与低等,都可表示0、1两个数码。使用二进制,电子器件具有实现的可行性。
从运算的简易性来说,二进制数的运算法则少,运算简单,使计算机运算器的硬件结构大大简化(十进制的乘法口诀表有55条公式,而二进制乘法只有4条规则)。
从逻辑上来说,由于二进制0和1正好和逻辑代数的假(false)和真(true)相对应,有逻辑代数的理论基础,用二进制表示二值逻辑很自然。
2.4 各编码方式的数值范围

小数没有移码定义。
3 存储系统
层次结构:Cache → 主存 → 磁盘 → 磁带、光盘
主存与CPU的连接:
- 扩展:
- 位扩展:将芯片的地址、片选和读写控制端相应并联,数据端分别引出。
- 字扩展:将芯片的地址、数据、读写控制线相应并联,片选位译码给出。
- 字位扩展:同时进行字扩展和位扩展。
- 片选:
- 线选法:用除片内寻址外的高位地址线直接分别接至存储芯片的片选端。
- 译码片选法:用除片内寻址外的高位地址线通过译码器产生片选信号。
3.1 多级存储系统
为了解决存储系统大容量、高速度和低成本这3个相互制约的矛盾,在计算机系统中,通常采用多级存储器结构。下图中由上至下,位价越来越低,速度越来越慢,容量越来越大,CPU访问的频度也越来越低:

实际上,存储系统层次结构主要体现在Cache-主存层次和主存-辅存层次。前者主要解决CPU和主存速度不匹配的问题,后者主要解决存储系统的容量问题。在存储体系中,Cache、主存能与CPU直接交换信息,辅存则需通过主存与CPU交换信息;主存与CPU、Cache、辅存都能交换信息。
存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。从CPU的角度看,Cache-主存层次速度接近于Cache,容量和成本却接近于主存;从主存-辅存层次分析,其速度接近于主存,容量和成本却接近于辅存。这就解决了速度、容量、成本这三者之间的矛盾。
在主存-辅存这一层次的不断发展中,逐渐形成了虚拟存储系统,在该系统中开发人员编程的地址范围与虚拟存储器的地址空间相对应。对具有虚拟存储器的计算机系统而言,编程时可用的地址空间远大于主存空间。
3.2 半导体随机存储器
半导体存储器的组成:存储矩阵、译码驱动、读写电路、读写控制线、片选线、地址线和数据项
各种存储器的分类:
- SRAM(Static Random Access Memory,静态随机存储器):用双稳态触发器来记忆信息。
- 通常把存放一个二进制位的物理器件称为存储元,它是存储器最基本的构件。地址码相同的多个存储元构成一个存储单元,若干存储单元的集合构成存储体。
- SRAM的存储元用双稳态触发器(六晶体管MOS)来记忆信息,因此信息被读出后仍能保持其原状态而不需要再生(非破坏性读出)。SRAM的存取速度快,但集成度低,功耗较大,故一般用于组成高速缓冲存储器。
- DRAM(Dynamic Random Access Memory,动态随机存储器):利用存储元电路中栅极电容上的电荷来存储信息。
- 与SRAM的存储原理不同,DRAM利用存储元电路中栅极电容上的电荷来存储信息,且基本存储元通常只使用一个晶体管,故它比SRAM的密度要高得多。
- DRAM采用地址复用技术,地址线是原来的1/2,且地址信号分行、列两次传送。相对于SRAM来说,DRAM具有容易集成、位价低、容量大和功耗低等优点,但DRAM的存取速度慢,一般用于组成大容量主存系统。
- DRAM电容上的电荷一般只能维持1~2ms,因此即使电源不断电,信息也会自动消失,因此每隔一定时间必须刷新,这个时间称为刷新周期,通常为2ms。
- 常用的刷新方式有如下3种:
- 集中刷新:用一段固定时间依次对存储器的所有行逐一刷新。
- 分散刷新:把对每一行的刷新分散到各个工作周期中去。
- 异步刷新:把对每行刷新分散到一整个刷新周期中去。
- ROM(Read-Only Memory,只读存储器):非易失性的存储器。
- ROM和RAM都是支持随机存取的存储器,其中SRAM和DRAM均为易失性半导体存储器。而ROM中一旦有了信息,就不能轻易改变,即使掉电也不会丢失,它在计算机系统中是只供读出的存储器。
- ROM器件有两个显著的优点:
- 结构简单,所以位密度比可读写存储器高。
- 具有非易失性,所以可靠性高。
- ROM可细分为如下几种:
- MROM:在生产过程中直接写入,以后任何人都无法改变其内容。
- PROM:允许用户用专门设备写入程序,写入后内容就无法改变。
- EPROM:允许用户写入程序,程序员可以对其内容进行多次改写。
- Flash:在不加电时仍可长期保存信息且能进行快速擦除重写。
主存由DRAM实现,Cache则由SRAM实现,它们都属于易失性存储器,只要电源被切断,原来保存的信息便会丢失。DRAM的每比特成本低于SRAM,速度也慢于SRAM,价格差异主要是因为制造DRAM需要更多的硅。
3.3 提高CPU访存速度的并行技术
为了提高CPU访问存储器的速度,可以采用双端口存储器、多模块存储器等技术,它们同属并行技术,前者为空间并行,后者为时间并行。
- 双端口存储器(双端口RAM):指同一个存储器有左、右两个独立的端口,分别具有两组相互独立的地址线、数据线和读写控制线,允许两个独立的控制器同时异步地访问存储单元(如下图所示)。当两个端口的地址不同时,在两个端口上进行读写操作一定不会发生冲突。

- 多模块存储器:由于CPU的速度比存储器快,若同时从存储器中取出若干条指令(一次并行读出多个字),则可充分利用CPU资源,提高运行速度。基于这种思想提出了多模块存储器,分为以下几种——
- 单体多字存储器:单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储
m个字,总线宽度也为m个字。一次并行读出m个字,地址必须按顺序排列并处于同一存储单元。单体多字系统在一个存取周期内从同一地址取出m条指令,然后将指令逐条送至CPU执行,即每隔1 / m存取周期,CPU向主存取一条指令。显然,这增大了存储器的带宽,提高了单体存储器的工作速度。- 缺点:指令和数据在主存内必须连续存放,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显。
- 多体并行存储器:由多体模块组成,每个模块都有相同的容量和存取速度,各模块都有独立的读写控制电路、地址寄存器和数据寄存器。它们既能并行工作,又能交叉工作。又分为以下两类:
- 高位交叉编址:高位地址为信号,低位地址为体内地址。
- 低位交叉编址:低位地址为信号,高位地址为体内地址。
- 单体多字存储器:单体多字系统的特点是存储器中只有一个存储体,每个存储单元存储
3.4 Cache
Cache(高速缓冲存储器)位于CPU和主存DRAM之间,规模较小,但速度很快,通常由SRAM组成。
Cache的功能是提高CPU数据输入输出的速率(解决主存与CPU在速度上的矛盾)。Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善,仿佛其存储系统容量与内存相当而访问速度近似Cache。Cache通常采用相联存储器。使用Cache改善系统性能的依据是程序的局部性原理。
替换算法:当Cache产生了一次访问未命中之后,相应的数据应同时读入CPU和Cache。但若Cache已存满数据,新数据必须替换(淘汰)Cache中的某些旧数据。最常用的替换算法如下:
- 随机算法:随机地确定替换的Cache块。
- 先进先出(FIFO):选择最早调入的行进行普换。
- 近期最少使用(LRU):选择近期内长久未访问过的存储行作为替换的行。
- 最不经常使用(LFU):将一段时间内被访问次数量少的存储行换出。
写操作:因为需要保证缓存在Cache中的数据与内存中的内容一致,Cache的写操作比较复杂,常用的写策略如下:
- 全写法(Write-through,写直达法):当CPU对Cache写命中时,必须把数据同时写入Cache和主存。
- 写回法:修改时不立即写回主存,只有当此块被换出时才写回主存。
- 标记法:通过设置脏位标记数据是否被修改,结合写回逻辑按需更新主存。
与主存的映射方式:
- 直接映射:主存数据块只能装入Cache中的唯一位置。
- 全相联映射:可以把主存数据块装入Cache中的任何位置。
- 组相联映射:将Cache分为若干组,一个数据块可以装入一组内的任何一个位置。
3.5 虚拟存储器
虚拟存储器是指具有请求调入和置换功能,能从逻辑上对内存容量加以扩存的一种存储器系统。引入目的:解决主存不足的问题。
主要分为如下3类管理方式:
- 页式管理:内存分为固定的块,按物理结构划分,会有内部碎片。
- 把虚拟存储空间和实际空间等分成固定大小的页,各虚拟页可装入主存中的不同实际页面位置。页式存储中,处理机逻辑地址由虚页号和页内地址两部分组成,实际地址也分为页号和页内地址两部分,由地址映射机构将虚页号转换成主存的实际页号。
- 页式管理使用一个页表,其中包括页号、每页在主存中起始位置、装入位等。页表是虚拟页号与物理页号的映射表。页式管理由操作系统进行,对应用开发人员是透明的。
- 段式管理:内存块的大小不固定,按逻辑结构划分,会有外部碎片。
- 把主存按段分配,是一种模块化的存储管理方式。段一般按程序模块划分(即逻辑划分),每个用户程序模块可分到一个段,该程序模块只能访问分配给该模块的段所对应的主存空间。段长可以任意设定,并可放大和缩小。
- 系统中通过一个段表指明各段在主存中的位置。段表中包括段名(段号)、段起点、装入位和段长等。段表本身也是一个段。
- 段页式管理:上述两种方法的结合,会有内部碎片。
- 将存储空间按逻辑模块分成段,每段又分成若干个页,访存通过一个段表和若干个页表进行。段的长度必须是页长的整数倍,段的起点必须是某一页的起点。
虚拟存储机制的各个组成部分:
- 页表机制:通过查表获取相关信息。
- 中断机构:要访问页不在内存时产生缺页中断。
- 地址变换机构:把逻辑地址变换成物理地址。
- 内存和外存:需要一定容量的内存和外存的支持。
页面置换算法:
- OPT:选择以后不用的页面。
- FIFO:选择最先装入的页面。
- LRU:选择最近最久未用的页面。
- CLOCK:选样最近未用的页面。
- 改进型CLOCK:考虑页面修改问题。
快表(Translation Look-aside Buffer,TLB):在虚拟存储器中进行地址变换时,需要进行虚页号变换成主存中实页号的内部地址这一过程。缓存时首先要到主存查页表,然后才能根据主存物理地址访问主存的存取指令或数据。因此采用虚拟存储器机制后,访存的次数增加了。为了减少访存次数,往往将页表中最活跃的几个页表项复制到高速缓存中。这种在高速缓存中的页表项称为快表。
查表时,根据虚页表同时查找快表和慢表,当在快表中查到该虚页号时,就能很快找到对应的实页号,将其送入主存实地址寄存器,同时使慢表的查找作废,此时主存访问速率下降幅度极小。若在快表中查不到,则经过一次主存访问时延后,将从慢表中查到的实页送入实地址寄存器,同时将此虚页号和对应的实页号送入快表。
因此,虚拟存储器的地址翻译过程可表示为:TLB → 页表(TLB不命中) → Cache → 主存 → 外存
4 指令系统
指令格式:
- 基本格式:
- 操作码:指出指令中该指令应执行什么性质的操作和具有何种功能。
- 地址码:给出被操作信息的地址或操作数本身,可以有多个地址码。
- 定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 扩展操作码:全部指令的操作码字段的位数不固定。
4.1 CISC和RISC对比
存在两种指令集的计算机:
- CISC(Complex Instruction Set Computer,复杂指令集计算机):指令数目多、字长不固定、寻址方式多、寄存器数量少、一般为微程序控制。
- RISC(Reduced Instruction Set Computer,精简指令集计算机):指令数目少、宇长固定、寻址方式少、寄存器数量多、一般为组合逻辑控制。
详细对比如下表所示:
| 项目 | CISC | RISC |
|---|---|---|
| 指令系统 | 复杂,庞大 | 简单,精简 |
| 指令数目 | 一般大于200条 | 一般小于100条 |
| 指令字长 | 不固定 | 定长 |
| 可访存指令 | 不加限制 | 只有Load/Store指令 |
| 各种指令执行时间 | 相差较大 | 绝大多数都在一个周期内完成 |
| 各种指令使用频度 | 相差很大 | 都比较常用 |
| 通用寄存器数量 | 较少 | 多 |
| 目标代码 | 难以用优化编译生成高效的目标代码程序 | 采用优化的编译程序,生成代码较为高效 |
| 控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
| 指令流水线 | 可以通过一定方式实现 | 必须实现 |
4.2 寻址方式
常见的寻址方式:
- 指令寻址:
- 顺序寻址:通过程序计数器PC加1,自动形成下一条指令的地址。
- 跳跃寻址:通过转移类指令直接或间接给出下一条指令的地址。
- 数据寻址:
- 隐含寻址:操作数地址不明显给出,隐含在指令中。
- 立即寻址:给出的不是操作数的地址,而是操作数本身。
- 直接寻址:直接给出操作数的真实地址。
- 间接寻址:给出操作数有效地址所在的存储单元的地址。
- 寄存器寻址:直接给出操作数所在的寄存器编号。
- 寄存器间接寻址:给出存有操作数所在主存单元的地址的寄存器编号。
- 相对寻址:把程序计数器PC的内容加上指令格式中的形式地址。
- 基址寻址:将基址寄存器的内容加上指令格式中的形式地址。
- 变址寻址:将变址寄存器的内容加上指令格式中的形式地址。
- 堆栈寻址:从规定的堆栈中取出操作数。
5 中央处理器
指令执行过程:
- 指令周期:
- 取指周期:根据PC中的内容取出指令代码并存放在IR中。
- 间址周期:取操作数有效地址。
- 执行周期:根据指令字的操作码和操作数执行相应的操作。
- 中断周期:处理中断请求。
- 执行方案:
- 单指令周期:对所有指令都选用相同的执行时间来完成。
- 多指令周期:对不同类的指令选用不同的执行步骤来完成。
- 流水线方案:指令之间可以并行执行的方案。
5.1 CPU的组成与功能
中央处理器(Central Process Unit,CPU)的组成:
- 运算器:对数据进行加工。
- 控制器:发出每条指令对应的操作序列对计算机进行控制。又可分为以下两种——
- 硬布线控制器:由复杂的组合逻辑门电路和一些触发器构成,由硬件给出控制信号。
- 微指令控制器:把每条机器指令设计成一个微程序,由微指令给出控制信号。
- 组成:控制存储器、微指令寄存器、微指令形成部件、微地址寄存器
- 编码方式:
- 直接编码:字段中每一位代表一个微命令。
- 字段直接编码:把互斥微命令放在一段编码。
- 字段间接编码:某些微命令需要另一个段的微命令来解释。
- 格式:
- 操作控制字段:各个微操作信号的集合。
- 顺序控制字段:包括判断测试字段和后继微地址字段。
两种数据通路:
- 内部总线:CPU内部的公共通路,多个部件共享,可以存在一条或多条。
- 专用通路:根据指令执行过程中的数据和地址的流动方向安排连接线路。
CPU的具体功能:
- 指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制:管理并产生由内存取出的每条指令的操作信号。
- 时间控制:为每条指令按时间顾序提供应有的控制信号。
- 数据加工:对数据进行算术和逻辑运算。
- 中断处理:对计算机运行过程中出现的异常情况和特珠请求进行处理。
5.2 流水线的基本原理
流水线技术是一种显著提高指令执行速度与效率的技术。方法为:指令取指完成后,不等该指令执行完毕即可取下一条指令。如果把一条指令的解释过程进一步细分,分成取指、译码、执行、访存和写回五个子过程,并用五个子部件分别处理这五个子过程。这样只需在上一指令的第一子过程处理完毕进入第二子过程处理时,在第一子部件中就开始对第二条指令的第—子过程进行处理。随着时间推移,这种重叠操作最终可达到五个子部件同时对五条指令的子过程进行操作。下图为典型的五级流水线的数据通路:

与传统的串行执行方式相比,采用流水线方式具有如下特点:
- 把一个任务(一条指令或一个操作)分解为几个有联系的子任务,每个子任务由一个专门的功能部件来执行,并依靠多个功能部件并行工作来缩短程序的执行时间。
- 流水线每个功能段部件后面都要有一个缓冲寄存器(锁存器),其作用是保存本流水段的执行结果,供给下一流水段使用。
- 流水线中各功能段的时间应尽量相等,否则将引起堵塞、断流。
- 只有连续不断地提供同一种任务时才能发挥流水线的效率,所以在流水线中处理的任务必须是连续任务。在采用流水线方式工作的处理机中,要在软件和硬件设计等多方面尽量为流水线提供连续的任务。
- 流水线需要有装入时间(第一个任务进入流水线到输出流水线的时间)和排空时间(最后一个任务进入流水线到输出流水线的时间)。
流水线的分类:
- 按使用级别分:部件功能級流水线、处理机級流水线、处理机间级流水线
- 按完成功能分:单功能流水线、多功能流水线
- 按连接方式分:动态流水线、静态流水线
- 按有无反馈信号分:线性流水线、非线性流水线
流水线的性能指标:吞吐率、加速比、效率
流水线的各种基本技术:超标量流水线技术、超流水线技术、超长指令字技术
5.3 流水段与执行速度
在流水线中,每个子过程专门的功能部件实现,每级过程称为一个流水段。
流水线越多,并行度就越高。但流水段越多,指令执行并不会更快,甚至会被拖慢,原因如下:
- 流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大。
- 流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增加而大增,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。
因此需要合理划分流水段。
5.4 流水线的影响因素
影响流水线性能的因素主要分为以下3类:
- 结构相关:由于多条指令在同一时刻争用同一资源而形成的冲突。
- 解决方案:
- 暂停一个时钟周期。
- 单独设置数据存储器和指令存储器。
- 解决方案:
- 数据相关:指令在流水线中重叠执行时,必须等前一条指令执行完才能执行后一条指令的情况(后一条指令需要用到前一条指令的执行结果)。
- 解决方案:
- 暂停一个时钟周期。
- 数据旁路:把前一条指令的ALU计算结果直接输入到下一条指令。
- 解决方案:
- 控制相关:当流水线遇到分支指令或其他改变PC值的指令时造成断流。
- 解决方案:
- 延迟转移技术——将转移指令与其前面的与转移指令无关的一条或几条指令对换位置,让成功转移总是在紧跟的指令被执行之后发生,从而使预取的指令不作废。
- 转移预测技术。
- 解决方案:
关于指令相关、数据相关的几个问题概念:
- 两条连续的指令读取相同的寄存器时,会产生读后读(Read After Read,RAR)相关,这种相关不会影响流水线。
- 某条指令要读取上一条指令所写入的寄存器时,会产生写后读(Read After Write,RAW)相关(又称数据相关或真相关),影响流水线。按序流动的流水线只可能出现RAW 相关。
- 某条指令的上条指令要读/写该指令的输出寄存器时,会产生读后写(Write After Read,WAR)和写后写(Write After Write,WAW)相关。在非按序流动的流水线中,既可能发生RAW相关,又可能发生WAR相关和WAW相关。
对流水线影响最严重的指令相关是数据相关。
6 总线
总线(Bus)的定义:一组能为多个部件分时共享的公共信息传送线路。
6.1 总线的分类
按照连接的对象可分为:
- 片内总线:用来连接芯片内部的各个部件。
- 系统总线:用于连接计算机系统内各功能部件。
- 通信总线:用于连接计算机系统之间或计算机系统与其他系统。
按照传输信息的不同可分为:
- 数据总线:各个功能部件之间传送数据信息,双向传输。
- 地址总线:用来指明数据总线上,源数据或目的数据所在的主存单元的地址。单向传输,由CPU发出。
- 控制总线:用来发送各种控制信号。对于控制总线中的单根线而言,控制总线是单向的,即只能由一个部件发向另一个部件;而在一组控制总线中,输入和输出同时存在,因此控制总线亦可看成是双向的。
6.2 总线机制概述
仲裁:
- 集中式:
- 链式查询:根据线的连接顺序依次查询每个部件有无请求。
- 计数器定时查询:对每个设备编号,用计算器依次查询。
- 独立请求方式:在总线控制器中排队,按照一定规则批准某个请求。
- 分布式:不需要中央仲裁器,每个潜在的主模块都有自己的仲裁号和仲裁器。
总线周期:
- 申请分配阶段:主设备向总线提出使用请求。
- 寻址阶段:通过总线发出本次要访问的从模块的地址及有关命令。
- 传输阶段:主模块和从模块进行数据交换,可单向或双向进行数据传送。
- 结束阶段:主模块的有关信息均从系统总线上撤除,让出总线使用权。
定时:
- 同步:系统采用一个统一的时钟信号来协调发送和接收双方的传递定时关系。
- 异步:没有统一的时钟,依靠相互制约的“握手”来实现定时通信。
- 分类:不互锁、半互锁、全互锁
6.3 总线的性能指标
除了传输周期、时钟周期外,还存在以下常见的总线性能指标:
- 总线宽度:数据总线的根数,一般是8的倍数。是衡量计算机系统性能的重要指标。
- 总线带宽:即总线数据传输速率,总线上每秒能够传输的最大字节量。
- 总线复用:一条信号线上分时传送两种信号。例如数据总线和地址总线的分时复用。
- 信号线数:地址总线、数据总线和控制总线三种总线的线数之和。
6.3 引入总线结构的优点
引入总线结构主要有以下优点:
- 简化了系统结构,便于系统设计制造。
- 大大减少了连线数目,便于布线,减小体积,提高系统的可靠性。
- 便于接口设计,所有与总线连接的设备均采用类似的接口。
- 便于系统的扩充、更新与灵活配置,易干实现系统的模块化。
- 便于设备的软件设计,所有接口的软件对不同的接口地址进行操作。
- 便于故障诊断和维修,同时也能降低成本。
7 输入输出系统
外部设备:
- 输入设备:键盘、鼠标等
- 输出设备:显示器、打印机等
- 外存储器:硬盘存储器、磁盘阵列、光盘存储器等
I/O接口:
- 主要功能:
- 实现主机和外设的通信联络控制。
- 进行地址译码和设备选择。
- 实现教据缓冲。
- 进行信号格式的转换。
- 传送控制命令和状态信息。
- 组成:数据缓冲寄存器、设备选择电路、命令寄存器、命令译码器、内部接口、外部接口、设备状态标记、控制逻辑电路
- 两种编址方式:
- 统一编址:把I/O端口当做存储器的单元进行地址分配。
- 独立编址:I/O端口独立编址,设置专门的输入/输出指令访问端口。
I/O控制方式见操作系统篇
7.1 I/O方式概述
程序查询:由程序不断的查询外设的状态,直到外设准备就绪。
程序中断:
- 工作流程:
- 中断请求:中断源向CPU发出中断信号。
- 中断判优:判断多个中断源的优先级。
- 响应条件:
- 有中断源提出中断请求。
- CPU允许中断及开中断(Interrupt Enable)。
- 一条指今执行完毕且没有更紧迫的任务。
- 中断隐指令:完成关中断、保存断点、引出中断服务程序。
- 中断向量:查询中断服务程序的入口地址。
- 中断处理:执行中断服务程序最后恢复现场,中断返回。
- 多重中断:当CPU处理中断时,又有更高优先級的中断请求。
- 条件:
- 在中断服务程序中提前设置开中断指令。
- 优先级别高的中断源有权中断优先级别低的中断源。
- 中断解蔽技术:在处理中断时,用中断屏蕨字屏藏掉某些中断源
- 条件:
DMA(Direct Memory Access,直接内存访问):
- 组成:
- 主存地址计数器:存放要交换数据的主存地址。
- 传送长度计数器:用来记录传送数据的长度。
- 数据缓冲寄存器:用于暂存每次传送的数据。
- DMA请求触发器:I/O设备准备好数据后使DMA请求触发器置位。
- 控制/状态逻辑:由控制和时序电路及状态标志组成。
- 中断机构:数据块传送完毕后触发中断机构,提出中断请求。
- 传送方式:
- 停止CPU访存:当需要传送数据时,停止CPU对主存的访问。
- 交替访存:将CPU周期分为DMA访存和CPU访存两个部分。
- 周期挪用:I/O设备要访存时,挪用一个或几个存取周期。
- 传送过程:
- 预处理:完成寄存器置初始值等准备工作。
- 数据传送:占用总线传输数据,数据传送完全由DMA控制。
- 后处理:CPU执行中断服务程序做结束DMA处理。
7.2 CPU响应中断的内部条件
具体地,CPU响应中断应具备以下3个条件:
- 在CPU内部设置的中断屏蔽触发器必须是开放的。
- 外设有中断请求时,中断请求触发器必须处于
1状态,保持中断请求信号。 - 外设(接口)中断允许触发器必须为
1,这样才能把外设中断请求送至CPU。
具备上述三个条件时,CPU在现行指令结束的最后一个状态周期响应中断。
关于中断响应优先级和中断处理优先级:
- 中断响应优先级由硬件排队线路或中断查询程序的查询顺序决定,不可动态改变;
- 中断处理优先级可以由中断屏蔽字来改变,反映的是正在处理的中断是否比新发生的中断的处理优先级低(屏蔽位为
0,对新中断开放),若是,则中止正在处理的中断,开始新中断的处理,处理完后再回到刚才被中止的中断继续处理。
7.3 中断向量相关概念辨析
程序中断工作流程中的三个重要概念辨析:
- 中断向量:每个中断源都有对应的处理程序,该处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表。
- 亦有某些机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
- 向量地址:中断向量表或中断向量跳转表中每个表项所在的内存地址或表项的索引值,称为向量地址或中断类型号。
- 向量中断:指一种识别中断源的技术或方式。识别中断源的目的是找到中断源对应的中断服务程序的入口地址的地址,即获得向量地址。
7.4 调用子程序和程序中断的区别
调用子程序和程序中断的根本区别主要表现在服务时间和服务对象不同:
- 调用子程序过程发生的时间是已知的、固定的,即在主程序中的调用指令(
CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的、固定的。而中断过程发生的时间一般是随机的,CPU在执行某个主程序时收到中断源提出的中断申请就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的。- 调用子程序是程序设计者所事先安排,而执行中断服务程序由系统工作环境随机决定。
- 子程序完全为主程序服务,两者属于主从关系,主程序在需要时调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序一般是无关的,不存在谁为谁服务的问题,两者属于平行关系。
- 主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路;而中断处理系统是一个软/硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程。
- 子程序嵌套可实现若干级,嵌套的最多级数受计算机内存开辟的堆栈大小限制;而中断嵌套级数主要由中断优先级来决定,优先级数一般不会很大。