目录
1. 翻译程序、汇编程序、编译程序、解释程序和区别和联系是什么?
3. 字、字长、机器字长、指令字长、存储字长的区别与联系是什么?
2、计算机在字长足够的情况下能够精确地表示每个数吗?若不能,请举例说明。
3、字长相同的情况下,浮点数和定点数的表示范围与精度有什么区别?
1、如何表示一个数值数据?计算机中的数値数据都是二进制数吗?
4、对于位数相同的定点数和浮点数,可表示的浮点数个数比定点数个数多吗?
1、存储器的层次结构主要体现在何处?为何要分这些层次?计算机如何管理这些层次?
函数调用时,如何切换栈帧?(enter、push ebp mov ebp,esp)
函数返回时,如何切换栈帧?(leave、mov esp,ebp pop ebp)
2、一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址?
1、指令和数据均存放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?
4、什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?
1、流水线越多,并行度就越高。是否流水段越多,指令执行越快?
一、计算机系统概述
*1.1 计算机发展历程
计算机系统 = 硬件 + 软件
*1.1.1 计算机硬件的发展
- 计算机硬件的发展:
- 第一代计算机:(使用电子管),
- 第二代计算机:(使用晶体管),
- 第三代计算机:(使用较小规模的集成),
- 第四代计算机:(使用较大规模的集成),
- 摩尔定律:集成电路上的晶体管数量每18月就会翻一翻,所以每18月计算机的处理效率就会提高一倍。
*1.1.2 计算机软件的发展
计算机软件技术的发展,促进计算机系统的发展。
同时,直接影响计算机系统性能提升的各种系统软件也有了长足的发展,特别是操作系统,如 Windows、UNIX、 Linux等。
1.2 计算机系统层次结构
1.2.1 计算机系统的组成
软件系统和硬件系统共同构成了一个完整的计算机系统。
- 硬件:有形的物理设备,是计算机系统中实际物理装置的总称。
- 软件:是指在硬件上运行的程序和相关的数据及文档
注:如果对于某一个功能既可以由软件实现,又可以由硬件实现,则称为软/硬件在逻辑功能上是等价的。(通常来说,一个功能若使用较为频繁且用硬件实现的成本较为理想,则使用硬件解决可以提高效率。)
1.2.2 计算机硬件的基本组成
冯诺依曼体系结构特点(6):
- 计算机硬件系统由五大部件组成(存储器、运算器、控制器、I/O设备)
- 指令和数据以同等地位存于存储器,可按地址寻访
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
- “存储程序”(将事先编制好的程序和原始数据送入主存储器后才能执行,一旦程序被启动执行,就无须操作人员的干预,计算机会自动逐条执行指令,直至程序执行结束。)
- 以运算器为中心
注:冯·诺依曼机工作方式是控制流驱动方式。
计算机的功能部件★★★:
- 输入设备:将信息转换成机器能识别的形式(键盘、鼠标、扫描仪)
- 输出设备:将结果转换成人们熟悉的形式(显示器、打印机)
- 主存储器:存放数据和程序(按地址存取)
- 存储器地址寄存器(MAR):存放访问地址,经过地址译码后找到所选的存储单元(其位数反映最多可寻址的存储单元的个数)(MAR的长度与PC的长度相等)
- 存储器数据寄存器(MDR):用于暂存要从存储器中读or写的信息,时序控制逻辑用于产生存储器操作所需的各种时序信号(MDR的位数通常等于存储字长,一般为字节的2次幂的整数)
- 运算器:是计算机的运算单元,主要用于算术运算(加减乘除)、逻辑运算(与或非etc.)
核心是算术逻辑单元(ALU)- BR:基址寄存器
- LX:变址寄存器
- X:操作数寄存器
- MQ:乘商寄存器
- ACC:累加器
- 控制器:指挥各部件,使程序运行,计算机的指挥中心
- CU:控制单元,分析指令,给出控制信号
- IR:指令寄存器,存放当前执行的指令
- PC:程序计数器,存放下一条指令地址,有自动加1功能
- 辅助存储器:用于帮助主存储器记忆更多的信息(其中的信息必须调入主存储器后,才能为CPU所访问)
注:MAR和MDR虽然是存储器的一部分,但在现代计算机中却是存在于CPU中的;另外,Cache也存在于CPU中。
一般将运算器和控制器集成到同一个芯片上,称为中央处理器(CPU)。CPU和主存储器共同构成主机,而除主机外的其他硬件装置(外存、I/O设备等)统称为外部设备,简称外设。
CPU和主存之间通过一组总线相连,总线中有地址、控制和数据3组信号线。
1.2.3 计算机软件的分类
1、系统软件和应用软件
- 计算机软件,一般分为系统软件和应用软件
- 系统软件:是一组保证计算机系统高效、正确运行的基础软件,通常作为系统资源提供给用户使用。包括操作系统,数据库管理系统,语言处理系统(比如编译器),分布式软件系统,网络软件系统,标准库系统,服务性系统(比如连接程序)。
- 应用软件:是指用户为解决某个应用领域中的各类问题而编制的程序。包括各种科学计算类程序,工程设计类程序,数据统计与处理程序。
2、三个级别的语言
- 机器语言。又称二进制代码语言,需要编程人员记忆每条指令的二进制编码。机器语言是计算机唯一可以直接识别和执行的语言。
- 汇编语言。汇编语言用英文单词或其缩写代替二进制的指令代码,更容易为人们记忆和理解。使用汇编语言编辑的程序,必须经过一个称为汇编程序的系统软件的翻译,将其转换为计算机的机器语言后,才能在计算机的硬件系统上执行。
- 高级语言。高级语言(如C、C++、Java等)是为方便程序设计人员写出解决问题的处理方案和解题过程的程序。通常高级语言需要经过编译程序编译成汇编语言程序,然后经过汇编操作得到机器语言程序,或直接由高级语言程序翻译成机器语言程序。
注:数据库管理系统和数据库系统是不一样的。数据库管理系统是系统软件。而数据库系统一般是由数据库,数据库管理系统,数据库管理员和应用系统构成。所以只能说它里面有系统软件,但并不能说它为系统软件。
机器语言是唯一可以控制CPU的语言,但是它的符号不利于人识别和书写,为了方便理解和记忆,将机器语言换一些通俗易懂的符号,这就变成了汇编语言。一般来说在在编译器中高级语言先转换为汇编在转换为机器语言,也有直接转换为机器语言的情况。
机器语言是计算机唯一可以直接执行的语言,汇编语言用助记符编写,以便记忆。
而正则语言是编译原理中符合正则文法的语言。
各种翻译程序的概念:
- 汇编程序(汇编器):将汇编语言程序翻译成机器语言程序。
- 解释程序(解释器):将源程序中的语句按执行顺序逐条翻译成机器指令并立即执行。(Python、Shell)
- 编译程序(编译器):翻译一句执行一句,边翻译边执行:由高级语言转化为汇编语言的过程称为编译,把汇编语言源程序翻译成机器语言程序的过程称为汇编。(exe,比如C/C++、Java)
1.2.4 计算机系统的层次结构
软件和硬件之间的界面就是指令集体系结构(ISA)
1.2.5 计算机系统的工作原理
eg:
- IR:存放当下欲执行的指令;
- PC:存放下一条指令的地址;
- MAR:存放欲访问的存储单元地址;
- MDR:存放从存储单元取来的数据;
- 地址译码器是主存的构成部分,不属于CPU(地址寄存器虽然一般属于主存,但是现代计算机中绝大多数CPU内部都集成了地址寄存器);
- 关于CPU存取速度的比较:寄存器(CPU内部)> Cache(高速的SRAM) > 内存 (SDRAM)
- IR、MDR、MAR是CPU的内部存储器,对于程序员均不可见。
1.3 计算机的性能指标
- 机器字长:计算机的位数(机器字长),表示计算机进行一次整数运算(即定点整数运算)所能处理的二进制数据的位数。计算机字长通常选定为字节(8位)的整数倍。不同的计算机,字节可能不同。
- 数据通路带宽:数据总线一次所能传送信息的位数。
- 主存容量:MAR的位数反映存储单元的个数,如MAR为16位,表示存储单元为2^16 = 64K;若MDR为32位,则存储容量为2^16x32。
- 运算速度:
- 吞吐量:指系统在单位时间内处理请求的数量 ;
- 响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得所需结构的等待时间。
- CPU时钟周期:机器内部主时钟脉冲信号的宽度。通常为节拍脉冲或T周期,即主频的倒数,它是CPU中最小的时间单位,每个动作至少需要1个时钟周期。以相邻状态单元间组合逻辑电路的最大延迟为基准确定。
- 主频(CPU时钟频率):机器内部主时钟的频率(时钟周期的倒数),是衡量机器速度的重要参数。
- CPU周期:又称为机器周期,是由多个时钟周期组成的
- CPI(Clock cycle Per Instruction):即执行一条指令所需的时钟周期数。
- CPU执行时间:指运行一个程序所花费的时间。
- CPU执行时间 = CPU时钟周期数 / 主频 = (指令条数 x CPI) / 主频
- IPS(Instructions Per Second) :IPS = 主频 / 平均CPI,每秒执行多少指令
- MIPS(Million IPS)=即每秒执行多少百万条指令。
- FLOPS(Floating-point Operations Per Second):意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
- MFLOPS(Mega IPS)=浮点操作次数/(执行时间x10^6),即每秒执行多少百万次浮点运算。
- GFLOPS(Giga IPS)=浮点操作次数/(执行时间x10^9),即每秒执行多少十亿次浮点运算。
- TFLOPS(Tera IPS)=浮点操作次数/(执行时间x10^12),即每秒执行多少万亿次浮点运算。
- PFLOPS(Peta IPS)=浮点操作次数/(执行时间x10^15),即每秒执行多少千万亿次浮点运算。
- EFLOPS(Exa IPS)=浮点操作次数/(执行时间x10^18),即每秒执行多少百京亿次浮点运算。
- ZFLOPS(Zetta IPS)=浮点操作次数/(执行时间x10^21),即每秒执行多少万京次浮点运算。
- 基准程序(Benchmarks):专门用来进行性能评价的一组程序,能够很好的放映机器在运行负载时的性能,可以通过在不同机器上运行相同的基准程序来比较在不同机器上的运行时间,从而测评其性能。
注:
- CPU的性能取决于三个要素:主频、CPI 、指令条数
- 指令周期 > CPU周期 > 时钟周期
- 1京 = 1亿亿 = 10^16
- 买高铁票Easy(MGTPEZ)
- s->ms->us->ps
1.3.2 几个专业术语
- 系列机:具有基本相同的体系结构,使用相同基本指令系统的多个不同型号的计算机组成的一个产品系列。
- 兼容:是指软件或硬件的通用性,即运行在某个型号的计算机系统中的硬/软件也能应用于另一个型号的计算机系统时,称这两台计算机在硬件或软件上存在兼容性。
- 固件:将程序固化在ROM中组成的部件称为固件。
1.4 常见问题和易混淆知识点
1. 翻译程序、汇编程序、编译程序、解释程序和区别和联系是什么?
翻译程序是指把高级语言源程序翻译成机器语言程序(目标代码)的软件。
翻译程序有两种:
一种是编译程序,它将高级语言源程序一次全部翻译成目标程序,每次执行程序时,只需执行目标程序,因此只要源程序不变,就无须重新翻译,请注意同一种高级语言在不同体系结构下,编译成目标程序是不一样的,目标程序与体系结构相关,但仍不是计算机硬件能够直接执行的程序。
另一种是解释程序,它将源程序的一条语句翻译成对应的机器目标代码,并立即执行,然后翻译下一条源程序语句并执行,直至所有源程序语句全部被翻译并执行完。所以解释程序的执行过程是翻译一句执行一句,并且不会生成目标程序。
汇编程序也是一种语言翻译程序,它把汇编语言源程序翻译为机器语言程序。汇编语言是种面向机器的低级语言,是机器语言的符号表示,与机器语言一一对应。
编译程序与汇编程序的区別:若源语言是诸如C、C++、Java等“高级语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,则这样的一个翻译程序称为编译程序。若源语言是汇编语言,而目标语言是机器语言,则这样的一个翻译程序称为汇编程序。
2. 什么是透明性?透明是指什么都能看见吗?
在计算机领域中,站在某类用户的角度,若感觉不到某个事物或属性的存在,即“看”不到某个事物或属性,则称为“对该用户而言,某个事物或属性是透明的”。这与日常生活中的“透明”概念(公开、看得见)正好相反。
例如,对于高级语言程序员来说,浮点数格式、乘法指令等这些指令的格式、数据如何在运算器中运算等都是透明的;而对于机器语言或汇编语言程序员来说,指令的格式、机器结构、数据格式等则不是透明的。
在CPU中,IR、MAR和MDR对各类程序员都是透明的。
3. 字、字长、机器字长、指令字长、存储字长的区别与联系是什么?
- 字:(Word)代表计算机处理指令或数据的二进制数位数,用来表示被处理信息的单位,用于度量数据类型的宽度,例如 x86 机器中将一个字长定义为 16 位。
- 字长:是指 CPU 的数据总线一次能同时处理数据的二进制位数,也就是数据总线的宽度。
- 机器字长:计算机能直接处理的二进制数据的位数,机器字长一般等于内部寄存器的大小,它决定了计算机的运算精度。
- 指令字长:一个指令字中包含的二进制代码的位数。
- 存储字长:一个存储单元存储的二进制代码的长度。等于MDR的位数, 它们都必须是字节的整数倍。
指令字长一般取存储字长的整数倍,若指令字长等于存储字长的2倍,则需要2次访存来取出一条指令,因此取指周期为机器周期的2倍;若指令字长等于存储字长,则取指周期等于机器周期。
早期的计算机存储字长一般和机器的指令字长与数据字长相等,因此访问一次主存便可取出一条指令或一个数据。随着计算机的发展,指令字长可变,数据字长也可变,但它们必须都是字节的整数倍。
注:数据字长是指数据总线一次能传送信息的位数,它可以不等于MDR的位数(就是一个数据可以在半次传送完成,反之多次完成自然也是可以的)。
4. 计算机体系结构和计算机组成的区别和联系是什么?
计算机体系结构是指机器语言或汇编语言程序员所看得到的传统机器的属性,包括指令集、数据类型、存储器寻址技术等,大都属于抽象的属性。
计算机组成是指如何实现计算机体系结构所体现的属性,它包含对许多对程序员来说透明的硬件细节。例如,指令系统属于结构的问题,但指令的实现即如何取指令、分析指令、取操作数如何运算等都属于组成的问题。因此,当两台机器指令系统相同时,只能认为它们具有相同的结构,至于这两台机器如何实现其指令,完全可以不同,即可以认为它们的组成方式是不同的。例如,一台机器是否具备乘法指令是一个结构的问题,但实现乘法指令采用什么方式则是一个组成的问题。(简言之,看有没有这个属性,就是结构问题;看怎么实现,就是组成问题)许多计算机厂商提供一系列体系结构相同的计算机,而它们的组成却有相当大的差别,即使是同一系列的不同型号机器,其性能和价格差异也很大。
5. 基准程序执行得越快说明机器的性能越好吗?
一般情况下,基准测试程序能够反映机器性能的好坏。但是,由于基准程序中的语句存在频度的差异,因此运行结果并不能完全说明问题。
二、 数据的表示和运算
2.1 数制和编码
就还蛮简单的,没什么好说的(但是是一定要掌握的)。
注:
- BCD码(Binary-Code Decimal码):用四位二进制的数表示一个十进制的数(会有冗余,因为BCD码只是为了表示0~9所以1010~1111是无效的。)
- 计算机的有符号整数都是用补码表示的。
- 移码其实就是补码的符号位取反
原码、补码、反码和移码大小的判断
- 原码、补码、反码的符号位相同,正数的机器码相同。
- 原码反码的表示在数轴上是对称,二者都存在+0和-0两个0。
- 补码、移码的表示在数轴上不对称,零的表示唯一,它们比原码、反码多表示一个数。
- 负数的补码、反码末位相差1.
- 整数的补码、移码的符号位相反,数值位相同。
- 原码很容易判断大小。而负数的补码、反码很难直接判断大小,可采用如下规则快速判断:对于负数,数值位越小,其绝对值越大,即负得越多。
C语言中的整数类型和类型转换
1、C语言中整形数据类型
C语言中的整形数据就是定点整数,根据位数的不同,可以分为
- 字符型:(char,8位)整型数据中比较特殊的一种,其他如short/int/long等不指定signed/unsigned是都默认是有符号整数,但char默认无符号整数
- 短整型:(short or short int,64位)
- 整型:(int,32位)
- 长整型:(long or long int,在32位的机器中为32位,在64位的机器中为64位)
注:signed/unsigned 整型数据都是按补码形式存储的,只是 signed 型的最高位表示符号位,而在 unsigned 型中表示数值位,因此两者所表示的数据范围也有所不同。
2、有符号数和无符号数的转换
强制类型转换的结果是保持位值不变,仅改变了解释这些位的方式。
注:若同时有无符号数和有符号数参与运算,则C语言标准规定按无符号数进行运算。
3、不同字长整数之间的转换
- 大字长向小字长变量强制转换时,系统把多余的高位部分直接截断,低位直接赋值(因此这也是保持位值得处理方法之一)
- 大字长向小字长变量强制转换时,不仅要保证相应的位值相等,还要对高位部分进行拓展。
- 若原数字是无符号数,则进行零扩展(高位部分用0填充)。
- 否则进行符号拓展(高位用原符号位填充)
2.2 运算方法和运算电路
2.2.2 定点数的移位运算
逻辑移位:补0(无符号)
算术移位:左0右符号(补码)
- 若移出的高位不同于移位后的符号位,则溢出;
- 若溢出的低位是1,则影响精度。
注:无符号数逻辑左移时,若高位移出的是1,则产生移出。
计算机中的有符号整数都是用补码表示的
2.2.3 定点数的加减运算
其实就是补码之间的加减运算
判断是否溢出(这个还是蛮重要的,这里不过多赘述)
注:
- 运算器本身是无法识别所处理的二进制串是有符号数还是无符号数。是通过标志性息来区别有符号整数运算结果和无符号整数运算结果的。
- 模4补码在存储时只需要一个符号位(因为不管对于正数还是负数,两个符号位其实都是一样的)
2.2.4 定点数的乘除运算
1、乘法
2、除法
- 基本原理:一个2n位的数除以一个n位的数,得到一个n位的商,因此需要对被除数进行拓展。
- 对于定点正小数(即原码小数),只需要在被除数的低位添n个0即可。
- 对于定点正整数(即无符号数),只需要在被除数的高位添n个0即可。
- 做整数除法时,若除数为0,则发生“除数为0”异常,此时需要调出操作系统相应的异常处理程序进行处理。
1)手算除法:就和我们小时候学的一样一样,就是多了一点点规定(首先商的符号单独计算,余数不动低位补0减去右移一位的除数。)
2.3 浮点数的表示与运算
2.3.1 浮点数的表示
表示格式:
- S:取值为0 or 1,用来决定浮点数的符号
- M:是一个二进制定点小数,称为尾数(一般用定点原码小数表示)
- E:是一个二进制定点整数,称为阶码或指数,用移码表示
- R:是基数(隐含),可以约定为2,4,16等
浮点数的表示范围:
原码是关于原点对称的,故浮点数的范围也是关于原点对称的。
- 运算结果大于最大整数时称为正上溢,小于绝对值最大负数是称为负上溢,这两者统称为上溢。(数据一旦产生上溢,必须马上中断运算操作,进行溢出处理);
- 当运算结果在0至最小正数之间时称之为正下溢,在0至绝对值最小负数之间时称为负下溢,这两者通称为下溢。(数据下溢时,浮点数值趋于零,计算机将其当做机器零处理)
注:尾数溢出可能是假溢出也可能是真溢出。
浮点数的规格化:
为了在浮点数运算过程中尽可能多地保留有效数字的位数,使有效数字尽量占满尾数位数。必须在运算过程中对浮点数进行规格化操作。所谓规格化操作,是指通过调整一个非规格化浮点数的尾数和阶码的大小,使非零浮点数在尾数的最高数位上保证是一个有效值。
- 左规:当浮点数运算的结果为非规格化时要进行规格化处理, 将尾数左移一位,阶码减1(基数为2时)。
- 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时, 将尾数右移一位,阶码加1(基数为2时)。
- 规格化浮点数的尾数M的绝对值应满足:1/r≤|M|≤1(如果r=2,则有1/2≤|M|≤1)
- 原码规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。 尾数的表示范围为1/2≤M≤(1−2 −n )。
- 负数为1.1××…×的形式,其最大值表示为1.10…0;最小值表示为1.11…1。 尾数的表示范围为−(1−2 −n )≤M≤−1/2。
- 补码规格化:
- 正数为0.1××…×的形式,其最大值表示为0.11…1;最小值表示为0.10…0。 尾数的表示范围为1/2≤M≤(1−2 −n )。
- 负数为1.0××…×的形式,其最大值表示为1.01…1;最小值表示为1.00…0。 尾数的表示范围为−1≤M≤−(1/2+2 −n )。
注:原码0111,补码0110。
在课后题中会遇到一种叫变形补码的,其实就是用两个二进制位来表示数字的符号位,其余与补码相同(无法避免溢出)
IEEE 754标准:
注:
- 18237F、111523FF
- 阶码:常用补码或移码表示
- 尾数:常用原码或补码表示
- 单精度和双精度都采用隐藏尾数最高位的方法,从而使浮点数精度更高。
浮点数的真值:
- 单精度浮点数的真值:
- 双精度浮点数的真值:
IEEE754中阶码全为0或全为1时的特殊意义:
- E=0且M=0,则真值为0
- E=0且M≠0,为非规格化数,真值 = (−1) ^s×0.M×2^−126
- 1≤E≤254时,真值 = (−1) ^s×1.M×2 E^−127
- E=255且M≠0时,真值为‘NaN’(非数值)
- E=255且M=0时,真值为正无穷或负无穷(看符号位)
2.3.2 浮点数的加减运算
运算步骤:
- 对阶
- 尾数加减
- 规格化
- 舍入
- 判断溢出
浮点数的加减运算-舍入
- “0”舍“1”入法(就近舍入):类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1, 则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
- 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”, 都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
- 正向舍入法:朝数轴正无穷方向舍入,即取右边最近的可表示数。
- 负向舍入法:朝数轴负无穷方向舍入,即取左边最近的可表示数。
- 截断法:直接截取所需要的位数,丢弃后面的所有位。
注:
- 左规一次相当于乘以2,右规一次相当于除以2;
- 需要右规时,只需进行一次。
- 浮点数舍入只有两种情况:对阶、右规格化(且舍入不一定会产生误差(11.00->11.0))
2.3.3 C语言中的浮点数类型
不同类型数的混合运算,遵循的原则是“类型提升”(低的向高的转换不会丢精度也不会溢出)这些转换都是系统自动进行的,被称之为隐式类型转换。
注:一般都是32位。
2.3.4 数据的大小端和对齐存储
大小端:
在存储数据时,数据从低位到高位可以按左到右排列,也可以按从右到左排列。因此无法简单的用最左(右)来表示数据的最高(低)位,通常用最低有效字节(LSB)和最高有效字节(MSB)来分别表示数据的低位和高位。
- 大端方式:先存储高位字节,后存储低位字节。(字节中的字节顺序与原序列的相同)
- 小端方式:先存储低位字节,后存储高位字节。(字节中的字节顺序与原序列的相反)
对齐存储:
数据按边界对齐方式存放要求其存储地址是自身大小的整数倍,半字地址一定是2的整数倍,字地址一定是4的整数倍(这样无论所取的数据是字节、半字还是字,均可以一次访存取出)
注:在C语言的struct中“边界对齐”有两个重要要求
- 每个成员按照其类型的大小对齐
- struct的长度必须是成员中最大对齐值的整数倍(不够就补空字节)
2.4 本章小结
1、在计算机中,为什么要采用二进制来表示数据?
从可行性来说,采用二进制,只有0和1两个状态,能够表示0、1两种状态的电子器件很多,如开关的接通和断开、晶体管的导通和截止、磁元件的正负剩磁、电位电平的高与低等,都可表示0、1两个数码。使用二进制,电子器件具有实现的可行性。
从运算的简易性来说,二进制数的运算法则少,运算简单,使计算机运算器的硬件结构大大简化(十进制的乘法九九口诀表有55条公式,而二进制乘法只有4条规则)从逻辑上来说,由于二进制0和1正好和逻辑代数的假( false)和真(true)相对应,有逻辑代数的理论基础,用二进制表示二值逻辑很自然。
2、计算机在字长足够的情况下能够精确地表示每个数吗?若不能,请举例说明。
计算机采用二进制来表示数据,在字长足够时,可以表示任何一个整数。而二进制表示小数时只能够用1/(2^n)的和的任意组合表示,即使字长很长,也不可能精确表示出所有小数,只能无限逼近。(例如0.1就无法用二进制精确地表示。)
3、字长相同的情况下,浮点数和定点数的表示范围与精度有什么区别?
字长相同时,浮点数取字长的一部分作为阶码,所以表示范围比定点数要大,而取一部分作为阶码也就代表着尾数部位的有效位数减少,而定点数字长的全部位都用来表示数值本身,精度要比同字长的浮点数更大。
4、用移码表示浮点数的阶码有什么好处?
移码的两个好处:
- 浮点数进行加减运算时,时常要比较阶码的大小,相对于原码和补码,移码比较大小更方便。
- 检验移码的特殊值(0和max)时比较容易。阶码以移码编码时的特殊值如下。
- 0:表示指数为负无穷大,相当于分数分母无穷大,整个数无穷接近0,在尾数也为0时可用来表示0;尾数不为0,则表示未正规化的数。
- max:表示指数正无穷大,若尾数为0;则表示浮点数超出表示范围(正负无穷大);尾数不为0,则表示浮点数运算错误。
2.5 常见问题和易混淆知识点
1、如何表示一个数值数据?计算机中的数值数据都是二进制数吗?
在计算机内部,数值数据的表示方法有以下两大类。
- 直接用二进制数表示。分为无符号数和有符号数,有符号数又分为定点数表示和浮点数表示。无符号数用来表示无符号整数(如地址等信息);定点数用来表示整数;浮点数用来表示实数。
- 二进制编码的十进制数,一般都采用8421码(也称NBCD码)来表示,用来表示整数。所以,计算机中的数值数据虽然都用二进制来编码表示,但不全是二进制数,也有用十进制数表示的。后面一章有关指令类型的内容中,就有对应的二进制加法指令和十进制加法指令。
2、什么称为无符号整数的“溢出”?
对于无符号定点整数来说,若寄存器位数不够,则计算机运算过程中一般保留低n位,舍弃高位,这样,会产生以下两种结果。
- 保留的低m位数不能正确的表示运算结果。在这种情况下,意味着运算的结果超出了计算机所能表达的范围,有效数值进到了第n+1位,称此时发生了“溢出”现象。
- 保留的低n位数能够正确表达计算结果,即高位的舍去并不影响其运算结果。
3、如何判断一个浮点数是否是规格化数?
为了使浮点数能尽量多地表示有效位数,一般要求运算结果用规格化数形式表示。
“规格化浮点数的尾数小数点后的第一位一定是个非零数。因此,对于原码编码的尾数来说,只要看尾数的第一位是否为1就行:对于补码表示的尾数,只要看符号位和尾数最高位是否相反。需要注意的是,IEEE754标准的浮点数尾数是用原码编码的。
4、对于位数相同的定点数和浮点数,可表示的浮点数个数比定点数个数多吗?
不是,可表示的数据个数取决于编码所采用的位数。编码位数一定,编码出来的数据个数就是一定的。m位编码只能表示2m个数,所以对于相同位数的定点数和浮点数来说,可表示的数据个数应该一样多(有时可能由于一个值有两个或多个编码对应,编码个数会有少量差异)。
5、现代计算机中是否要考虑原码加减运算?如何实现?
因为现代计算机中浮点数采用IEEE754标准,所以在进行两个浮点数的加减运算时,必须考虑原码的加减运算,因为IEEE754规定浮点数的尾数都用原码表示。
原码的加减运算可以有以下两种实现方式
- 转换为补码后,用补码加减法实现,结果再转换为原码。
- 直接用原码进行加减运算,符号和数值部分分开进行(具体过程见原码加减运算部分)。
三、存储系统
3.1 存储器概述
3.1.1 存储器的分类
- 按在计算机中的作用(层次)分类
- 主存储器:简称主存。(也称为内存和内存储器)CPU可以直接随机地对其进行访问,也可以和高速缓存器及辅助存储器交换数据。
- 辅助存储器:简称辅存,(也称为外存储器和外存),不能与CPU直接相连,用来存放当前暂时不用的程序和数据,以及一些需要永久保留的信息。
- 高速缓冲存储器:简称Cache,位于主存和CPU之间,用来存放正在执行的程序段和数据(当前CPU经常使用的指令和数据),以便于CPU能够高速地访问它们。
- 按存储介质分类
- 磁表面存储器(磁盘,磁带)
- 磁芯存储器
- 半导体存储器(MOS型存储器,双极存储器)
- 光存储器(光盘)。
- 按存取方式分类
- 随机存储器(RAM,Random Access Memory):存储器的任何一个存储单元的内容都可以随机存取,而且存取时间与存取单元的物理位置无关,主要用作主存或高速缓冲存储器。
- 只读存储器(ROM,Read Only Memory):存储器的内容只能随机读出而不能写入。即使断电,内容也不会丢失。
- 串行访问存储器:对存储单元进行读/写操作时,需按其物理位置的先后顺序寻址,包括顺序存取存储器(如磁带)与直接存取存储器(如磁盘)。
- 顺序存取存储器的内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关,特点就是存取速度慢。
- 直接存取存储器既不像RAM那样随机地访问任何一个存储单元,又不像顺序存储那样完全按照顺序存取,而是介于两者之间。存取信息时通常先寻找整个存储器中的某个小区域(如磁盘上的磁道),再在小区域内顺序查找。
- 按信息的可保存性分类
- 易失性存储器:断电后,存储信息即消失的存储器,称为易失性存储器,如RAM。
- 非易失性存储器:断电后信息仍然保持的存储器,称为非易失性存储器,如ROM,磁表面存储器和光存储器。
- 破坏性读出:若某个存储单元所存储的信息被读出时,原存储信息被破坏,则称为破坏性读出,如DRAM芯片。
- 非破坏性读出:若读出时,被读单元原存储信息不被破坏,则称为非破坏性读出。具有破坏性读出性能的存储器,每次读出操作后,必须紧接一个再生的操作,以便恢复被破坏的信息。如SRAM芯片、磁盘。
3.1.2 存储器的性能指标
存储器中有三个主要的性能指标,即存储容量、单位成本和存储速度。三者相互制约。
- 存储容量:= 存储字数 * 字长
- 单位成本:每位价格 = 总成本 / 总容量
- 存储速度:数据传输率(每秒传送信息的位数,主存带宽) = 数据的宽度 / 存储周期
- 存取时间(Ta):存取时间时指从启动一次存储器操作到完成该操作所经历的时间,分为读出时间和写入时间。
- 存取周期(Tm):它是指存储器进行一次完整的读写操作所需的全部时间,即连续两次独立访问存储器操作(读或写操作)之间所需的最小时间间隔。
- 主存带宽(Bm):主存带宽又称数据传输率,表示每秒从主存进出信息的最大数量,单位为字/秒,字节/秒
注:存取时间不等于存储周期,通常存储周期大于存取时间。因为任何一种存储器,在读/写操作之后,总要有一段恢复内部状态的复原时间。对于破坏性读出的存储器,存取周期往往比存取时间大得多,甚至可以达到Tm=2Ta,因为存储器中的信息读出后需要马上进行再生。
3.1.3 多级层次的存储系统
注:
- Cache和主存是能够被CPU直接读写的;
- 主存——辅存:实现了虚拟存储系统,解决了主存容量不够的问题;(数据调动是由硬件和操作系统共同完成的,对应用程序员是透明的。)
- Cache——主存:解决了主存与CPU速度不匹配的问题。(数据调动是由硬件自动完成的,对所有程序员都是透明的。)
3.2 主存储器
3.2.1 SRAM芯片和DRAM芯片
半导体存储器分为随机存储器(RAM)和只读存储器(ROM)。
RAM又分为静态随机存储器(SRAM)和动态随机存储器(DRAM),主存储器主要是由DRAM实现,靠近处理器的那一层(Cache)则由SRAM实现,它们都是易失性存储器。ROM是非易失性存储器。
- SRAM:双稳态触发器(六晶体管MOS)存储速度快,但集成度低,功耗较大,价格昂贵,一般用于Cache。
- DRAM:栅极电容。与SRAM相反,且必须定时刷新和读后再生,一般用于大容量的主存系统。
DRAM电容上的电容一般只能维持1~2ms(刷新周期),因此即使电源不断电,信息也会自动消失。
常见的3种刷新方式:
- 集中刷新:在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新(用专门的时间进行全部刷新)
- 优点:读写操作期间不受刷新操作的影响;
- 缺点:在集中刷新期间(死区)不能访问存储器。
- 分散刷新:是指对每行存储单元的刷新分散到每个存储周期内完成(对某一行某芯片进行读写操作后,紧接着刷新 包含在了读写周期内)
- 优点:没有死区;
- 缺点:加长了系统的存取周期
- 异步刷新:前两种方式的结合,缩短了死时间,充分利用了最大刷新间隔为2ms的特点(只要在2ms内对这一行刷新一遍就行)
注:在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读/写操作,称为死时间(访问死区)。
DRAM的刷新主要注意的问题:
- 刷新对CPU是透明的,即刷新不依赖于外部的访问;
- 刷新单位是行,由芯片内部自行生成行地址;
- 刷新和再生虽然都是恢复数据,但又有所不同。在其过程中,刷新是以行为单位,逐行恢复数据的,而再生仅需恢复被读出的那些单元的数据。
SRAM和DRAM的比较:
3.2.2 只读存储器
注:Flash是EEPROM的进一步发展,可读可写,但是仍然有缺陷,在写入时必须先擦除原有数据,所以写速度要比读速度慢(写比读慢)。
3.2.3 主存储器的基本组成
MM = RAM + ROM(BIOS)
- MAR的位数与地址线的位数相同;
- MDR的位数与数据线的位数相同。
- DRAM芯片的容量较大,地址位数较多,为了减少芯片的地址引脚数,通常采用地址引脚复用技术,行地址和列地址通过相同的引脚分别先后两次输入,这样地址引脚数可减少一半。
- DRAM芯片行、列数的优化原则:
- 2^n = r * c (r<=c)
- 且 |r-c| 要最小
注:因为主存中既有RAM又有ROM,所以它们两个是可以统一编址的。
3.2.4 多模块存储器
双端口(不考):
- 支持两个CPU同时访问RAM
- 可以同时读/写不同的存储单元;
- 可以同时读一个存储单元;
- 不能同时写(或一读一写)同一个单元
- 若发生“冲突”,则发出“BUSY”信号,其中一个CPU的访问端口暂时关闭
高位交叉编址(顺序方式):
理论上多个存储体可以被并行访问,但是由于通常会连续访问,故实际效果相当于单纯的扩容。
t = n * T
低位交叉编址(交叉方式):
- 当存储模块数m>=T/r时,可使流水线不间断;
- 每个存储周期内可读写地址连续的m个字;
- 微观上,m个模块被串行访问;宏观上,每个存取周期内的所有模块被并行访问。
t1 = T + (m-1)* r
注:多模块存储器之所以能够提高存储器的访问速度,是因为各模块有独立的读/写电路。
3.3 主存储器与CPU的连接
3.3.1 连接原理
- 主存储器通过数据总线、地址总线和控制总线与CPU连接。
- 数据总线的位数与工作频率的乘积正比于数据传输速率。
- 地址总线的位数决定了可寻址的最大内存空间。
- 控制总线(读/写)指出总线周期的类型和本次输入/输出操作完成的时刻。
单个芯片的容量是有限的,因此通过存储器芯片扩展技术,将多个芯片集成在一个内存条上然后由多个内存条及主板上的ROM芯片组成计算机所需的主存空间,再通过总线与CPU相连。
3.3.2 主存容量的扩展
1. 位扩展
是指对字长进行扩展(增加存储字长)。当CPU的系统数据线数多于存储芯片的数据位数时,必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。
位扩展的连接方式:
- 各芯片的地址线、片选线和读/写控制线与系统总线相应并联;
- 各芯片数据线单独引出,分别连接系统数据线;
- 各芯片同时工作。
2. 字扩展
是指对存储字的数量进行扩展,而存储字的位数满足系统要求。系统数据线位数等于芯片数据线位数,系统地址线位数多于芯片地址线位数。
字扩展的连接方式:
- 各芯片的地址线与系统地址线的低位对应相连;
- 芯片的数据线和读/写控制线与系统总线相应并联;
- 由系统地址线的高位译码得到各芯片的片选信号;
- 各芯片分时工作。
3. 字位扩展
3.3.3 存储芯片的地址分配和片选
3.4 外部存储器
3.4.1 磁盘存储器
磁盘存储器是以磁盘位存储介质的存储器。
优点:
- 存储容量大,位价格低;
- 记录介质可重复使用;
- 记录可长期保存而不丢失,甚至可脱机存档;
- 非破坏性读出,读出时不需要再生。
缺点:
- 存取速度慢;
- 机械结构复杂;
- 对工作环境要求高。(强磁场的情况就无法使用)
磁盘设备的组成:由磁盘驱动器、磁盘控制器和盘片组成。
- 磁盘驱动器:驱动磁盘转动并在盘面上通过磁头进行读写操作的装置。
- 磁盘控制器:磁盘驱动器与主机的接口,负责接收并解释CPU发来的命令,向磁盘驱动器发出各种信号,并负责检测磁盘驱动器的状态。(IDE、SCSI、SATA)
存储区域:一个磁盘含有若干记录面,每个记录面划分为若干圆形的磁道,而每条磁道 又划分为若干扇区,扇区(也称为块)是磁盘读/写的最小单位,即磁盘按块存取。
- 磁头数(Heads):即记录面数,表示磁道共有多少磁头,而磁头用于读取/写入盘片上记录面的信息,一个记录面对应一个磁头。
- 柱面数(Cylinders):表示磁盘共有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
- 扇区数(Sectors):表示每条磁道上有多少个扇区。
注:相邻磁道即相邻扇区间通过一定的间隙分隔开,以避免精度错误。由于扇区按照固定圆心角度划分,因此位密度从最外道向里道增加,磁盘的存储能力受限于最内道的最大记录密度。
磁盘高速缓存(Disk Cache):在内存中开辟一部分区域,用于缓冲将被送到磁盘上的数据。
优点:
- 写磁盘时是按”簇“进行的,可以避免频繁地用小块数据写盘;
- 有些中间结果数据在写回磁盘之前可被快速地再次使用。
磁记录原理:磁头与磁性记录介质相对运动时,通过电磁转换完成读/写操作。
编码方法:按照某种方案(规律),把一连串的二进制信息变换成存储介质磁层中一个磁化翻转状态的序列,并使读/写控制电路容易、可靠地实现转换。
磁记录方式:通常采用调频制(FM)和改进型调频制(MFM)的记录方式。
磁盘的性能指标:
- 磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。
- 非格式化容量:是指磁记录表面可以利用的磁化单元总数。
- 格式化容量:是指按照某种特定的记录格式所能存储信息的总量。
- 记录密度:记录密度是指盘片单位面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示。
- 道密度:是沿磁盘半径方向单位长度上的磁道数;
- 位密度:是磁道单位长度上能记录的二进制代码位数;
- 面密度:是位密度和道密度的乘积。
- 平均存取时间:
平均存取时间 = 寻道时间(磁头移动到目的磁道)+ 旋转延迟时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间)- 数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。假设磁盘转数为r(转/秒),每条磁道容量为N个字节, 则数据传输率 D=r*N
注:
- 在磁盘的格式化过程中,要对磁盘划分扇区,每个扇区要写入一些控制信息,扇区尾部还要留有一定的空隙,因此格式化后的实际容量比非格式化的容量要小。
- 磁盘所有磁道记录的信息量一定是相等的,并不是圆越大信息越多,所以每个磁道的位密度都是不一样的。
- 因为寻道和找扇区的距离远近不一,所以寻道时间和旋转延迟时间通常取平均值(平均寻道时间从最外道移动到最内道时间的一半,平均旋转时间取旋转半周的时间)
磁盘地址:
磁盘的工作过程:
磁盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,磁盘工作时,第一步是取控制字,第二步是执行控制字。(磁盘属于机械师部件,其读/写操作是串行的)
磁盘阵列:
相互独立磁盘 构成的具有冗余能力的阵列(所谓冗余,原意指重复,在计算机科学中称为备份)
也就是说:磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,这些磁盘可以共同使用,来提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
- RAID0:无冗余和无校验的磁盘阵列
- RAID1:镜像磁盘阵列。(存两份数据)
- RAID2:采用纠错的海明码的磁盘阵列。
- RAID3:位交叉奇偶校验的磁盘阵列
- RAID4:块交叉奇偶校验的磁盘阵列
- RAID5:无独立校验的奇偶校验磁盘阵列
3.4.2 固态硬盘
注:
- 是以页为单位读/写(相当于磁盘的“扇区”)but擦除的话是以“块(block)”为单位。而且读快、写慢。
- SSD的全称是Solid State Drive。
- 按批处理方式进行一个数据块的读/写。
3.5 高速缓冲存储器
Cache被集成在CPU内部,用SRAM实现,速度快、成本高。
注:CPU->Cache Word Cache->CPU Block
3.5.1 程序访问的局部性原理
- 时间局部性:是指一个内存空间被重复引用。(在不同的时间中被重复使用)
- 空间局部性:是指若一个内存位置被引用,则它附近的位置也很快会被引用。
注:指令通常是顺序存放的、顺序执行的,数据一般也是以向量、数组等形式簇聚地存储的。
3.5.2 Cache的基本工作原理
命中率H:
H = Nc / ( Nc + Nm )
Cache-主存系统的平均访问时间Ta:
Ta = H * tc + ( 1 - H ) * tm or Ta = H * tc + ( 1 - H ) * ( tm + tc )
- Nc:Cache的总命中次数
- Nm:访问主存的总次数
- tc:命中时的Cache访问时间
- tm:未命中时的Cache访问时间(命中主存时的访问时间)
注:第二个公式在计算未命中时的总延迟时,将主存访问时间(𝑡𝑚tm)和缓存访问时间(𝑡𝑐tc)相加,然后乘以未命中的概率。这种计算方式考虑了在缓存未命中时,CPU不仅要等待数据从主存加载,还要等待数据从缓存加载到CPU的额外时间。
3.5.3 Cache和主存的映射方式
由于Cache的行数要比主存中块数少得多,因此主存中只有一部分的信息可以放在Cache中,因此在Cache中要为每一块加一个标志位,指明它是主存中的哪一块。该标记的内容相当于主存中块的编号。
为了说明Cache行中的信息是否有效,每个Cache行需要一个有效位。
注:会多有效位和标志位。
1. 直接映射
主存中的每一块只能装入Cache中的唯一位置。若这个位置已经有内容,则会产生块冲突,原来的块将会无条件被替换出去(无须使用置换算法)。实现起来很简单,但是不够灵活,即使Cache的其他许多地址空着也无法占用,这使得直接映射的块冲突概率最高,空间利用率最低。
2. 全相联映射
主存中的每一块可以装入Cache中的任何位置。每行的标记用于指出该行来自主存的哪一块,因此CPU访存时需要与所有的Cache行的标记进行比较。
优点:
- Cache块的冲突概率较低,只要有空闲Cache行,就不会发生冲突;
- 空间利用率高;
- 命中率高。
缺点:
- 标记的比较速度比较慢;
- 实现成本较高,通常需要采用按内容寻址的相联寄存器。
注:可别忘记还有一个有效位!!
3. 级相联映射
将Cache分成Q个大小相等的组,每个主存块可以装入固定组中的任意一行,即组间采用直接映射、而组内采用的是全相联映射。(折中方法)
- 当Q=1时变为全相联映射
- 当Q=Cache行数时变为直接映射
3.5.4 Cache中主存块的替换算法
只有在采用全相联或组相联映射方式时,可能需要考虑替换。
1. 随机算法
2. 先进先出算法
3. 近期最少使用算法
LRU算法一一基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,cache命中率高。
若被频繁访问的主存块数量>行的数量,则有可能发生“抖动”。
注:手算模拟的时候倒是不需要这样。
4. 最不经常使用算法
3.5.5 Cache的一致性问题
1. 写命中
写回法:(也有可能被叫做回写法)
全写法:(也被称为写直通法)
2. 写不命中
写分配法:
非写分配法:
多级Cache
随着指令流水技术的发展,需要将指令Cache和数据Cache分开设计,这就有了分离的Cache结构、
注:为什么各级缓存之间使用全写法加非写分配法,而缓存与主存之间使用写回法加写分配法,原因可能包括:
-
性能:全写法确保了数据的一致性,但可能会降低写操作的性能。在缓存层次结构中,较低级别的缓存使用全写法可以减少数据不一致的风险。写回法可以提高写操作的性能,因为它减少了对主存的写入次数。
-
一致性:在多级缓存系统中,较低级别的缓存通常需要保证数据的一致性。全写法可以确保数据在缓存和主存之间保持一致。而在缓存与主存之间,写回法允许缓存数据在写入主存之前进行合并,减少写入操作。
-
复杂性:非写分配法在写命中时不加载数据到缓存中,这简化了缓存的实现。写分配法则增加了缓存的复杂性,但它可以提高缓存的效率,因为它允许缓存在写操作时动态地加载数据。
-
缓存容量:较高级别的缓存通常容量较小,使用写回法可以减少对缓存空间的占用。写分配法则可以在需要时动态地将数据加载到缓存中,提高缓存的利用率。
-
系统设计:不同的系统设计可能会根据其特定的需求和性能目标选择不同的缓存策略。
3.6 虚拟存储器
计算机组成原理本质上就是超级套娃,这章节的内容就和上一节很像。
主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。
因为缺页(或段)而访问辅存的代价很大,提高命中率才是最重要的,故采用全相联映射。此外,当进行写操作时,采用回写法(写回法)。
3.6.1 虚拟存储器的基本概念
虚拟存储器将主存或辅存的地址空间统一编址,形成了一个庞大的地址空间,在这个空间内,用户可以自由编程,而不必在意实际的存储容量和程序在主存中实际的存放位置。(虚拟存储器的实际容量小于或等于主存和辅存的容量之和。)
- 虚地址(逻辑地址):用户编程(应用程序员)允许涉及的地址,对应的存储空间被称为虚拟空间或程序空间。
- 虚地址 = 虚拟页号 +页块内地址
- 实地址(物理地址):实际的主存单元,对应的是主存地址空间。
- 实地址 = 主存页号 +页块内地址
- 辅存地址 = 磁盘号 + 盘面号 + 磁道号 + 扇区号
3.6.2 页式虚拟存储器
页表:
页式虚拟存储器以页为基本单位。主存空间和虚拟地址空间都被划分成相同大小的页。
- 物理页(实页、页框):主存空间中的页。
- 虚拟页(虚页):虚拟地址空间的页。
页表记录了程序的虚页调入主存时被安排在主存中的位置。(一般会长久地保存在内存中)
- 优点:页面的长度固定,页表简单,调入方便;
- 缺点:容易造成浪费,并且页不是逻辑上独立的实体,所以处理、保护和共享都不及段式虚拟存储器方便。
注:因为页大小为1KB,又有4个页,所以高2位为逻辑页号(相同则在一个页内),虚拟地址和物理地址的最低10位会完全相同。
- 有效位(装入位):用来表示对应页面是否在主存。(缺页异常的判断依据)
- 脏位(修改位):用来表示页面是否被修改过(回写法)。
- 引用位(使用位):用来配合替换策略进行设置。
地址转换:
在虚拟存储系统中,指令给出的地址是虚拟地址,因此当CPU执行指令时,要先将虚拟地址转换为主存物理地址,才能到主存中存取指令和数据。
- 虚拟地址分为两个字段:高位为虚页号,低位为页内偏移地址。
- 物理地址也分为两个字段: 高位为物理页号,低位为页内偏移地址。
快表:
依据程序访问的局部性原理,在一段时间内总是经常访问某些页时,若把这些页对应的页表项存放在快表(Cache组成,用SRAM实现,通常采用全相联或组相联)中,则可以明显提高效率。相应地把放在主存中的页表称之为慢表(Page)。在地址转换时,首先查找快表,若命中,则无需访问主存中的页表。
注:
- Cache不命中,不能说明所需内容未调入主存,和TLB、Page的命中与否没有联系。但若TLB命中,Page也必然命中;而当Page命中,TLB则未必命中。
- Cache命中,则说明所需内容一定在主存中,因此Page一定命中,而TLB则未必。
3.6.3 段式虚拟存储器
段表的每行记录与某个段对应的段号、装入位、段起点和段长等信息。因为段的长度可变,所以段表中要给出各段的起始地址与段的长度。
注:因为段本身是程序的逻辑结构所决定的一些独立部分,因而分段对于程序员来说是不透明的,而分页是透明的(注意区分记忆),程序员编写程序时不需知道程序将如何分页。
- 优点:具有逻辑独立性,故易于编译、管理、修改和保护,也便于多道程序的共享;
- 缺点:因为段长度可变,分配空间不便,容易在段间留下碎片,不好利用,造成浪费。
3.6.4 段页式虚拟存储器
3.6.5 虚拟存储器与Cache的比较
1.相同之处
1、最终目标都是为了提高系统性能,两者都有容量、速度、价格的梯度。
2、都把数据划分为小信息块,并作为基本的交换单位,虚存系统的信息块更大。
3、都有地址映射、替换算法、更新策略等问题。
4、都依据局部性原理应用“快速缓存”的思想,将活跃的数据放在相对高速的部件中。
2. 不同之处
1、Cache主要解决系统速度,而虚拟存储器却是为了解决主存容量。
2、Cache全由硬件实现,是硬件存储器,对所有程序员透明;
而虚拟存储器由OS和硬件共同实现,是逻辑上的存储器,对系统程序员不透明,但对应用程序员透明。3、对于不命中性能影响,因为CPU的速度约为Cache的10倍,主存的速度为硬盘的100倍以上,因此虚拟存储器系统不命中时对系统性能影响更大。
4、CPU与Cache和主存都建立了直接访问的通路,而辅存与CPU没有直接通路。也就是说在Cache不命中时主存能和CPU直接通信,同时将数据调入Cache;而虚拟存储器系统不命中时,只能先由硬盘调入主存,而不能直接和CPU通信。
3.7 本章小结
1、存储器的层次结构主要体现在何处?为何要分这些层次?计算机如何管理这些层次?
存储器的层次结构主要体现在 Cache-主存和 主存-辅存这两个存储层次上。
Cache-主存层次在存储系统中主要 对CPU访存起加速作用,即从整体运行的效果分析,CPU访存速度加快,接近于 Cache的速度,而寻址空间和位价却接近于主存。
主存-辅存层次在存储系统中主要起扩容作用,即从程序员的角度看,他所使用的存储器的容量和位价接近于辅存,而速度接近于主存。
综合上述两个存储层次的作用,从整个存储系统来看,就达到了速度快、容量大、位价低的优化效果。
主存与 Cache之间的信息调度功能全部由硬件自动完成。而主存与辅存层次的调度目前广泛采用虚拟存储技术实现,即将主存与辅存的一部分通过软/硬结合的技术组成虚拟存储器,程序员可用这个比主存实际空间(物理地址空间)大得多的虚拟地址空间(逻辑地址空间)编程,当程序运行时,再由软/硬件自动配合完成虚拟地址空间与主存实际物理空间的转换。因此,这两个层次上的调度或转换操作对于程序员来说都是透明的。
2、影响Cache性能的因素有哪些?
决定Cache系统访存效率重要因素是命中率,它与很多因素有关。
1、命中率与映射方式有关,全相联映射方式的命中率最高,直接映射方式的命中率最低。
2、命中率与Cache容量有关,显然Cache容量越大,命中率就越高。
3、命中率还与主存块(或Cache行)的大小有关,主存块的大小要适中。
除上述因素外,系统是采用单级还是采用多级Cache,数据Cache和指令Cache是分离还是一起,主存一总线-Cache-CPU之间采用什么架构等,都会影响Cache的总体性能。
3、虚拟存储系统的页面是设置的大一些好还是设置的小一些好?
页面大小要适中。页面太小时,平均页内剩余空间较小,可节省存储空间,但会使得页表增大,页面太小时也不能充分利用空间局部性来提高命中率;页面太大时,可减少页表空间,但平均页内剩余空间较大,会浪费较多存储空间,页面太大还会使页面调入/调出的时间较长。
3.8 常见问题和易混淆知识点
1、Cache行的大小和命中率之间有什么关系?
Cache行的长度较大时,能充分利用程序访问的空间局部性,使一个较大的局部空间被一起调到Cache中,因而可以增加命中机会。
但是,行长也不能太大,主要原因有两个:
- 行长大使失效损失变大。也就是说,若未命中,则需花更多时间从主存读块。
- 行长太大,Cache项数变少,因而命中的可能性变小。Cache行的长度较小时,命中率会很低,但好处是存取块的代价较小。
2、发生取指令Cache缺失的处理过程是什么?
- 程序计数器恢复当前指令的值。
- 对主存进行读的操作。
- 将读入的指令写入Cache中,更改有效位和标记位。
- 重新执行当前指令。
3、Cache总容量与映射方式有何种关系?
Cache总容量 = [ 每个Cache行标记项的容量(有效位、脏位、LRU替换位、标记位)+ Cache行长] x Cache总行数。
其中,有效位和标记位是所有Cache所必需的;脏位只在Cache采用回写法时才需要设置;LRU替换位只在Cache采用LRU替换算法时才需要设置。
有效位:占1位,用于说明Cache行中的数据是否有效。
脏位(修改位):占1位,回写法才需要设置,用以说明Cache行中的数据是否被修改过。
LRU替换位:位数为log2(组内块数),用于LRU替换算法中的访问计数。
标记位Tag:主存地址结构中的标记字段,其位数取决于所用的映射方式,用于匹配Cache行对应主存中的哪个块。
四、指令系统
4.1 指令系统
4.1.1 指令集体系结构
- 机器指令(简称指令):是指示计算机执行某种操作的命令。
- 指令集(指令系统):一台计算机的所有的指令构成该机的指令系统。指令系统是指令集体系结构(ISA)中最核心的部分,ISA完整定义了软件和硬件之间的接口,是机器语言或汇编语言程序员所应熟悉的。
- ISA规定的内容主要包括 ★ ★ ★ ★ ★:
- 指令格式,指令寻址方式,操作类型,以及每种操作对应的操作数的相应规定。
- 操作数的类型,操作数寻址方式,以及是按大端方式还是按小端方式存放。
- 程序可访问的寄存器编号、个数和位数,存储空间的大小和编址方式。
- 指令执行过程的控制方式等,包括程序计数器、条件码定义等。
注:常见的指令集:ARM(Phone)、x86(PC)
4.1.2 指令的基本格式
- 指令字长度:一个指令字中包含二进制代码的位数。
- 机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。(64位操作系统、32位操作系统)。
- 单字长指令:指令字长等于机器字长度的指令。
- 半字长指令:指令字长等于半个机器字长度的指令。
- 双字长指令:指令字长等于两个机器字长度的指令。
- 多字长指令:指令字长等于几个机器字长度的指令。
- 定长指令字结构:在一个指令系统中,所有指令的长度都是相等的。(执行速度快,控制简单)
- 变长指令字结构:在一个指令系统中,各种指令的长度随指令功能而异。
注:使用多字长指令,目的在于提供足够的地址位来解决访问内存任何单元的寻址问题。其主要缺点是必须两次或多次访问内存才能取出一整条指令,降低了的运算速度,又占用了更多的存储空间。
因为主存一般都是按字节编址的,所以指令字长通常为字节的整数倍。
按指令中操作数地址码的数目的不同,可将指令分为以下几种格式。
注:一3二4三4四4(访存次数)
4.1.3 定长操作码指令格式
4.1.4 扩展操作码指令格式
定长指令字结构 + 可变长操作码 = 扩展操作码指令格式
注:在设计扩展操作码指令格式时,必须注意以下两点:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同(对比哈夫曼编码)
- 各指令的操作码一定不能重复。
4.1.5 指令的操作类型
4.2 指令的寻址方式
4.2.1 指令寻址和数据寻址
1、指令寻址
注:PC自增的大小与编址方式,指令字长有关。现代计算机通常是按字节编址的,若指令字长为16位,则PC自增为(PC)+2,若指令字长为32位,则PC自增为(PC)+4。
2、数据寻址
是指如何在指令中表示一个操作数的地址,或怎样计算出操作数的地址。
- A:形式地址,结合寻址方式,可以计算出操作数再存储器中的真实地址。
- EA:有效地址,其实就是真实地址。
4.2.2 常见的寻址方式 (数据寻址)
1. 隐含寻址(ACC)
2. 立即(数)寻址(#)
MOV BX 1234H
3. 直接寻址
MOV BX [1234H]
4. 间接寻址
取操作数的有效地址的地址
5. 寄存器寻址
6. 寄存器间接寻址
偏移寻址
7. 相对寻址
相对于下一条指令的偏移。取出当前指令后,PC指向下一条指令,再以PC作为起点,EA=(PC)+A
A可以看做是所指地址的偏移量,可正可负,通常用补码表示。
为了防止经常挪动代码造成数组元素的存放地址被频繁修改,可以将程序段和数据端分开存放。
8. 基址寻址
9. 变址寻址
程序员自己决定从哪里作为起点,即EA=(IX)+A
IX叫做变址寄存器,同样,也可用通用寄存器作为变址寄存器
变址寄存器是面向用户的,变址寄存器的内容可由用户改变(即改变IX),而形式地址A不变。因此可以看成A作为基地址,IX作为偏移量。
10. 堆栈寻址
注:SP是Stack Pointer
除了硬堆栈之外还有软堆栈,现在一般都采用软堆栈。
4.3 程序的机器级代码表示
其实本节就是考机器语言和汇编语言(x86)
4.3.1 常用汇编指令介绍
1. 相关寄存器
注:x86有8个32位的通用寄存器。为了向后兼容,EAX、EBX、ECX、EDX的高两位字节和低两位字节可以独立使用(E表示Extended,用于表示这是32位的寄存器)EAX的低两位称为AX,而AX的高低字节又可以分为两个8位寄存器,分别称为AH和AL。
2. 汇编指令格式
注:
- 若操作码后面没有直接注明长度,则默认位32bit。
- 由于32或64位体系结构都是由16位扩展而来的,因此用word表示16位。
- 目的操作数不可以是常数。
- x86中不允许两个操作数都来自主存。
AT&T格式指令和Intel格式指令的对比
注:
1、AT&T格式的指令只能用小写字母,而lntel格式的指令对大小写不敏感。
2、在AT&T格式中,第一个为源操作数,第二个为目的操作数,方向从左到右,合乎自然;在Intel格式中,第一个为目的操作数,第二个为源操作数,方向从右向左。
3、在AT&T格式中,寄存器需要加前缀“%”,立即数需要加前缀“$”;在lntel格式中,寄存器和立即数都不需要加前缀。
4、在内存寻址方面,AT&T格式使用“(”和“)”,而lntel格式使用“[”和“]”。
5、在处理复杂寻址方式时,例如AT&T格式的内存操作数“dlsp(base,index,ale)”分别表示偏移量、基址寄存器、变址寄存器和比例因子,如“8(%x,%eax,2)”表示操作数为M[R[edx]+R[eax]*2+8],其对应的lntel格式的操作数为“[edx+eax*2+8]”。
6、在指定数据长度方面,AT&T格式指令操作码的后面紧跟一个字符,表明操作数大小,“b”表示byte(字节)、“w”表示word(字)或“l”表示long(双字)。血el格式也有类似的语法,它在操作码后面显式地注明byteptr、wordptr或dwordptr。
3. 常用指令
注:imul 存在一种三个操作数的情况,但其实也大差不差,只不过是将第二个数和第三个数相乘的结果存在第一个操作数中(那既然是可以存储的,那必然是需要第一个操作数为寄存器)
4.3.2 选择语句的机器级表示
首先选择语句的话是借助jmp和cmp来实现的,我们得先了解下jmp和cmp。
jmp(jcondition)指令:
cmp指令:
cmp指令的本质是减法,将第一个操作数减去第二个操作数,然后根据结果来判断两者之间的关系。
4.3.3 循环语句的机器级表示
循环语句除了可以使用jmp指令来实现外,还有一个loop指令专门用于循环的实现。不过要注意的是loop一定是和cx连用的。
4.3.4 过程调用的机器级表示
call、ret指令:
函数调用栈在内存中的位置(倒置):
访问帧栈数据:pop、push指令:
函数调用时,如何切换栈帧?(enter、push ebp mov ebp,esp)
函数返回时,如何切换栈帧?(leave、mov esp,ebp pop ebp)
一个栈帧内可能包含哪些内容?
注:GCC编译器将每个栈帧大小设置为16B的整数倍(当前函数的栈帧除外),因此栈帧可能出现空闲未使用的区域。
总结!
4.4 CISC和RISC的基本概念
CISC
- 设计原因:随着VLSI技术的发展,硬件成本不断下降,软件成本不断上升,促使人们在指令系统中增加更多、更复杂的指令,以适应不同的应用领域,这样就构成了复杂指令系统计算机(CISC)
- 特点:
- 指令系统复杂庞大,指令数目一般为200条以上。
- 指令的长度不固定,指令格式多,寻址方式多。
- 可以访存的指令不受限制。
- 各种指令使用频度相差很大
- 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
- 控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。
- 难以用优化编译生成高效的目标代码程序。
RISC
- 设计原因:CISC过于复杂,设计要求逐渐提高,研发周期变长,并且设计的80%的指令使用频率却只有20%,从这个事实出发
- 设计中心思想:精简指令系统计算机(RISC)的中心思想是要求指令系统简化,尽量使用寄存器寄存器操作指令,指令格式要求一致
- 特点:
- 选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现
- 指令长度固定,指令格式种类少,寻址方式种类少。
- 只有 Load/store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行。
- CPU中通用寄存器的数量相当多
- RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
- 以硬布线控制为主,不用或少用微程序控制。
- 特别重视编译优化工作,以减少程序执行时间。
4.5 本章小结
1、什么是指令?什么是指令系统?为什么要引入指令系统?
指令就是要计算机执行某种操作的命令,一台计算机中所有机器指令的集合,称为这台计算机的指令系统。引入指令系统后,避免了用户与二进制代码直接接触,使得用户编写程序更为方便。另外,指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。
2、一般来说,指令分为哪些部分?每部分有什么用处?
一条指令通常包括操作码字段和地址码字段两部分。其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,它是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址等。
3、对于一个指令系统来说,寻址方式多和少有什么影响?
寻址方式的多样化能让用户编程更为方便,但多重寻址方式会造成CPU结构的复杂化(详见下章),也不利于指令流水线的运行。而寻址方式太少虽然能够提高CPU的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户的需求。
4.6 常见问题和易混淆知识点
1、简述各常见指令寻址方式的特点和适用情况。
- 立即寻址操作数获取便捷,通常用于给寄存器赋初值。
- 直接寻址相对于立即寻址,缩短了指令长度
- 间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回。
- 寄存器寻址的指令字较短,指令执行速度较快
- 寄存器间接寻址扩大了寻址范围。
- 基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间。
- 变址寻址主要用于处理数组问题,适合编制循环程序。
- 相对寻址用于控制程序的执行顺序、转移等。
基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的。
2、一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址?
现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息。一个操作数(如char、int、foat、 double)可能是8位、16位、32位或64位等,因此可能占用1个、2个、4个或8个内存单元。也就是说,一个操作数可能有多个内存地址对应。
有两种不同的地址指定方式:大端方式和小端方式。
- 大端方式:指令中给出的地址是操作数最高有效字节(MSB)所在的地址
- 小端方式:指令中给出的地址是操作数最低有效字节(LSB)所在的地址。
3、装入/存储(Load/ Store)型指令有什么特点?
装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格。这种指令风格在RISC指令系统中较为常见。为了规整指令格式,使指令具有相同的长度,规定只有 Load/Store指令才能访问内存。而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器。因为寄存器编号较短,而主存地址位数较长,通过某种方式可使运算指令和访存指令的长度一致。
这种装入/存储型风格的指令系统的最大特点是,指令格式规整,指令长度一致,一般为32位。由于只有 Load/Store指令オ能访问内存,程序中可能会包含许多装入指令和存储指令,与ー般通用寄存器型指令风格相比,其程序长度会更长。
五、中央处理器
5.1 CPU的功能和基本结构
5.1.1 CPU的功能
- 指令控制:完成取指令、分析指令和执行指令的操作,即程序的顺序控制。
- 操作控制:一条指令的功能往往是由若干操作信号的组合来实现的。CPU管理并产生由内存取出的每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行动作。
- 时间控制:对各种操作加以时间上的控制。时间控制要为每条指令按时间顺序提供应有的控制信号。
- 数据加工:对数据进行算术和逻辑运算。
- 中断处理:对计算机运行过程中出现的异常情况和特殊请求进行处理。
5.1.2 CPU的基本结构
1、运算器
主要功能:根据控制器送来的命令,对数据执行算术运算(加、减、乘、除)、逻辑运算(与、或、非、异或、移位、求补etc)或条件测试(用于设置ZF、SF、OF和CF标志位,作为条件转移的判断条件)
- 算术逻辑单元(ALU)
- 累加寄存器(ACC)
- 程序字状态寄存器(PSW)
- 计数器(CT)
- 暂存寄存器
- 通用寄存器组
- 移位寄存器
- etc
2、控制器
主要功能:执行指令,每条指令的执行是由控制器发出的一组微操作实现的。
- 程序计数器(PC):存放下一条指令在主存中的地址,具有自增功能。
- 指令寄存器(IR):存放当前正在执行的指令。
- 指令译码器(ID)
- 存储器地址寄存器(MAR)
- 存储器数据寄存器(MDR)
- 时序系统
- 微操作信号发生器
- etc
5.1.3 CPU的寄存器
1、运算器中的寄存器
注:通用寄存器的位数取决于机器字长。
2、控制器中的寄存器
注:这个图最好能直接背下来,对后续有一定的帮助。
寄存器是否透明?
CPU内部寄存器大致可分为两类:
一类是用户可见的寄存器,可对这类寄存器编程,以通过使用这类寄存器减少对主存储器的访问次数,如通用寄存器组(Ri 含基址/变址寄存器)、程序状态字寄存器(PSW)、程序计数器(PC)、累加寄存器(ACC);
另一类是用户不可见的寄存器,对用户是透明的,不可对这类寄存器编程,它们被控制部件使用,以控制CPU的使用,如存储器地址寄存器(MAR)、存储器数据寄存器(MDR)、指令寄存器(IR)、暂存寄存器。
5.2 指令执行过程
5.2.1 指令周期
指令周期的流程:
5.2.2 指令周期的数据流
1、取指周期
2、间址周期
3、执行周期
执行周期的任务是根据IR中的指令字的操作码和操作数通过ALU操作产生执行结果。不同指令的执行周期操作不同,因此没有统一的数据流向。
4、中断周期
5.2.3 指令执行方案
5.3 数据通路的功能和基本结构
5.3.1 数据通路的功能
- 随着技术的发展,更多的逻辑功能被集成到CPU芯片中,但不论CPU的内部结构多么复杂,它都可视为由数据通路(Data Path)和控制部件(Control Unit)两大部分组成。
- 数据通路描述了信息从哪里开始,中间经过哪些部件,最后被传送到哪里。
- 数据通路由控制部件控制,控制部件根据每条指令功能的不同,生成对数据通路的控制信号。
5.3.2 数据通路的组成
组成数据通路的元件主要分为组合逻辑元件和时序逻辑元件两类。
5.3.3 数据通路的基本结构
1、CPU内部单总线方式
2、CPU内部多(两条以上)总线方式
3、专用数据通路方式
5.3.4 数据通路的操作举例
5.4 控制器的功能和工作原理
5.4.1 控制器的结构和功能
控制器作为计算机系统的指挥中心,控制器的主要功能有:
- 从主存中取出一条指令,并指出下一条指令在主存中的位置。
- 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。
- 指挥并控制CPU、主存、输入和输出设备之间的数据流动方向。
根据控制器产生微操作控制信号的方式的不同,控制器可分为硬布线控制器和微程序控制器,两类控制器中的IR和PC是相同的,但确定和表示指令执行步骤的办法以及给出控制各部件运行所需要的控制信号的方案是不同的。
控制单元的输入和输出:
5.4.2 硬布线控制器(组合逻辑控制器)
硬布线控制器由复杂的组合逻辑门电路和触发器构成,也称组合逻辑控制器,其原理是根据指令的要求、当前的时序及内外部的状态,按时间的顺序发送一系列微操作控制信号。
硬布线控制的功能由逻辑门组合实现,其速度主要取决于电路延迟,因此高速计算机中的关键部件CPU往往采用硬布线逻辑实现。因此,RISC一般都选用硬布线控制器。
5.4.3 微程序控制器
采用存储逻辑实现,也就是将微操作信号代码化,使每条机器指令转化成为一段微程序并存入一个专门的存储器(控制存储器)中,微操作控制信号由微指令产生。
注:程序>指令>微程序>微指令>微命令(微操作)
1. 微程序控制的基本概念
微指令和微命令是一一对应的,微命令有相容性和互斥性之分。
- 相容性微命令:是指可以同时出现、共同完成某一些微操作的微命令。
- 互斥性微命令:是指在机器中不允许同时出现的微命令。
2. 微程序控制组成和工作过程
3.微指令的编码方式
4. 微指令的地址形成方式
5. 微指令的格式
6. 微程序控制单元的设计
7. 动态微程序设计和毫微程序设计
8. 硬布线和微程序控制器的特点
5.5 异常和中断机制
5.5.1 异常和中断的基本概念
Exception
Interruption
5.5.2 异常和中断的分类
注:终止异常(异常中止)和外中断属于硬件中断。(所有的异常和中断事件都是由硬件检测发现的。)
5.5.3 异常和中断响应过程
CPU响应中断之后,就会进入中断周期。在中断周期CPU会执行一系列的操作,这些操作都是由一条中断隐指令完成的。所谓的隐指令,指的是指令系统中本身没有这条指令,它是由硬件自动完成的。具体操作如下:
1、保护程序断点
将当前PC的内容(程序断点位置)保存到主存中。可以存入特定的某个地址(比如0地址),也可以存入堆栈中。
2、寻找中断服务程序的入口地址(中断服务程序)
在中断周期内,可以用两种方法寻找中断服务程序的入口地址:硬件向量法和软件查询分别对应看硬件和软件实现。
3、关中断
为了在响应中断后,不受到新的中断请求的干扰,在中断周期需要自动做"关中断"的操作,禁止CPU再次响应中断清求。(关中断的具体操作就是将允许中断触发器EINT(PSW9)置“0”,一般直接由硬件电路实现。)
基本流程:
注:CPU对于异常和中断的响应处理大体是一致的,都需要保存断点和程序状态字并转到相应的处理程序去处理,但有些细节并不一样。例如检测到中断请求后,CPU必须通过“中断回答”信号启动中断控制器进行中断查询,以确定当前发出的优先级最高的中断请求,并通过数据线获取相应的中断类型号,而对于异常,CPU无须进行中断周期。
5.6 指令流水线
5.6.1 指令流水线的基本概念
可从两方面提高处理机的并行性:
- 时间上的并行技术:将一个任务分解为几个不同的子阶段,每个子阶段在不同的功能部件上并行执行,以便在同一时刻能够同时执行多个任务,进而提升系统性能,这种方法被称为流水线技术。
- 空间上的并行技术:在一个处理机内设置多个执行相同任务的功能部件,并让这些功能部件并行工作,这样的处理机被称为超标量处理机。
注:特点:每个阶段用到的硬件不一样。
流水线的表现方式:
5.6.2 流水线的基本实现
注:流水线设计的原则:在单周期实现中,虽然不是所有指令都必须经历完整的5个阶段,但只能以执行速度最慢的指令作为设计其时钟周期的依据,单周期CPU的时钟频率取决于数据通路中的最长路径。
注:流水段寄存器对于用户来说是透明的。
5.6.3 流水线的冒险与处理(冲突与与处理)
1、结构冒险(互斥)
2、数据冒险(★★★)
注:
- 部分数据冒险可以使用转发技术解决,但有些数据冒险不行,例如load-use类型的数据冒险(当下一条指令需要用到本条指令的访存结果时)。它会引起一个或多个时钟周期的阻塞。(至少一个,这个点很爱当考题)
- 在按序执行的流水线中,只可能出现RAW(Read After Write)冲突。
3、控制冒险
注:流水段的数量与控制冒险引发的开销有关。流水段的数量越多,意味着在转移结果确定之前,可能取出更多的时间和资源来处理这些错误指令。
5.6.4 流水线的性能指标
1、吞吐率
注:处理机的度就是指流水线的数量。7度处理机可以并行执行7条流水线(每条流水线k段)and例如常规标量单流水线处理机,处理机的度为1。
2、加速比
3、效率
5.6.5 高级流水线技术
1、超标量流水线技术(空分)
注:在一个时钟周期内一条流水线可执行一条以上的指令。
2、超长指令字技术
3、超流水线技术(时分)
重点和回顾来啦!!
本节小结:
五段式流水线常见命令的执行过程:
运算类指令:
LOAD指令:
STORE指令:
条件转移指令:
无条件转移指令:
注:通常在RISC指令集中,只有LOAD取数指令和STORE存数指令可以访问主存。
简简单单再来个例题。
5.7 多处理器的基本概念(直接背)
5.7.1 SISD、SIMD、MIMD的基本概念
1、SISD
单指令流单数据流的单处理器(低位交叉)
2、SIMD
单指令流多数据流。同样的指令在多个数据流上操作,和在向量处理器中的一样。
3、MISD
4、MIMD
多指令流多数据流的多处理器
5、向量处理器
5.7.2 硬件多线程的基本概念
在传统CPU中,线程的切换包含一系列的开销,频繁地切换会极大影响系统的性能,为了减少线程切换过程中的开销,便诞生了硬件多线程。
注:超线程技术(模拟实体双核)是一项硬件创新,允许在每个内核上运行多个线程。更多的线程意味着可以并行完成更多的工作。在一个CPU中,提供两套线程处理单元,让单个处理器实现线程级并行。虽然采用超线程技术能够同时执行两个线程,但是当两个线程同时需要某个资源时,其中一个线程必须暂时挂起,直到这些资源空闲后才能继续运行。因此超线程的性能并不等于两个CPU的性能。而且超线程技术的CPU需要芯片组、操作系统和应用软件的支持,才能发挥该项技术的优势。
5.7.3 多核处理器(共享内存多处理器)的基本概念
其实和MIMD中的多处理器系统一样。
具有共享的单一物理地址空间的多处理器称为共享内存多处理器(SMP)。处理器通过存储器中的共享变量互相通信,所有处理器都能通过存取指令访问存储器的任何位置。
注意。即使这些系统共享同一个物理地址空间,它们仍然可在自己的虚拟地址空间中单独地运行程序。
- 统一存储访问(UMA)多处理器:每个处理器对所有存储单元的访问时间是大致相同的,即访问时间于哪个处理器提出访存请求以及访问哪个字无关。
- 非统一存储访问(NUMA)多处理器:某些存储器的访存速度要比其他的快,具体取决于哪个处理器提出访问请求以及访问哪个字,这是由于主存被分割给了不同存储器。
注:
- 多核CPU的核心通常(只是通常)都是对称的。
- 多核CPU的各核心既可以有独自的Cache,又可以共享同一个Cache。
- 只有支持多线程的并行处理程序才能同时在多个核心上运行,发挥多核的优势。
- 多任务系统也称之为多道程序系统,可以运行在单核CPU上,宏观上并行,微观上串行。
- SMP一般采用偶数倍CPU。
- UMA架构由于所有CPU共享相同的内存,增加CPU路数会加大访存冲突,通常2或4路性能最好。
- NUMA理论上支持无限扩展。
5.8 本章小结
1、指令和数据均存放在内存中,计算机如何从时间和空间上区分它们是指令还是数据?
从时间上讲,取指令事件发生在“取指周期”,取数据事件发生在“执行周期”。
从空间上讲,从内存读出的指令流流向控制器(指令寄存器),从内存读出的数据流流向运算器(通用寄存器)。
2、什么是指令周期、机器周期和时钟周期?它们之间有何关系?
CPU每取出并执行一条指令所需的全部时间称为指令周期;
机器周期是在同步控制的机器中,执行指令周期中一步相对完整的操作(指令步)所需的时间,通常安排机器周期长度=主存周期;
时钟周期是指计算机主时钟的周期时间,它是计算机运行时最基本的时序单位,对应完成一个微操作所需的时间,通常时钟周期=计算机主频的倒数。
- 时钟周期是最基本的时间单位,是构成机器周期和指令周期的基础。
- 机器周期是由多个时钟周期组成的,用于完成一个基本的操作或数据传输。
- 指令周期是由一个或多个机器周期组成的,用于完成一条指令的全部执行过程。
3、什么是微指令?它和第4章谈到的指令有什么关系?
控制部件通过控制线向执行部件发出各种控制命令,通常把这种控制命令称为微命令,而一组实现一定操作功能的微命令的组合,构成一条微指令。许多条微指令组成的序列构成微程序,微程序完成对指令的解释执行。
指令,即指机器指令。每条指令可以完成一个独立的算术运算或逻辑运算操作。在采用微程序控制器的CPU中,一条指令对应一个微程序,一个微程序由许多微指令构成,一条微指令会发出很多不同的微命令。
4、什么是指令流水线?指令流水线相对于传统计算机体系结构的优势是什么?如何计算指令流水线的加速比?
指令流水线是把指令分解为若干子过程,通过将每个子过程与其他子过程并行执行,来提高计算机的吞吐率的技术。
采用流水线技术只需增加少量硬件就能把计算机的运算速度提高几倍,因此成为计算机中普遍使用的一种并行处理技术,通过在同一个时间段使用各功能部件,使得利用率明显提高。
流水线的加速比指的是完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比。一条k段流水线理论上的最大加速比为Smax=k。因此,在现代计算机中提高流水线段数有利于提高计算机的吞吐量。具体的加速比要使用时空图来计算。
5.9 常见问题和易混淆知识点
1、流水线越多,并行度就越高。是否流水段越多,指令执行越快?
错误,因为如下:
- 流水段缓冲之间的额外开销增大。每个流水段有一些额外开销用于缓冲间传送数据、进行各种准备和发送等功能,这些开销加长了一条指令的整个执行时间,当指令间逻辑上相互依赖时,开销更大。
- 流水段间控制逻辑变多、变复杂。用于流水线优化和存储器(或寄存器)冲突处理的控制逻辑将随流水段的增加而增大,这可能导致用于流水段之间控制的逻辑比段本身的控制逻辑更复杂。
2、在计算机组成原理中,WAW和WAR相关的概念。
在计算机组成原理中,WAW(Write After Write)和WAR(Write After Read)是两种指令相关性(Instruction Hazards)的类型,它们描述了在指令流水线中,不同指令之间可能发生的冲突。
WAW(Write After Write):这种相关性发生在两个指令试图写入同一个寄存器,但是写入操作的顺序是连续的。也就是说,第一个指令写入寄存器,紧接着第二个指令也写入同一个寄存器。在这种情况下,第一个指令的写入结果可能会被第二个指令覆盖,造成数据丢失。为了解决这个问题,通常需要在流水线中插入一个数据转发(Data Forwarding)或者数据旁路(Data Bypassing)的步骤,以确保第一个指令的结果能够被正确地传递到第二个指令。
WAR(Write After Read):这种相关性发生在一个指令读取一个寄存器,紧接着另一个指令写入同一个寄存器。如果第二个指令在第一个指令读取寄存器之前写入,那么第一个指令将读取到错误的数据。为了解决WAR相关性,通常需要在流水线中插入一个数据旁路,确保第一个指令能够读取到最新的数据。
注:在按非序执行的流水线中,因为允许后进入流水线的指令超过先进入流水线的指令而先流出流水线,所以既可能发生RAW相关,又可能发生WAR和WAW相关。
六、总线
6.1 总线的概述
6.1.1 总线的基本概念
1、总线的定义
2、总线设备
总线上所连接的设备,按其对总线有无控制可分为主设备和从设备两种。
- 主设备:指发出总线请求且获得总线控制权的设备。
- 从设备:指被主设备访问的设备,它只能响应从主设备发来的各种总线命令。
3、总线特性
注:机电功时
6.1.2 总线的分类
1、按数据传输格式
注:并不是并行一定就比串行要快。 它们适用于不一样的场景。
2、按总线功能(连接的部件)
- 片内总线:芯片内部的总线,用于CPU芯片内部各寄存器之间以及寄存器与ALU的连接。
- 系统总线:计算机内各功能部件(CPU、主存、I/O接口)之间相互连接的总线。按系统总线传输信息内容的不同,又可分为3类:数据总线、地址总线和控制总线。
注:数据总线的根数通常是要和机器字长或存储字长有关。 - I/O总线(双总线及以上结构):主要用于连接中低速的I/O设备,通过I/O接口与系统总线相连接,目的是将低速设备与高速总线分离,以提升总线的系统性能,常见的有USB、PCI总线。
- 通信总线:计算机系统之间或计算机系统与其他系统(如远程通信设备、测试设备)之间传送信息的总线,通信总线也称外部总线。
3、按时序控制方式
- 同步总线:总线上连接的部件或设备通过统一的时钟进行同步,在规定的时钟节拍内进行规定的总线操作,来完成部件或设备之间的信息传输。
- 异步总线:总线上连接的部件或设备没有统一的时钟,而以信号握手的方式来协调各部件和设备之间的信息传输,总线操作时序不是固定的。
6.1.3 系统总线的结构
1、单总线结构
注:这里的并发应该想表达的是并行。
2、双总线结构
注:通道其实就相当于一个阉割版的CPU,故才有的缺点。
3、三总线结构
注:系统工作效率较低的原因就在于在该结构中一个时刻只允许一个总线在工作。
4、四总线结构(简单了解)
*6.1.4 常见的总线标准
6.1.5 总线的性能指标
注:总线周期与总线时钟周期的关系可以是一对一、一对多、多对一(需要根据问题来判断)
注:复用一般就是地址总线和数据总线复用。
例题:
插播一个知识片段(408不考!!)
6.2 总线事务和定时
6.2.1 总线事务
在现在的王道课本里面是五个阶段:
- 请求阶段(Request Phase):主设备(CPU或DMA)向总线发出请求,希望进行数据传输(获得总线控制权)。
- 仲裁阶段(Arbitration Phase):如果有多个主设备同时请求使用总线,这个阶段会决定哪个设备获得总线的控制权。
- 寻址阶段(Address Phase):获得总线控制权的主设备发送它想要访问的从设备的地址。
- 传输阶段(Transfer Phase):一旦寻址完成,数据在主设备和从设备之间传输(可单向或双向进行数据传输)。
- 释放阶段(Release Phase):数据传输完成后,主设备释放总线,使其可供其他设备使用(让出总线控制权)。
6.2.2 总线定时
1、同步定时方式
注:不同速度的设备之间也是可以用同步定时方式的。
2、异步定时方式
注:传送操作是按需分配时间的!
3、半同步定时方式
注:握手信号的采样由同步时钟控制。其实就只是在同步的基础上增添了等待响应信号(握手)。
4、分离式定时方式
6.3 本章小结
1、引入总线结构有什么好处?
引入总线结构主要有以下优点
①简化了系统结构,便于系统设计制造。
②大大减少了连线数目,便于布线,减小体积,提高系统的可靠性
③便于接口设计,所有与总线连接的设备均采用类似的接口。
④便于系统的扩充、更新与灵活配置,易于实现系统的模块化
⑤便于设备的软件设计,所有接口的软件对不同的接口地址进行操作。
⑥便于故障诊断和维修,同时也能降低成本。
2、引入总线会导致什么问题?如何解决?
引入总线后,总线上的各个设备分时共享同一总线,当总线上多个设备同时要求使用总线时就会导致总线的冲突。
为解决多个主设备同时竞争总线控制权的问题,应当采用总线仲裁部件,以某种方式选择一个主设备优先获得总线控制权,只有获得了总线控制权的设备才能开始数据传送。
6.4 常见问题和易混淆知识点
1、一个总线在某一时刻可以有多对主从设备进行通信吗?
不可以。
在某个总线周期内,总线上只有一个主设备控制总线,选择一个从设备与之进行通信(即一对一的关系),或对所有设备进行广播通信(即一对多的关系)。所以一个总线在某一时刻不能有多对主从设备进行通信,否则会发生数据冲突。
七、输入/输出系统
*7.1 I/O系统基本概念
*7.1.1 输入/输出系统
输入/输出系统是以主机为中心而言的,而将信息从外部设备送到主机称为输入,反之称为输出。系统解决的主要问题是对各形式的信息进行输入和输出的控制。
注:I/O设备不可能直接与主板总线相连,它总是通过设备控制器(I/O接口)来相连的。
*7.7.2 I/O控制方式
*7.1.3 外部设备
1、输入设备
2、输出设备
3、外部存储器(辅存)
7.2 I/O接口
7.2.1 I/O接口的功能
注:缓冲、检测、控定、转换、通信。
7.2.2 I/O接口的基本结构
注:主机侧现在已经不仅仅就是并行了(大趋势就是将总线做成串行毕竟)
7.2.3 I/O接口的类型
7.2.4 I/O端口及其编址
7.3 I/O方式
7.3.1 程序查询方式
根据上述流程4(CPU不断查询I/O设备状态,直到外设准备就绪)中查询方式的不同,程序查询方式可以分为以下两种。
- 独占查询:一旦设备被启动,CPU就一直持续查询接口状态,CPU花费100%的时间用于I/O操作,此时外设和CPU完全串行工作。
- 定时查询:CPU周期性地查询接口状态,每次总是等到条件满足才进行一个数据的传送,传送完成后返回用户程序。定时查询的时间间隔与设备地数据传输速率有关。
例题:
7.3.2 程序中断方式
中断的基本概念
中断请求分类
中断请求标记(INTR):如何判断是哪个设备发来的信号
中断判优:有多个中断信号同时到来,先处理哪个?
中断判优:优先级如何设置
中断处理过程:中断隐指令
中断处理过程:硬件向量法
注:向量地址(中断类型号)应该理解为指向指针的指针,中断向量就是一个指针(指向的是程序入口地址)
中断处理过程:软件查询法
中断处理过程
注:单重中断:执行中断服务程序时不响应新的中断请求。
当然那就还会有多重中断。
注:看上图,我们会发现其实就是多了一个屏蔽字,以及开中断和关中断操作。
屏蔽字:是指用于屏蔽中断请求的二进制码。
至于开中断为什么处在保护现场和屏蔽字的后面,这是因为:
- 确保中断处理的完整性:在中断服务程序执行之前,需要确保当前的执行环境被完整地保存下来,这样在中断处理结束后,系统可以准确地恢复到中断发生前的状态。
- 防止新的中断干扰:如果在保护现场之前就开启中断,那么在保护现场的过程中可能会发生新的中断,这可能会导致当前中断处理的混乱,甚至可能覆盖掉当前中断的上下文信息。
关中断在恢复现场和屏蔽字之前也是同理。
简简单单小例题:
程序中断方式:
再来个简简单单小例题:
7.3.3 DMA方式
CPU和DMA访问主存就可能会发生冲突,那我们应该怎么办?
DMA方式的特点:
中断方式与DMA方式的差别:
7.4 本章小结
1、I/O设备有哪些编址方式?各有何特点?
统一编址和独立编址。
统一编址是在主存地址中划出一定的范围作为I/O地址,以便通过访存指令即可实现对I/O的访问,但主存的容量相应减少。
独立编址是指IO地址和主存是分开的,I/O地址不占主存空间,但访存需专门的I/O指令。
2、CPU响应中断应具备哪些条件?
①在CPU内部设置的中断屏蔽触发器必须是开放的
②外设有中断请求时,中断请求触发器必须处于“1”状态,保持中断请求信号。
③外设(接口)中断允许触发器必须为“1”,这样才能把外设中断请求送至CPU。
具备上述三个条件时,CPU在现行指令结束的最后一个状态周期响应中断。
7.5 常见问题和易混淆知识点
1、在开中断情况下,CPU检测到中断就一定会立即响应吗?
在开中断情况下,CPU总在每条指令执行结束时采样中断信号,此时若检测到中断请求信号,则会立即响应。即便是多重中断,CPU正在处理某个中断的过程中,由于中断屏蔽字的存在,CPU检测不到处理优先级更低的中断请求信号,因此若检测到中断请求信号,则说明新中断源的处理优先级更高,同样也会立即响应。
2、向量中断、中断向量、向量地址三个概念是什么关系?
中断向量:每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
向量地址:中断向量表或中断向量跳转表中每个表项所在的内存地址或表项的索引值,称为向量地址或中断类型号。
向量中断:指一种识别中断源的技术或方式。识别中断源的目的是找到中断源对应的中断服务程序的入口地址的地址,即获得向量地址。
3、程序中断和调用子程序有何区别?
两者的根本区别主要表现在服务时间和服务对象上不一样。
- 调用子程序过程发生的时间是已知的和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序过程,调用指令所在位置是已知的和固定的。而中断过程发生的时间一般是随机的,CPU在执行某个主程序时收到中断源提出的中断申请,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的。也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的
- 子程序完全为主程序服务,两者属于主从关系。主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序二者一般是无关的,不存在谁为谁服务的问题,两者是平行关系。
- 主程序调用子程序的过程完全属于软件处理过程,不需要专门的硬件电路;而中断处理系统是一个软/硬件结合的系统,需要专门的硬件电路才能完成中断处理的过程
- 子程序嵌套可实现若干级,嵌套的最多级数受计算机内存开辟的堆栈大小限制;而中断嵌套级数主要由中断优先级来决定,一般优先级数不会很大。
- 从宏观上看,虽然程序中断方式克服了程序査询方式中的CPU“踏步”现象,实现了CPU与I/O并行工作,提高了CPU的资源利用率,但从微观操作分析,CPU在处理中断服务程序时,仍需暂停原程序的正常运行,尤其是当高速I/O设备或辅助存储器频繁地、成批地与主存交换信息时,需要不断打断CPU执行现行程序,而执行中断服务程序。