1.计算机发展历程
1.1.计算机硬件的发展
①:电子管时代:第一代计算机(1946-1957 年)
逻辑元件采用电子管;使用机器语言进行编程;主存用延迟线或磁鼓存储信息,容量极小;体积庞大,成本高;运算速度较低,一般只有几千次到几万次每秒。
②:晶体管时代:第二代计算机(1958-1964 年)
逻辑元件采用晶体管;运算速度提高到几万次到几十万次每秒;主存使用磁芯存储器;计算机软件也得到了发展,开始出现了高级语言及其编译程序,有了操作系统的雏形。
③:中小规模集成电路时代:第三代计算机(1965-1971 年)
逻辑元件采用中小规模集成电路:半导体存储器开始取代磁芯存储器;高级语言发展迅速,操作系统也进一步发展,开始有了分时操作系统。
④:超大规模集成电路时代:第四代计算机(1927 年 - 现在)
逻辑元件采用大规模集成电路和超大规模集成电路,产生了微处理器:诸如并行、流水线、高速缓存和虚拟存储器等概念用在了这代计算机中。
⑤:智能计算机
具备人工智能,运算速度极快,软件系统能够处理知识信息,以神经网络计算机为代表。
⑥:生物计算机和量子计算机
生物计算机是指使用生物分子或细胞作为计算元件的计算机。生物计算机的运算方式与传统的计算机不同,它们利用生物分子的结构和运动来进行计算,从而实现高效的计算能力。生物计算机具有较低的功耗和较长的计算时间,但它们需要更为复杂的技术和材料来实现。
量子计算机是指使用量子比特 (qubit) 来进行计算的计算机。与传统计算机使用的二进制比特 (bit) 不同,量子比特可以处于多种状态的叠加态,这种叠加态可以在量子计算机中实现高效的并行计算。量子计算机的运算速度非常快,但目前尚处于研究和开发阶段,需要解决许多技术难题才能实现。
1.2.计算机元件的更新换代
注意以下三点或概念即可:
- 摩尔定律: 每平方英寸电路板上的晶体管数量每 18 个月翻一番。
- 微处理器的出现和发展:自1971年Intel公司开发出第一个微处理器
Intel4004
至今,微处理器经历了Intel8008(8位)
、Intel8086(16位)
、Intel80386(32位)
、Pentium(32位)
、Pentium III(64位)
、Pentium4(64位)
、Core i7(64位)
等。这里的32位、64位指的是机器字长,是指计算机进行一次整数运算所能处理的二进制数据的位数。 - 半导体存储器的发展: 1970年,仙童半导体公司生产出第一个较大容量的半导体存储器,至今,半导体存储器经历了11代:单芯片1KB、4KB、16KB、64KB、256KB、1MB、4MB、16MB、64MB、256MB和现在的1GB。
1.3.计算机软件的发展
计算机语言的发展: 机器语言 - 汇编语言 - 高级语言。
操作系统的发展:例如 DOS,Windows,MAC 等等。
1.4.计算机的分类与发展方向
1.4.1.分类
电子计算机
- 电子模拟计算机
- 电子数字计算机
数字计算机
- 专用计算机
- 通用计算机
通用计算机
- 巨型机
- 大型机
- 中型机
- 小型机
- 微型机
- 单片机
依照指令与数据流划分:
- 单指令流与单数据流(SISD):冯诺依曼体系结构。
- 单指令流与多数据流(SIMD):阵列存储器与向量存储器。
- 多指令流与单数据流(MISD):不存在。
- 多指令流与多数据流(MIMD):多处理器和计算机系统。
1.4.2.发展方向
两极化发展方向
- 微型计算机:微型化、网络化、高性能、多用途。
- 巨型计算机:巨型化、超高速、并行处理、智能化。
2.计算机硬件的基本组成
2.1.冯诺依曼机特点
- 计算机硬件系统由运算器、存储器、控制器、输入和输出设备 5 部分组成。
- 指令和数据以同等地位存储在存储器,并可按地址寻访。
- 指令由操作码和地址码组成,操作码用于表示这是一个什么类型的操作,地址码用于表示操作数在存储器中的存放位置。
- 指令在存储器内按顺序存放(一般情况下是这样的,但在特定条件下也可以进行设定)。
- 早期的冯诺依曼机器以运算器为中心,输入输出设备通过运算器与存储器传送数据。
- 上图中,实线是数据线,虚线是控制线(双向)。
冯诺依曼机缺陷(早期)
在控制器的指挥下,输入和输出设备输入一些数据交给运算器进行运算,如果产生中间结果,就会传送给存储器,计算完成后最终结果会给输出设备。可以发现这种层次结构容易受到输入和输出设备的牵制,因为他们的速度相较于运算器太慢了(短板效应)。
2.2.现代计算机的组织结构
为了解决 I/O 设备的速度和 CPU 速度差异悬殊的问题,现如今的计算机则采用以存储器为中心的计算机组织结构,这种结果使 I/O 操作尽可能绕过 CPU,直接在 I/O 设备和存储器之间完成,以提高系统的整体运行效率。
3.各个硬件的工作原理
3.1.存储器(第三章重点学习)
3.3.1.存储器相关基本定义
存储器相关基本定义:目前我们采用半导体器件来承担存储任务,一个半导体触发器由于有 0 和 1 两个状态,就可以记忆一个二进制代码,关于存储器有如下五个非常重要的概念:
存储元:也可称为存储元件和存储基元,用来存放一位二进制信息。
存储单元:由若干个存储元组成,能存放多位二进制信息。
存储体:许多存储单元可组成存储体,也即存储矩阵。
存储字:每个存储单元中二进制代码的组合即为存储字,可代表数值、指令和地址等。
存储字长:每个存储单元中二进制代码的位数就是存储字长。
上述概念可以这样记忆:主存储器由许多存储单元组成,每个存储单元包含多个存储元,每个存储元存储 1 位二进制代码 0 或 1,故存储单元可存储一串二进制代码,称这串代码为存储字,而这串代码的位数称为存储字长,存储字长一般是一个字节(8 位)或字节的偶数倍。
3.3.2存储器的基本结构
存储器基本结构:存储器主要分为:
- 主存(内存):CPU 可以直接访问;主要存放程序和数据;是计算机实现 “存储程序” 控制的基础;外存中信息必须加载进主存后 CPU 才可以访问。
- 辅存(外存):CPU 不可以直接访问。
主存的基本构成如下图所示
- 存储体 M:存放二进制信息。
- MAR(地址寄存器):存放的是访存地址(经过地址译码后找到所选存储单元)。
- MDR(数据寄存器):存放的是要从存储器中读入或写入的信息。
内部原理图如下。
3.3.3.存储器相关小考点
此部分内容将在【第三章:存储系统】学习,所以看不太懂没有关系,其中一些常考考点汇总如下:
- 数据在存储体中是按照地址存储的,每个地址对应一个存储单元。
- 存储单元数目 = \(2^{MAR 位数}\)(如果 MAR 为 10 位,则存储单元数目为 \(2^{10}=1024\))。它用于寻址,其长度和 PC(程序计数器)长度一致。
- MDR 的位数表示存储字长(例如 MDR 为 16,表示存储字长为 16,也表示 1 个字 (word)=16bit)。
- 注意区分字(word)和字节(Byte),1 个字节等于 8 个 bit,而 1 个字的大小取决于机器。
- 1B=1 个字节,1b = 1个bit。
3.2.运算器(第五章重点学习)
运算器:是计算机的执行部件,主要进行:
- 算数运算:比如加减乘除。
- 逻辑运算:比如与、或、非、异或、比较等等。
3.2.1.运算器基本结构
运算器基本结构:由以下四部分构成:
- ALU(算数逻辑单元):运算器中造价最为高昂的部分,本质是一对电路;通过内部复杂的电路实现算数运算、逻辑运算。
- ACC(累加器):辅助 ALU,累加器,用于存放操作数,或运算结果。
- MQ(乘商寄存器):辅助 ALU,乘商寄存器,在乘、除运算时,用于存放操作数或运算结果。
- X(通用操作数寄存器):辅助 ALU,通用的操作数寄存器,用于存放操作数。
3.2.2.运算器过程伪代码描述(了解)
设 M 为主存中的某一个存储单元,(M)
表示取 M
中的数据,->
表示将内容送入寄存器。
加法实现:假设 ACC 中已经存在一个数,那么首先取 M
的内容送入通用操作数寄存器
X,即(M)->X
;然后两者相加重新送入寄存器 ACC
中,即(ACC)+(M)->(ACC)。
乘法实现:假设 ACC 中已经存在一个数,那么首先取 M
的内容送入乘商寄存器 MQ 作为乘数,即(M)->MQ
,再取 ACC
寄存器的内容放入 X 寄存器作为被乘数,即ACC->X
,接着将
ACC
清零,即0->ACC
,然后乘数乘以被乘数,一个送入乘积高位,一个送入乘积低位,即(X)×(MQ)->ACC//MQ。
除法实现:假设 ACC 中已经存在一个数,首先取 M
的内容送入 X 作为除数,即(M)->X
,ACC
中的内容作为被除数,结果一个放入 MQ
作为整数部分,即(ACC)/(X)->MQ
,另一个放入 ACC
作为余数,即(ACC)%(X)->ACC。
3.3.控制器(第四章重点学习)
运算器:是计算机的指挥中心,由其指挥各部件自动协调地进行工作。
3.3.1.指令
指令:是指指挥机器工作的指示和命令。程序本质就是一系列按照一定顺序排列的指令。人们用程序表达自己的意图,控制器则通过指令指挥机器工作。指令 = 操作码 + 地址码。
- 操作码:指示计算机要干什么。
- 地址码:干这些事情需要的原材料在哪里。
3.3.2.控制器基本结构
控制器基本结构:由以下三部分构成:
- 控制单元(CU):分析指令、发出信号、协调操作。
- 指令寄存器(IR):存放当前要执行的指令。注意其内容来源于 MDR,因为指令和数据本质是一样的,都被存放在存储器。
- 程序计数器(PC):存放当前要执行的指令地址。注意其与 MAR 直接连通,并且可以自动 + 1。
3.3.3.控制器过程伪代码描述(了解)
完成一条指令的过程为:取指令(PC)-> 分析指令(IR)-> 执行指令(CU)。
具体过程:首先取出指令,即(IR)
,接着获取指令的操作码,即OP(IR)
,然后获取指令的地址码,即AD(IR)
,然后将操作码送入控制单元分析,即OP(IR)->CU
,操作码表示需要干什么,但是干活需要原材料,所以再把指令的地址码送入
MAR,AD(IR)->MAR
, 从 MAR
指示的存储体取出原材料即可。
结合前面的加法,我们可以写出完整的加法运算的过程的:
首要取加法指令,而指令存储在存储体中,想要取出指令必须要知道的指令的地址,而这个地址就存放在
PC 中,PC 又和 MAR
直接相连,即(PC)->MAR
,于是指令此时被放入了 MDR
中,那么接着将指令放入 IR 中,即(MDR)->IR
,
接着取指令的操作码送入控制单元,即OP(IR)->CU
,然后再把原材料(就是一些操作数)的地址码送入
MAR,即AD(IR)->MAR
。接着就可以进行加法操作了,由于上一步已经将操作数的地址码送入了
MDR
中,所以现在送入操作数寄存器,即(MDR)->X
,然后(ACC)+(X)->ACC
,最后
PC 要自增,即(PC)+1->PC
,表示下一条指令。
3.4.计算机的工作过程
接下来以一段简单的 C 语言代码为例展示计算机在背后所做的工作。
- 以下程序非常简单,声明了 4 个变量并赋值,然后在 main 函数内进行运算。
int a=2,b=3,c=1,y=0;
void main()
{
y=a*b+c;
}
经过编译器编译后,这段程序在主存中就是这样的 。
- 下半部分是定义的变量,上半部分则是对应于高级语言对应的机器指令。
为了方便演示,我们将控制器、运算器和存储体也放在旁。
第一组
1:程序开始运行,PC 的值为 0,保存的是第一条指令的地址。然后将 PC
的内容,也就是指令的地址送入到 MAR 中,即
(PC)->MAR,MAR=0。也就是说控制器向存储器指明,我接下来要访问主存 0
号地址处的数据,同时告诉存储器进行读操作 。
2+3:主存储器会根据 MAR 记录的地址信息,到存储体中找出 0
号地址对应的二进制数据,并将其放入到 MDR 中,此时 MDR
中存放了第一条指令。即 M(MAR)->MDR,此时 MDR=000001
0000000101
4:接着将 MDR 中的指令放入 IR
中,于是控制器就存放了当前要执行的指令。即
(MDR)->IR,(IR)=000001 0000000101
5:这条指令的前 6 个比特位是操作码,会被送入到控制单元CU
中,CU
分析后,得知这是一条取数命令。即
OP(IR)->CU
6:取数指令会将变量 a 的内容放入寄存器 ACC 中。但是现在变量 a
不知道在哪里,所以现在会把指令的地址码送到 MAR
当中,即(MAR)=5
7+8:接着主存储器根据 MAR 指明的地址,也就是 a
的地址(5),去存储体中找出 5 号地址的数据,并将其放入 MDR
当中。即M(MAR)->MDR
,(MDR)=0000000000000010
,也即
(MDR)=2
9:接着在控制单元的指挥下,MDR 中的数据就被放入到了 ACC 中。至此第一条指令完成
10:最后 PC 自增 1,进行下一条指令,即 (PC)=1
接下来进行下一组操作
1:程序接着运行,PC 的值为 1,保存的是第二条指令的地址。然后将 PC
的内容,也就是指令的地址送入到 MAR
中,即(PC)->MAR
,MAR=1
。也就是说控制器向存储器指明,我接下来要访问主存
1 号地址处的数据,同时告诉存储器进行读操作 。
2+3:主存储器会根据 MAR 记录的地址信息,到存储体中找出 1
号地址对应的二进制数据,并将其放入到 MDR 中,此时 MDR
中存放了第二条指令。即M(MAR)->MDR
,此时MDR=000100
0000000110
。
4:接着将 MDR 中的指令放入 IR
中,于是控制器就存放了当前要执行的指令。即(MDR)->IR
,(IR)=000100
0000000110
。
5:这条指令的前 6 个比特位是操作码,会被送入到控制单元 CU 中,CU
分析后,得知这是一条乘法命令。即OP(IR)->CU
。
6:接着把指令的地址码送到 MAR 当中,即(MAR)=6
。
7+8:接着主存储器根据 MAR 指明的地址,也就是 b
的地址(6),去存储体中找出 6 号地址的数据,并将其放入 MDR
当中。即M(MAR)->MDR
,(MDR)=0000000000000011
,也即(MDR)=3
。
9:由于是乘法,所以控制单元将 MDR 中的内容送入到乘商寄存器 MQ 中,即
(MDR)->MQ
,此时 (MQ)=0000000000000011=3
。
10:先把 a 的值放入通用寄存器 X
中,即(ACC)->X
,(X)=2
。
11:CU 告诉
ALU,让其进行乘法运算。即(MQ)×(X)->ACC
,(ACC)=6
。注意如果乘积过大,需要
MQ 辅助存储,也就是最上面讲到过的 (X)×(MQ)->ACC/MQ
。
接着进行下一组操作,具体过程就不详细演示了,步骤如下:
- 1:PC 存储 2
号指令的地址,
(PC)->MAR
,(MAR)=2
- 2+3:
M(MAR)->MDR
,(MDR)=000011 0000000111
- 4:
(MDR)->IR
,(IR)=000011 0000000111
- 5:
OP(IR)->CU
,CU 分析操作码,得知这是加法执行 - 6:
Ad(IR)->MAR
,将指令的地址码送入 MAR,(MAR)=7
- 7+8:
M(MAR)->MDR
,(MDR)=00000000 00000001=1
- 9:
(MDR)->x
,(X)= 00000000 00000001=1
- 10:
(ACC)+(X)->ACC
,(ACC)->7
,由 ALU 实现加法运算
接着进行下一组操作:
- 1:
(PC)->MAR
,(MAR)=3
- 2+3:
M(MAR)->MDR
,MDR=000010 0000001000
- 4:
(MDR)->IR
,(IR)000010 0000001000
- **5:
**OP(IR)->CU
,CU 分析得知,这是存数指令 - 6:
AD(IR)->MAR
,(MAR)=8
- 7+8:
(ACC)->MDR
,MDR=7
- 9:
(MDR)-> 地址为 8 的存储单元
,导致y=7
最后再读取到停机指令时,计算机通过中断机制就结束了程序的运行。
4.计算机层次结构
4.1.计算机系统的多级层次结构
计算机系统的多级层次结构:现代计算机是一个硬件与软件组成的综合体,自下而上依次为:
第一级是微程序机器层:这是一个实在的硬件层,它由机器硬件直接执行微指令。
第二级是传统机器语言层:它是一个实际的机器层,由微程序解释机器指令系统。
第三级是操作系统层:它由操作系统实现。操作系统程序是由机器指令和广义指令组成的,这些广义指令是为了扩展机器功能而设置的,是由操作系统定义和解释的软件指令,所以这一层也称为混合层。
第四级是汇编语言层:他为用户提供一种符号化的语言,借此可编写汇编语言源程序。
第五级是高级语言层:它是面向用户的,是为方便用户编写应用程序而设置的。
在高级语言层之上,还可以有应用层,它由解决实际问题的程序组成(比如 word,chrome 等等)。
这样的分层结构,使得本层的使用者无需关心下一层的实现细节。
- 注意:在很多情况下,计算机的某些功能既可以由硬件实现,也可以由软件来实现,因此硬件和软件没有严格的界限。
4.2.计算机软件的分类
软件:软件是人们事先编制的具有各类特殊功能的程序,他们通常存放在计算机的主存或外存中,按其功能可以分为以下两类:
- 系统软件:是一组保证计算机系统高效,正确运行的基础软件,通常作为系统资源提供给用户使用。系统软件主要有操作系统(OS)、数据库管理系统(DBMS)、语言处理程序,分布式软件系统、网络软件系统、标准库程序、服务型程序等。
- 应用软件:是指用户为解决某个应用领域中的各类问题而编制的程序、如各种科学计算类程序,工程设计类程序,数据统计与处理程序等。
4.3.解释程序和编译程序
- 解释程序:它将源语言书写的源程序作为输入,解释一句就提交给计算机执行一句,并不形成目标程序;例如 Python、JavaScript 等都是解释型语言。
- 编译程序:把高级语言源程序作为输入,进行翻译转换,产生出的机器语言作为目标程序,然后让计算机去执行这个目标程序,得到计算结果;例如 C/C++、Java 等都是编译型语言。
对于编译程序来说,其产生目标代码的执行速度要比解释程序的执行速度快。
4.4.机器语言、汇编语言和高级语言
- 机器语言:又称二进制代码语言,用 二进制 “0” 和“1” 描述不同指令,编程人员需要记忆每一条指令的二进制编码。其优点就是计算机可以直接识别并执行。
- 汇编语言:其实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。汇编语言的程序必须经过一个称为汇编程序的系统软件的翻译,将其转化为机器语言,才能在计算机的硬件系统上运行。
- 高级语言:高级语言(如C、C++、Java等)是为方便程序设计人员写出解决问题的处理方案和解题过程的程序。通常需要经过编译程序编译成汇编语言程序,然后经过汇编操作得到机器语言程序。其优点在于方便编程人员写出解决问题的方案和解题过程。
由于计算机无法直接理解和执行高级语言程序,需要将高级语言程序转换为机器语言程序,通常把进行这种转换的软件系统称为翻译程序。翻译程序有以下三类:
- 汇编程序(汇编器)。将汇编语言程序翻译成机器语言程序。
- 解释程序(解释器)。将源程序中的语句按执行额序逐条翻译成机器指令并立即执行。
- 编译程序(编译器)。将高级语言程序翻译成汇编语言或机器语言程序。
4.5.计算机体系结构和计算机组成原理概念区别
- 计算机体系结构:研究的是机器语言程序所见的计算机系统的属性概念性的结构与功能特性(指令系统、数据类型、寻址技术、I/O 机理)。也就是说是如何设计硬件与软件之间的接口,举例:无乘法指令。
- 计算机组成原理:研究的是计算机体系结构体现出来的属性,对于程序员来说是 “透明的”。也就是说是如何使用硬件实现所定义的接口,举例:如何实现乘法指令。
5.计算机性能指标
5.1.主存容量指标
主存容量指标:主要有两个
- MAR 位数:反映存储单元的个数。
- MDR 位数:它等于存储字长,等于每个存储单元的大小。
所以有:存储体总容量 = 存储单元个数 × 存储字长 (bit)= 存储单元个数 ×(存储字长 / 8)(Byte)。
- 例如 MAR 为 32 位,MDR 为 8 位,则总容量为\(2^{32}×8bit=4GB\)。
为快速计算,请熟记\(2^{n}\)对应数值:
注意:在描述存储容量、文件大小等时,K、M、G、T通常用2的幂次表示,如\(1Kb=2^{10}b\);在描述速率、频率等时,k、M、G、T通常用10的幂次表示,如\(1kb/s=10^{3}b/s\)。通常前者用大写的K,后者用小写的k,但其他前缀均为大写,表示的含义取决于所用的场景。
5.2.运算速度指标
5.2.1.CPU 主频(时钟频率)
- 单位:Hz
CPU 主频(时钟频率):你在买电脑的时候,一定关注过 CPU 的主频。比如我手头的这台电脑就是 Intel Core-i7-7700HQ 2.8GHz,这里的 2.8GHz 就是电脑的主频(Frequency/Clock Rate)。这个 2.8GHz,我们可以先粗浅地认为表示:CPU 在 1 秒时间内,可以执行的简单指令的数量是 2.8G 条。
如果想要更准确一点描述,这个 2.8GHz 就代表,CPU 的一个 “钟表” 能够识别出来的最小的时间间隔。就像我们挂在墙上的挂钟,都是 “滴答滴答” 一秒一秒地走,所以通过墙上的挂钟能够识别出来的最小时间单位就是秒。
而在 CPU 内部,和我们平时戴的电子石英表类似,有一个叫晶体振荡(OscillatorCrystal)的东西,简称为晶振。我们把晶振当成 CPU 内部的电子表来使用。晶振带来的每一次 “滴答”,就是时钟周期时间。
5.2.2.CPU 时钟周期
- 单位:us 或 ns CPU 时钟周期:接上面,在我这个 2.8GHz 的 CPU 上,这个时钟周期时间,就是 1/2.8G。我们的 CPU,是按照这个 “时钟” 提示的时间来进行自己的操作。主频越高,意味着这个表走得越快,我们的 CPU 也就 “被逼” 着走得越快。
如果你自己组装过台式机的话,可能听说过 “超频” 这个概念,本质就是把买回来的 CPU 内部的钟给调快了,于是 CPU 的计算跟着这个时钟的节奏,也就自然变快了。当然这个快不是没有代价的,CPU 跑得越快,散热的压力也就越大。就和人一样,超过生理极限,CPU 就会崩溃了。
所以:CPU 主频(时钟频率)=1/CPU 时钟周期,主频通常以Hz(赫兹)为单位,1Hz表示每秒1次。
5.2.3.CPI
CPI:对于 CPU 时钟周期数,我们可以再做一个分解,把它变成 “指令数 × 每条指令的平均时钟周期数(Cycles Per Instruction,简称 CPI)”。不同的指令需要的指令数是不同的。
- 加法和乘法都对应着一条 CPU 指令,但是乘法需要的指令数就比加法要多,自然也就慢。
5.2.4.CPU 执行时间
CPU 执行时间:CPI 会受到很多因素的影响,因此用它衡量 CPU 速度是不合理的,所以我们把 CPU 执行时间定义为: CPU 执行时间 = 指令数 ×CPI× 时钟周期 =(指令数 ×CPI)/ 主频。
- 例如:某 CPU 主频为 1000Hz,某程序包含 100 条指令,平均来看指令的 CPI=3,则该程序执行时间为 $100×3×=0.3s $。
总结一下:
- 时钟周期时间,就是计算机主频,这个取决于计算机硬件:我们所熟知的摩尔定律就一直在不停地提高我们计算机的主频。比如说,我最早使用的 80386 主频只有 33MHz,现在手头的笔记本电脑就有 2.8GHz,在主频层面,就提升了将近 100 倍。
- 每条指令的平均时钟周期数 CPI,就是一条指令到底需要多少 CPU Cycle:现代的 CPU 通过流水线技术(Pipeline),让一条指令需要的 CPU Cycle 尽可能地少。因此,对于 CPI 的优化,也是计算机组成和体系结构中的重要一环。
- 指令数,代表执行我们的程序到底需要多少条指令、用哪些指令:这个很多时候就把挑战交给了编译器。同样的代码,编译成计算机指令时候,就有各种不同的表示方式。
我们可以把自己想象成一个 CPU,坐在那里写程序。计算机主频就好像是你的打字速度,打字越快,你自然可以多写一点程序。CPI 相当于你在写程序的时候,熟悉各种快捷键,越是打同样的内容,需要敲击键盘的次数就越少。指令数相当于你的程序设计得够合理,同样的程序要写的代码行数就少。如果三者皆能实现,你自然可以很快地写出一个优秀的程序,你的 “性能” 从外面来看就是好的。
5.2.5.IPS 和 FLOPS
- IPS(Instructions Per Second):每秒可以执行多少条指令,$ IPS=$。
- FLOPS(Floating-point Operation Per Second):每秒执行多少次浮点运算。
IPS 前面可以加入 K 或 M
- KIPS:每秒可以多少千条指令。
- MIPS:每秒可以执行多少百万条指。
FLOPS 前面加入 M、G 和 T
- MFLOPS:每秒执行多少百万次浮点运算 (浮点操作次数 / 执行时间 × $10^{6} $)。
- GFLOPS:每秒执行多少十亿次浮点运算 (浮点操作次数 / 执行时间 × $10^{9} $)。
- TFLOPS:每秒执行多少万亿次浮点运算 (浮点操作次数 / 执行时间 × $ 10^{12} $)。
2021考研大纲新增:PFLOPS,EFLOPS,ZFLOPS,\(P=10^3T\),\(E=10^3P\),\(Z=10^3E\)。
最后需要注意:
- 在描述容量、文件大小时,K、M、G、T 通常用 2 的幂次表示。如 \(1Kb= 2^{10} b\)。
- 在描述速率、频率时,k、M、G、T 通常用 10 的幂次表示,如 \(1kb/s= 10^{3} b/s\)。
5.3.系统整体性能指标
- 数据通路带宽:是指数据总线一次所能并行传送信息的位数。这里所说的数据通路宽度是指外部数据总线的宽度,它与 CPU 内部的数据总线宽度有可能不同。
- 吞吐量:指信息流入、处理和流出系统的速率。它取决于 CPU 能够多快的取指令,数据能够多快地从内存取出或存入,以及所得结果能够多块地从内存送到输出设备。这些决定因素中的任何一步都与主存息息相关,因此吞吐量主要取决于主存的存取周期。
- 响应时间:指的是用户向计算机发送一个请求,到系统对该请求作出相应并获得所需结果的等待时间。通常包括 CPU 时间(运行程序花费)与等待时间(例如 I/O 操作)。
6.本章总结
1:冯诺依曼机以运算器为核心,最根本的特征是存储程序原理,基本方式是控制流驱动。
2:取指阶段取出的是指令、执行阶段取出的是数据。
3:以下概念易混淆:
- MAR(Memory Adress Regiater):存放想要访问的存储单元的地址。
- PC:存放下一条指令的地址。
- IR:存放当前执行的指令。
- MDR(Memory Data Regiater):存放取来的数据。
4:软件和硬件在逻辑功能上是等效的而不是等价的。
5:计算机的位数指的就是机器字长。
6:科学计算机主要关注浮点运算性能。
7:IR、MAR、MDR 是 CPU 内部寄存器,不可见。
8:需要注意 CPU 的 CPI 与主频是没有关系的,但是主频却会加快指令执行速度。
9:评价计算机系统的综合参数是吞吐率。
10:当前设计高性能计算机的重要技术途径是采用并行处理技术。
Q:软件和硬件
A:软件和硬件是两种完全不同的形态,硬件是实体,是物质基础; 软件是一种信息,看不见、摸不到。但在逻辑功能上,软件和硬件是等效的。因此,在计算机系统中,许多功能既可以由硬件直接实现,又可以在硬件的配合下由软件实现。
- 例如,乘法运算既可用专门的乘法器 (主要由加法器和移位器组成) 实现,也可用乘法子程序 (主要由加法指令和移位指令等组成) 来实现。
Q:计算机由哪儿部分组成?以哪部分为中心?
A:计算机由运算器、控制器、存储器、输入设备及输出设备五大部分构成,现代计算机通常把运算器和控制器集成在一个芯片上,合称为中央处理器。而在微处理器面世之前,运算器和控制器分离,而且存储器的容量很小,因此设计成以运算器为中心的结构,其他部件都通过运算器完成信息的传递。随着微电子技术的进步,同时计算机需要处理、加工的信息量也与日俱增,大量I/O设备的速度和CPU的速度差距悬殊,因此以运算器为中心的结构不能满足计算机发展的要求。现代计算机已经发展为以存储器为中心,使I/O操作尽可能地绕过CPU,直接在I/O设备和存储器之间完成,以提高系统的整体运行效率。
Q:主频高的CPU一定比主频低的CPU快吗?为什么?
A:衡量CPU运算速度的指标有很多,不能以单独的某个指标来判断CPU的好坏。CPU的主频,即CPU内核工作的时钟频率。CPU的主频表示CPU内数字脉冲信号振荡的速度,主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(架构、缓存、指令集、CPU的位数、Cache大小等)。由于主频并不直接代表运算速度,因此在一定情况下很可能会出现主频较高的CPU实际运算速度较低的现象。
Q:翻译程序、汇编程序、编译程序、解释程序有什么差别?各自的特性是什么?
A:翻译程序有两种:一种是编译程序,它将高级语言源程序一次全部翻译成目标程序,只要源程序不变,就无须重新翻译。另一种是解释程序,它将源程序的一条语向翻译成对应的机器目标代码,并立即执行,然后翻译下一条源程序语句并执行,直至所有源程序语句全部被翻译并执行完。所以解释程序的执行过程是翻译一句执行一句,并且不会生成目标程序。
汇编程序也是一种语言翻译程序,它把汇编语言源程序翻译为机器语言程序。
编译程序与汇编程序的区别:若源语言是诸如C、C++、Java等“高级语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,则这样的一个翻译程序称为编译程序。若源语言是汇编语言,而目标语言是机器语言,则这样的一个翻译程序称为汇编程序。
Q:不同级别的语言编写的程序有什么区别?那种语言编写的程序能被硬件直接执行?
A:机器语言和汇编语言与机器指令对应,而高级语言不与指令直接对应,具有较好的可移植性。 其中机器语言可以被硬件直接执行。
Q:什么是透明性?透明是指什么都能看见吗?
A:在计算机领域中,站在某类用户的角度,若感觉不到某个事物或属性的存在,即“看”不到某个事物或属性,则称为“对该用户而言,某个事物或属性是透明的”。这与日常生活中的“透明”概念(公开、看得见)正好相反。 例如,对于高级语言程序员来说,浮点数格式、乘法指令等这些指令的格式、数据如何在运算器中运算等都是透明的;而对于机器语言或汇编语言程序员来说,指令的格式、机器结构、数据格式等则不是透明的。 在CPU中,IR、MAR和MDR对各类程序员都是透明的。
Q:字、字长、机器字长、指令字长、存储字长的区别和联系是什么?
A:在通常所说的“某16位或32位机器”中,16、32指的是字长,也称机器字长。所谓字长通常是指CPU内部用于整数运算的数据通路的宽度,因此字长等于CPU内部用于整数运算的运算器位数和通用寄存器宽度,它反映了计算机处理信息的能力。字和字长的概念不同。字用来表示被处理信息的单位,用来度量数据类型的宽度,如x86机器中将一个字定义为16位。 指令字长:一个指令字中包含的二进制代码的位数。 存储字长:一个存储单元存储的二进制代码的长度。 机器字长:计算机能直接处理的二进制数据的位数,机器字长一般等于内部寄存器的大小,它决定了计算机运算的精度
它们都必须是字节的整数倍。 早期的存储字长一般与指令字长、字长相等,因此访问一次主存便可取出一条指令或一个数据。随着计算机的发展,指令字长、字长都可变,但必须都是字节的整数倍。
注意:指令字长一般取存储字长的整数倍,若指令字长等于存储字长 2 倍,则需要 2 次访存才能取出一条指令,这导致取指周期就会是机器周期的 2 倍;若指令字长等于存储字长,则取指周期等于机器周期。
Q:计算机体系结构和计算机组成的区别和联系是什么?
计算机体系结构:是指机器语言或汇编语言程序员所看得到的传统机器的属性,包括指令集、数据类型、存储器寻址技术等,大都属于抽象的属性
计算机组成:是指如何实现计算机体系结构所体现的属性, 它包含对许多对程序员来说透明的硬件细节。例如,指令系统属于结构的问题,但指令的实现即如何取指令、分析指令、取操作数、如何运算等都属于组成的问题。因此,当两台机器指令系统相同时,只能认为它们具有相同的结构,至于这两台机器如何实现其指令,完全可以不同,即可以认为它们的组成方式是不同的。例如,一台机器是否具备乘法指令是一个结构的问题,但实现乘法指令采用什么方式则是一个组成的问题。
Q:基准程序执行得越快说明机器的性能越好吗?
A:一般情况下,基准测试程序能够反映机器性能的好坏。但是,由于基准程序中的语句存在频度的差异,因此运行结果并不能完全说明问题。