计算机组成(一)计算机概述
计算机系统性能的好坏,很大程度上是由软件的效率和作用来表征的,而软件性能的发挥又离不开硬件的支持。对于某一个功能,其既可以用软件实现,又可以用硬件实现,这叫做软硬件在逻辑上是等效的。在设计计算机系统时,要进行软硬件的功能分配。通常来说,如果一个功能使用较为频繁而且用硬件实现的成本较为理想,应该采用硬件来实现,因为硬件实现的效率一般比较高。
计算机硬件
冯诺依曼基本思想
冯诺依曼在研究EDVAC时,提出了“存储程序”的概念。“存储程序”的思想奠定了现代操作系统的基本结构,以此概念为基础的各类计算机统称为冯诺依曼机。其特点如下:
- 采用“存储程序”的工作方式。
- 计算机硬件系统由运算器,控制器,存储器,输入设备和输出设备五大部件组成。
- 指令和数据同等地位存储在存储器中,形式上没有区别,而计算机能依靠指令周期的不同阶段来区分它们。
- 指令和数据都用二进制表示,指令由操作码和地址码组成,操作码指出操作的类型,地址码指出操作数的地址。
“存储程序”的基本思想是:将事先编制好的程序和原始数据送入主存后才可以执行,一旦程序被启动执行,就无需操作人员的干预了。
其基本工作方式是:控制流驱动方式。
计算机的功能部件
输入设备
输入设备的主要功能是将程序和数据以机器所能识别和接受的信息形式输入计算机。最常用也最基本的输入设备是键盘。
输出设备
输出设备的主要任务是将计算机处理的结果以人们能接受的形式或其他系统所要求的信息形式输出。最常见,最常用的输出设备是显示器,打印机等。
存储器
存储器分为主存储器(又称内存储器)和辅助存储器(又称外存储器)。CPU能够直接访问的存储器是主存储器。辅助存储器用于帮助主存储器记忆更多的信息,辅助存储器中的信息必须调入主存才能够被CPU访问。
主存储器的工作方式是按照存储单元的的地址进行存取,这种存取方式称为按地址存取。
主存储器的最基本组成如图所示。
存储器存放二进制数据,地址寄存器(MAR)存放访存地址,经过地址译码后找到对应的存储单元。
数据寄存器(MDR)用于暂存要从存储器中读或者写的信息。
时序控制逻辑用于产存储器操作所需要的各种时序信号。
存储体由许多存储单元组成,每个存储单元包含若干存储元件,每个存储元件存储一位二进制代码。因此存储单元可存储一串二进制代码,称这串代码叫做存储字,这串代码的存储长度为存储字长,需要是1B(8bits)的整数倍。
我们通常所说的,32位机器,指的是字长,也叫做机器字长。所谓字长,通常指的是CPU内部用于整数运算的数据通路的宽度,也就是计算机进行一次整数运算(即定点整数运算,这个概念后面章节再回来讲)所能处理的二进制数据的位数,通常与CPU的寄存器位数,加法器有关。因此字长一般等于内部寄存器大小,字长越长,数据表示范围越大,计算精度越高。
字长和字的概念不同,字用来表示被处理信息的单位,用来度量数据类型的宽度,如x86中定义一个字为16位。
指令字长:一个指令字中包含的二进制代码的位数。
存储字长:一个存储单元存储的二进制代码的位数。
它们都必须是字节的整数倍。
指令字一般取存储字长的整数倍,若指令字长等于存储字长的2倍,则需要两个访存周期来取出一条指令。若指令字长等于存储字长,则取指周期,等于机器周期。
MAR用于寻址,其位数对应存储单元的个数,如MAR位10位,则有2^10 = 1024个存储单元,即为1k,能存储的信息即为 1k*存储字长。
这里应该不考虑虚拟地址,走到MAR的已经是转换之后的物理地址了。
MAR的长度和PC的长度相同,都是用来存储地址的。只不过PC存储的地址指向的存储器中的内容一定是一条指令。
MDR的长度和存储字长相等,一般为字节的二次幂的整数倍。因为MDR的作用是暂存要从存储器中读或者写的内容,所以一般来说,每次从存储器中读写的长度都是一个存储字长。
那么数据总线的常数是不是就应该和MDR的长度是相同的?
注意,MAR和MDR虽然是存储器的一部分,但是现代计算机一般把它们做进了CPU中。
运算器
运算器是计算机的执行部件,用于进行算数运算和逻辑运算。
运算器的核心是算术逻辑单元(Arithmetic and Logic Unit, ALU)。运算器包含若干通用寄存器,用于暂存操作数和中间结果,如累加器(ACC),乘商寄存器(MQ),操作数寄存器(X),变址寄存器(IX),基址寄存器(BR)等,前三个寄存器是必须的。
运算器内部还有程序状态寄存器(PSW),也叫做标志寄存器,用于存放ALU运算得到的一些标志信息或者处理机的状态信息,如结果是否溢出,有无产生进位或者错位等。
控制器
控制器是计算机的指挥中心,由其指挥各部件自动协调地进行工作。
控制器由程序计数器(PC),指令寄存器(IR)和控制单元(CU)组成。
PC用于存放当前欲执行指令的地址,可以自动加1形成下一条指令的地址,它与主存MAR之间有一条直接通路。
IR用于存放当前的指令,其内容来自主存的MDR。指令中的操作码OP(IR)送到CU,用于分析指令并发出各种微操作命令序列;而地址码Ad(IR)送往MAR,用于取操作数。
上面提到过,指令字长可以是存储字长的整数倍,所以IR的长度可以是MDR的整数倍,也就是可能一个指令要取多次。
一般将运算器和控制器集成到同一个芯片上,称为中央处理器。
CPU包含ALU,通用寄存器组GPRs,PSW,控制器,IR,PC,MAR,MDR等。
上图是一个CPU的简单架构图,通过上图,我们简单分析下一条指令的执行过程:
- PC寄存器中指出下一条指令的地址,通过MAR放到地址总线。
- 控制器发出读命令到控制总线。
- 根据地址总线指出的地址,从主存储器中获取指令,放到数据总线上。
- 因为控制总线表明现在是读命令,所以从数据总线上读取指令到MDR中,然后放到IR中
- IR将OP(操作码)放到CU去解析,然后将Ad(地址码)放到MAR中,然后再从内存中获取数据,在放到MDR中,再将数据放到GPRs。
- 如果指令解析成功,数据也放到了通用寄存器,就可以使用ALU进行运算了。
计算机软件
系统软件和应用软件
系统软件是一组保证计算机系统高效正确运行的基础软件,通常作为系统资源提供给用户。
系统软件主要有操作系统,数据库管理系统(DBMS),语言处理系统,分布式软件系统,网络软件系统,标准库程序,服务性程序等。
应用软件是指为用户解决某个应用领域中的各类问题而编制的程序。
三个级别的语言
- 机器语言
- 汇编语言
- 高级语言
由于计算机无法直接理解和执行高级语言,需要将高级语言转换成机器语言的程序。通常我们将进行这种转换的程序叫做翻译程序。翻译程序分为三类:
- 汇编程序(汇编器)。将汇编语言翻译成机器语言。
- 解释程序(解释器)。将源程序中的语句按照执行顺序逐条翻译成及其指令并立即执行。
- 编译程序(编译器)。将高级语言翻译成汇编语言或机器语言。
解释程序并没有在内存中生成一个完整地翻译好的程序。
软件和硬件的逻辑功能等价性
硬件实现的往往是最基本的算术和逻辑功能,而其他功能大多数是通过软件扩充的。
对于某一个功能来说,它既可以由硬件实现,又可以通过软件实现,从用户角度看,它们在功能上是等价的,这叫做软硬件逻辑功能上的等价性。
等价性是计算机系统设计的重要依据。当设计计算机系统时,我们要从多方面考虑某个功能是用硬件实现还是软件实现。
计算机系统的层次结构
- 第1级是微程序机器层,这是一个实在的硬件层,它由机器硬件直接执行微指令。
机器指令和微指令的关系归纳如下:
一条机器指令对应一个微程序,这个微程序是由若干条微指令构成的。因此,一条机器指令的功能是若干条微指令组成的序列来实现的。简而言之,一条机器指令所完成的操作划分成若干条微指令来完成,由微指令进行解释和执行。
从指令与微指令,程序与微程序,地址与微地址的一一对应关系上看,前者与内存储器有关,而后者与控制存储器(它是微程序控制器的一部分。微程序控制器主要由控制存储器、微指令寄存器和地址转移逻辑三部分组成。其中,微指令寄存器又分为微地址寄存器和微命令寄存器两部分)有关,与此相关也有相对应的硬设备。
从一般指令的微程序执行流程图可以看出。每个CPU周期就对于一条微指令。这就告诉我们怎么设计微程序,也将使得我们进一步体验到机器指令很微指令的关系。
- 第2级是传统机器语言层,也是一个实际的机器层,有微程序解释机器指令系统。
- 第3级是操作系统层,它由操作系统程序实现,操作系统程序是由机器指令和广义指令组成。这些广义指令是为了扩展机器功能而设置的,由操作系统定义和解释的软件指令,所以这一层也称为混合层。
广义指令的具体内容,可以看操作系统的时候再深究。
- 第4层是汇编语言层,它为用户提供一种符号化的语言,借此可编写汇编语言程序,这一层是由汇编程序支持和执行的。
- 第5级是高级语言层,它是面向用户的,是为方便用户编写应用程序而设置的,该层有高级程序编译程序支持和执行。
在高级语言层之上,还可以有应用程序层。
没有配备软甲你的纯硬件系统称为裸机。第3-5层称为虚拟机,简单来说,就是软件实现的机器。
层次之间关系密切,下层是上层的基础,上层是下层的扩展。
计算机系统的工作原理
“存储程序”工作方式
该方式规定,程序执行前,需要将程序包含的指令或数据送入主存,一旦程序被启动执行,就无须操作人员干预,自动逐条完成指令的取出和执行任务。
每条指令的执行过程包括:从主存取指令,对指令进行译码,计算下条指令地址,取操作数并执行,将执行结果送回存储器。
这里的指令,就是上面说的机器指令,它分为多步,每一步称为微指令。
取指令的时间,一般叫做机器周期,又叫做CPU周期
从源程序到可执行文件
在计算机中编写C语言程序时,都必须被转换成一系列的低级机器指令,这些指令按照一种称为可执行目标文件的格式打包好,并以二进制磁盘文件的形式存放起来。
以UNIX的GCC为例:
- 预处理阶段:预处理器(cpp)对于源程序中以#开头的命令进行处理,如将#include命令后面的.h文件内容插入到程序文件。输出结果是一个以.i为扩展名的源程序。
- 编译阶段:编译器(ccl)对预处理后的源程序进行编译,生成一个汇编语言源程序hello.s。汇编语言源程序中的每条语句都以一种文本格式描述了一条低级机器语言指令。
- 汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一个称为可重定位目标文件的hello.s,是一种二进制文件。
- 链接阶段:链接器(ld)将多个可重定位目标文件和标准库函数合并为一个可执行目标文件,或者简称为可执行文件。
程序执行过程的描述
在UNIX中,我们可以通过shell命令行解释器来执行程序,通过shell命令行解释执行程序过程如下:
1 | ./hello |
Shell程序将用户从键盘输入的每个字符逐一读入CPU寄存器(对应1),然后保存到主存储器中,在主存的缓冲区形成字符串“./hello”(对应2)。收到Enter后,shell调出系统的内核程序,由内核加载磁盘上的可执行文件hello到主存(对应3)。内核加载完成可执行文件中的代码和数据(这里是字符串“hello,world!\n”)后,将hello的第一条指令地址送至PC,CPU随后开始执行hello程序,它将已加载到主存的字符串中的每个字符从主存取到CPU的寄存器中(对应4),然后将CPU寄存器中的字符送到显示器中(对应5)。
这里说的直接送进PC这件事不是那么简单放进去就行了,会涉及到进程的切换。
指令执行过程的描述
可执行文件代码段是由一条一条的机器指令构成的,指令是用0和1表示的一串序列,用来表示CPU完成一个特定的原子操作。
例如取数指令从存储单元中取出一个数据送到CPU的寄存器中,存数指令将寄存器的内容写入到一个存储单元中,ALU指令将两个寄存器中的内容进行某种算术或逻辑运算后送到一个CPU寄存器中。以取数指令为例,取出后送至ACC,其信息流为:
- 取指令:PC -> MAR -> M -MDR -> IR
- 分析指令:OP(IR) -> CU
- 执行指令: Ad(IR) -> MAR -> M -> MDR -ACC
计算机的性能指标
字长
这个前面提到过了,可以看一下前面的内容
数据通路带宽(数据字长)
指数据总线一次所能并行传递的信息的位数,这里所说的数据通路宽度指的是外部数据总线啊宽度,它与CPU内部的数据总线宽度(内部寄存器大小)可能并不同
主存容量
指的是主存储器所能存储信息的最大容量,通常以字节来衡量,也可以用字数字长(如512K16位)来表示存储容量。
MAR的位数反应的是可寻址的最大范围,并不一定是实际存储器的容量。
如MAR长度为16位,表示有2^16 = 65536个存储单元,也就是64K。若MDR为32位,说明存储字长为32位,则存储容量为64K * 32b。
运算速度
- 吞吐量。指系统在单位时间内处理请求的数量。它取决于信息能多快地输入内存,CPU能多快地取指令,数据能多快地从内存存取,以及结果多快地从内存送到外部设备。几乎每一步都关系到主存,所以系统吞吐量主要取决于主存的存取周期。
- 响应时间。指从用户向计算机发送一个请求,到系统对该请求做出相应并获得所需要的结果的等待时间。通常包括CPU时间(运行一个程序花费的时间)与等待时间(用于磁盘访问,存储器访问,I/O操作,操作系统开销等时间)。
- CPU时钟周期:通常为节拍脉冲或T周期,是主频的倒数,是CPU中最小的时间单位,执行指令的每个动作最少需要一个时钟周期。
一个指令(机器指令)由多个微指令组成,每个微指令至少需要一个时钟周期,取指令(根据PC执行机器指令的第一步,取出指令,也是一个微指令)的时间,叫做机器周期,也叫CPU周期
- 主频(CPU时钟频率)。通常以赫兹(Hz)为单位。同型号的计算机,主频越高,完成一个指令用的时间越短。
- CPI(Clock cycle Per Instruction):即执行一条指令所需要的时钟周期数。
- CPU执行时间,指运行一个程序所花费的时间
CPU执行时间 = CPU时钟周期数/主频 = (指令条数 * CPI)/ 主频。
CPU性能(CPU执行时间)由三个要素决定:主频,CPI和指令条数。
相同的指令,不同架构的CPU实现方式可能不同,所需要的CPI可能是不同的。
上述三者可能会相互制约。
- MIPS(Million Instructions Per Second):每秒执行多少百万条指令
MIPS = 指令条数/(执行时间 * 10 ^ 6) = 主频/(CPI * 10^6)
平均指令周期 = 1 / MIPS
- MFLOPS,GFLOPS,TFLOPS,PFLOPS,EFLOPS,ZFLOPS:MFLOPS(Millon Floating-point Operations Per Second),即每秒多少百万次浮点数运算
MFLOPS = 浮点数运算次数/(执行时间* 10 ^ 6),后面的依次差10^3数量级
基准程序
基准程序(Benchmarks)专门用来进行性能评级的一组程序。
但是并不一定可靠,硬件系统设计人员或者编译器开发者可能针对这段程序进行特殊优化。