11计算机组成原理概述
1.1 计算机概况
计算机由软件和硬件组成
- 计算机硬件是计算机的实体,如主机、外设;计算机软件由具有各类特殊功能的程序组成
- 计算机软件分为系统软件、应用软件
- 系统软件用来管理整个计算机系统,如操作系统、数据库管理系统DBMS、标准程序库、网络软件、语言处理程序(高级语言转化为机器语言)、服务程序(IDE中的调试程序)
- 应用软件是按任务需要所编制成的各种程序,如各种多媒体、通讯聊天软件
现代计算机硬件唯一能识别的数据是二进制0/1
- 低、高电平表示电子设备电流或电压的高低程度,低电平、高电平分别表示0、1,计算机通过电信号的输出实现对数据的传递
- 计算机硬件通过电路完成电信号的输入/输出,每一个电路可以表达一个二进制位。计算机硬件通过很多条印刷电路完成多个二进制位的传递,每个二进制位被称为1bit,1比特
- 逻辑元件是计算机硬件处理电信号的最小单元
机器字长表示计算机一次整数运算所能处理的二进制位数
在计算机系统中,软件和硬件在逻辑上是等效的
- 软件实现成本低,但是效率较低;硬件实现成本高,但是效率高
对于乘法运算,可以设计一个专门的硬件电路实现乘法运算;同时也可以用软件的方式,执行多次加法运算来实现乘法
计算机,按照指令和数据流可划分为以下几类:
- 单指令流和单数据流系统:
- 经典代表为传统冯诺依体系结构
- 单指令流和多数据流系统:
- 如,阵列处理器和向量处理器系统,即超算中心
- 多指令流和单数据流系统:
- 实际上不存在该种计算机系统
- 多指令流和多数据流系统:
- 如,多处理器计算机系统
1.2 计算机发展历程(仅供了解)
计算机发展一方面,微型计算机朝着微型化、网络化、高性能、多用途发展;另一方面,巨型机朝着举行话、超高速、并行处理、智能化发展
超级计算机排行榜 https://www.top500.org
1.2.1 计算机硬件发展
第一代计算机:电子管时代
1946-1957年,逻辑元件为电子管,运算速度在几千-几万次/秒,内存使用汞延迟线、磁鼓,外存使用穿孔卡片、纸带
- 该时期计算机体积超大、耗电量超大,使用机器语言编程
由于早期使用打孔方式编程,细小的洞被虫子堵住了,会导致计算机读取出现问题。而bug英文本意是小虫子,由于这样的原因,程序出bug就表示程序出错,这个说法一直沿用下来
第一台电子数字计算机ENIAC,诞生于1946
- 该计算机由冯诺伊曼参与设计和建设,预计使用1.8w个电子管作为硬件传递数据的电路
- 占地面积约170平方米,耗电量150kw,运算速度5000次加法/秒
第二代计算机:晶体管时代
1958-1964年,逻辑元件为晶体管,运算速度在几万-几十万次/秒,内存使用磁芯存储器,外存使用磁带
- 晶体管的使用,极大降低了计算机的占地面积和耗电量,通过人工焊机几十万个晶体管作为计算机的电路
- 这一时期出现了面向过程的高级语言FORTRAN,同时出现操作系统概念
1947年,贝尔实验室,威廉·肖克利发明了晶体管,被誉为晶体管之父
1955年,肖克利离开贝尔实验室在硅谷创建肖克利实验室股份有限公司
1957年,肖克利的八个徒弟(摩尔、罗伯茨、克莱纳、诺伊
斯、格里尼克、布兰克、赫尔尼、拉斯)辞职,被称为八叛徒traitorous eight,创立仙童半导体公司
1959年,仙童半导体公司发明"集成电路"
1968年,摩尔等人离开仙童,创立Intel
1969年,仙童销售部负责人桑德斯离开仙童,创立AMD
摩尔提出了著名的摩尔定律,揭示了信息技术进步的速度。集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,整体性能也将提升一倍
1970年,仙童公司生产出第一个较大容量的半
导体存储器。
半导体存储器单芯片容量:1KB、4KB、16KB、64KB、256KB、1MB、4MB、16MB、64MB、
256MB、1GB...
第三代计算机:中小规模集成电路时代
1964-1971年,逻辑元件为中小规模集成电路,运算速度在几十万-几百万次/秒,内存使用半导体存储器,外存使用磁带、磁带
- 这一时期计算机主要用于科学计算等专业用途,高级语言迅速发展,出现分时操作系统
第四代计算机:大规模、超大规模集成电路时代
1971-至今,逻辑元件为大规模、超大规模集成电路,运算速度在几千万-万亿次/秒,内存使用半导体存储器,外存使用磁带、磁带、光盘、半导体存储器
- 出现微处理器CPU、微型计算机,个人计算机PC开始出现,操作系统发展为目前主流的Windows、MacOS、Linux
- 该时期通过精密的制造工艺,每个元件的宽度达到纳米级,CPU继承几十亿个晶体管
微型计算机以微处理器技术的发展为标志
intel微处理器从1974-至今,机器字长不断由8位(1974,8080处理器),逐步扩展为16位(1979,8086处理器)、32位(1985,80386处理器)以及如今的64位(1993,Pentium处理器)
1.2.2 计算机软件发展
计算机初期直接使用机器语言,由于机器语言可读性太差,为了方便编程开发出现了汇编语言,后面进一步发展了高级语言如FORTRAN,C,JAVA,Python等。操作系统也由DOS逐步发展为windows,android、ios
1.3 计算机硬件基本组成
数据驱动方式分为控制流驱动、数据流驱动
- 控制流驱动:指令 -> 数据
- 计算机执行操作先取出指令,根据指令的类型来确定需要准备的数据,再取出数据
- 数据流驱动:数据 -> 指令
- 计算机执行操作首先确认需要什么数据,然后再取出所需要的指令,并使用指令对该数据进行操作
1.3.1 早期冯诺依曼机
世界上第一台计算机ENIAC,由于需要手动接线来控制计算,计算效率被操作员的手工耗时所限制
为此,冯诺依曼提出"存储程序"的概念,指将指令以二进制代码的形式事先输入到计算机的主存储器中,然后按其在存储器的首地址执行程序的第一条指令,之后就按程序的规定顺序执行其他指令,直到程序执行结束
世界上第一台采用冯诺依曼结构的计算机是EDVAC,Electronic Discrete Variable Automatic Computer。
早期冯诺依曼机结构中,内部包含输入设备、存储器、运算器、控制器、输出设备。数据、程序(计算步骤)传输到输入设备中,经过运算器计算后传输到输出设备,产生计算结果
- 输入设备用于将信息转换成机器所能识别的形式;输出设备用于将结果转换成人们熟悉的形式。输入、输出设备合称I/O设备
- 运算器用于算数运算、逻辑运算
- 存储器用于存放数据和程序
- 控制器用于指挥程序运行
冯诺依曼机的特点
- 计算机由五大部件组成
- 指令和数据以同等地位存于存储器,可按地址寻址
- 指令和数据用二进制表示
- 指令由操作码和地址码组成;操作码表示了该指令的用途,地址码表示了该指令的执行结果存放在的位置
- 存储程序
- 以运算器为中心,I/O设备与存储器之间的数据传送均需要通过运算器完成
- 冯诺依曼机的基本工作方式是控制流驱动方式,即先指令,后数据
1.3.2 现代计算机结构
现代计算机考虑到运算器只需要负责计算,转而以存储器为中心进行设计,并且由于大规模集成电路的出现,控制器和运算器集成在同一个芯片中,即中央处理器CPU=运算器+控制器
现代计算机结构中,以存储器为中心
- CPU中,控制器通过控制线指挥运算器进行计算,同时控制器控制主存储器的读写以及I/O设备输入输出
- 主存储器会与CPU进行数据交换,参与运算的数据会送入运算器中进行计算,而进行执行的指令会送入控制器中解析指令的含义并让控制器发出相应的控制信号
- 主存储器也会与I/O设备进行数据交换
现代计算机结构中,将CPU和主存储器合称为主机,I/O设备称之为外部设备。计算机中存储包括主存和辅存,其中辅存一般指硬盘、磁盘等存储设备,辅存是一种I/O设备
1.4 计算机硬件工作原理
主存储器
- 主存储器中通过存储体进行数据的存放,由存储元件组成。数据在存储体中按地址保存在存储单元中,且每个地址对应一个存储单元
- 存储单元:每个存储单元存放一串二进制代码,一般容量为8bit的整数倍
- 存储元:存储二进制的电子元件(电容),每个存储元可存1bit
- 存储字word:存储单元中二进制代码的组合
- 存储字长:存储单元中二进制代码的位数
- 地址寄存器MAR,Memory Address Register,MAR的位数反映了存储单元的个数
- 4位MAR表示共有\(2^4\)
- 数据寄存器MDR,Memory Data Register,MDR的位数和存储字长相同,即每个存储单元中的存储元数量
- 16位MDR表示每个存储单元可存放16bit,即一个字=16bit
注:MAR、MDR属于主存储器中的部件,但现代计算机通常将MAR、MDR集成在CPU内
运算器
- 用于实现加减乘除等算术运算,以及与、非等逻辑运算
- ACC累加器,Accumulator:用于存放操作数或运算结果
- MQ乘商寄存器,Multiple-Quotient Register:在乘、除运算中,用于存放操作数或运算结果
- X通用的操作数寄存器/通用寄存器:用于存放操作数,可能有多个通用寄存器
- ALU算数逻辑单元,Arithmetic and Logic Unit:通过内部复杂的电路实现算数运算、逻辑运算
注:在运算器中,由于一定要和存储组件发生数据交换,因此一定存在于存储器的数据通路,该数据通路可能是总线结构,也可能是专用的数据通路
现代计算机均采用总线结构,因为专用数据通路控制起来更复杂,成本更高
控制器
- CU控制单元,Control Unit:分析指令,给出控制信号
- IR指令寄存器,Instruction Register:存放当前执行的指令
- PC程序计数器,Program Counter:存放下一条指令的地址,并且具有自动加一的功能
- cpu完成一条指令的过程包括取指令(PC)-分析指令(IR)-执行指令(CU);取指令、分析指令过程也可合并为取指操作
1.4.1 计算机工作原理
高级语言代码通过编译执行后,装入内存中
int a=2,b=3,c=1,y=0;
void main(){
y=a*b+c;
}
假设该段代码主存地址从0开始存放,代码段连续存放,全局变量存放在额外分区中
- 代码段中主程序
y=a*b+c,拆解为几个步骤,每个步骤对应一条指令,并连续存储在主存地址0、1、2、3、4- 取数a至ACC。操作码为000001,地址码为0000000101
- 乘b得ab ,存于ACC中。操作码为000100,地址码为0000000110
- 加c得ab+c,存于ACC中。操作码为000011,地址码为0000000111
- 将ab+c,存于主存单元。操作码为000010,地址码为0000001000
- 程序结束。操作码为000110,地址码为0000000000
- 第一行代码中a,b,c,y四个全局变量进行声明与初始化,假设分别存放在主存地址的5、6、7、8位置上

假设PC向MAR传入数据过程为#1,MAR向存储体传入数据过程为#2,存储体向MDR传入数据过程为#3,MDR向IR传入数据过程为#4,IR向CU传入数据过程为#5,IR向MAR传入数据过程为#6,MAR向存储体传入数据过程为#7,存储体向MDR传入数据过程为#8,MDR向ACC传入数据过程为#9
取指令包括#1 ~ #4,分析指令为#5,执行取数指令包括#6 ~ #9

-
程序执行开始,(PC)=0,指向第一条指令的存储地址
"()"表示取寄存器中的内容
-
1 (PC)->MAR,将第一条指令的地址传入寄存器MAR,MAR指向第一条指令的存储地址0
-
3 M(MAR)->MDR,将指令存储地址中的内容从主存中传入寄存器MDR
"M()"表示从存储器中读取相应地址的内容
-
4 (MDR)->IR,寄存器MDR的内容传入寄存器IR,导致(IR)=0000010000000101B
-
5 OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是"取数"指令
-
6 Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=5
-
8 M(MAR)->MDR,导致(MDR)=0000000000000010B=2
-
9 (MDR)->ACC,导致(ACC)=0000000000000010B=2
-
-
上一条指令取指后PC自动+1,(PC)=1;执行后,(ACC)=2
-
1 (PC)->MAR,导致(MAR)=1
-
3 M(MAR)->MDR,导致(MDR)=0001000000000110B
-
4 (MDR)->IR,导致(IR)= 0001000000000110B
-
5 OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是"乘法"指令
"OP()"表示取操作码
-
6 Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=6
-
8 M(MAR)->MDR,导致(MDR)=0000000000000011B=3
-
9 (MDR)->MQ,导致(MQ)=0000000000000011B=3
-
10 (ACC)->X,导致(X)=2
-
11 (MQ)*(X)->ACC,由ALU实现乘法运算,导致(ACC)=6,如果乘积太大,则需要MQ辅助存储
-
-
上一条指令取指后(PC)=2,执行后,(ACC)=6
-
1 (PC)->MAR,导致(MAR)=2
-
3 M(MAR)->MDR,导致(MDR)= 0000110000000111B
-
4 (MDR)->IR,导致(IR)= 0000110000000111B
-
5 OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是"加法"指令
-
6 Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=7
"Ad()"表示取地址码
-
8 M(MAR)->MDR,导致(MDR)=0000000000000001B=1
-
9 (MDR)->X,导致(X)=0000000000000001B=1
-
10 (ACC)+(X)->ACC,导致(ACC)=7,由ALU实现加法运
-
-
上一条指令取指后(PC)=3,执行后,(ACC)=7
-
1 (PC)->MAR,导致(MAR)=3
-
3 M(MAR)->MDR,导致(MDR)=0000100000001000B
-
4 (MDR)->IR,导致(IR)= 0000100000001000B
-
5 OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是"存数"指令
-
6 Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=8
-
7 (ACC)->MDR,导致(MDR)=7
-
9 (MDR)->地址为8的存储单元,导致y=7
-
-
上一条指令取指后(PC)=4
-
1 (PC)->MAR,导致(MAR)=3
-
3 M(MAR)->MDR,导致(MDR)=0001100000000000B
-
4 (MDR)->IR,导致(IR)= 0001100000000000B
-
5 OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是"停机"指令
利用中断机制通知操作系统终止该进程
-
总结取数指令过程,即从主存总指定地址处取数
- 取指令
- (PC)->MAR
- M(MAR)->MDR
- (MDR)->IR
- 分析指令
- (PC)+1->PC
- OP(IR)->CU
- 执行指令
- Ad(IR)->MAR
- M(MAR)->MDR
- (MDR)->ACC
1.4.2 从C语言源程序到可执行文件
- 开发人员进行编程,这些代码文件(如.cpp后缀文件)称之为源程序
- 源程序通过预处理器,将宏定义(如C语言中的#开头处理)等预处理操作进行复写,得到预处理后的源程序(如.i后缀文件)
- 预处理后的源程序通过编译器,将源程序翻译成汇编语言,得到汇编语言程序(如.s后缀文件)
- 汇编语言程序通过汇编器,将汇编语言翻译成二进制机器语言,得到机器语言程序/目标模块(如.o后缀文件)
- 目标模块与其他被引用的目标模块,通过链接器,将多个相关的目标模块链接成完整的可执行程序,才得到最终的可执行文件.exe
可执行文件都存放在I/O设备中,当运行可执行文件时,会将文件从外存调入主存,CPU则可以运行该程序。运行过程中,可通过输入设备对程序运行过程进行干预,程序运行过程的结果也可以通过输出设备进行打印输出
由于程序执行过程中的所有操作指令都存储在主存中,程序的执行过程就是寄存器PC不断的取指令,指令译码,取操作数执行,最后将结果存入相应的存储器,该过程就是存储程序的工作方式
1.5 计算机软件
软件运行在硬件之上,用户并不直接使用硬件而是使用软件
软件分为应用软件和系统软件
- 应用系统是为了解决某个应用领域的问题而编制的程序
- 系统软件负责管理硬件资源,并向上层应用程序提供基础服务
开发人员编写的高级语言,通过编译程序/编译器翻译成汇编语言,再通过汇编程序/汇编器最终翻译成机器可以直接识别的机器语言
- 有些高级语言可通过编译程序/编译器直接翻译成机器语言,还有些高级语言也可通过解释程序/解释器直接翻译成机器怨言
- 编译程序是将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序,因此只需翻译一次
- 解释程序是将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句,因此每次执行都要翻译
编译器、汇编器、解释器,可统称为翻译程序
软件和硬件的逻辑功能等价性:同一个功能,既可以用硬件实现(性能高成本高),也可以用软件实现(性能低成本也低)。为了综合考虑成本和性能,需要对计算机软件、硬件层面做出明确的区分,提出了指令集体系结构概念
- 指令集体系结构(ISA,Instruction Set Architecture):软件和硬件之间的界面。设计计算机系统的ISA,就是要定义一台计算机可以支持哪些指令,以及每条指令的作用是什么、每条指令的用法是什么
1.6 计算机系统层次结构
- 传统/使用机器语言的机器\(M_1\)只能识别和执行二进制机器指令
- 在实现过程中可将这些机器指令再次细分为由硬件之间执行的微指令,微指令构成了更底层的微程序机器/微指令系统\(M_0\),为传统机器\(M_1\)提供服务
- 为了方便后续开发人员能够直接使用这些机器指令,在传统机器\(M_1\)存在一个虚拟的操作系统机器\(M_2\),向上提供系统调用服务
- 对于使用汇编语言/助记符号的开发人员,他们将计算机视为汇编语言的机器\(M_3\)。实际上这里的概念是一台虚拟机器,开发人员直接把他作为可以直接识别汇编语言的机器,底层的实现对开发人员完全透明
- 同理,对于使用高级语言的开发人员,他们也将计算机虚拟为一台可以直接识别高级语言的机器\(M_4\)
\(M_0,M_1\)为硬件层面,\(M_2,M_3,M_4\)为软件层面。下层为上层的基础,上层是下层的扩展
比较两个概念的异同
- 计算机体系结构:机器语言程序员所见到的计算机系统的属性概念性的结构与功能特性,包括指令系统、数据类型、寻址技术、I/O机理
讨论如何设计硬件与软件之间的接口,如有无乘法指令
- 计算机组成原理:实现计算机体系结构所体现的属性,对程序员"透明",包括具体指令的实现
在计算机概念中,透明是指不可见
讨论如何用硬件实现所定义的接口,如怎么实现乘法指令
现如今计算机结构,按照指令和数据是否分开存储分为以下几类(考研范围内提及的):
- 冯诺依曼结构:
- 采用存储程序,指令与数据均存放在程序内
- 哈佛结构:
- 使用两个独立的存储体,将指令、数据分开存放
1.7 计算机性能指标
兼容:
- 指计算机软件或硬件的通用性,即使用或运行在某个型号的计算机系统中的硬件,软件也能应用在另外一个型号的计算机系统时,则成这两台计算机的硬件或软件上存在兼容性
1.7.1 存储器的容量
MAR的位数反映存储单元的个数,即最多支持多少个比特位
- n个二进制位能够表示\(2^n\)中状态,即可以存储\(2^{32}\)个信息
- 在描述存储器容量时,\(2^{10}\):K,\(2^{20}\):M,\(2^{30}\):G,\(2^{40}\):T
MDR的位数=计算机存储字长=每个存储单元的大小
总容量 = 存储单元个数 x 存储字长 bit
= 存储单元个数 x 存储字长/8 Byte
- 1Byte=8bit
例如,MAR为32位,MDR为8位,总容量=\(2^{32}\) * 8 bit=4GB
1.7.2 CPU主频
CPU主频表示CPU内数字脉冲信号振荡的频率,单位为赫兹HZ
每个脉冲信号的时间周期称为CPU时钟周期,单位为微秒us,纳秒ns
- CPU主频/时钟频率 = \(\frac{1}{CPU时钟周期}\)
CPI,Clock cycle Per Instruction,指执行一条指令所需的时钟周期数
- 同一个CPU,对于不同的指令CPI不同;甚至对于相同的指令CPI也有可能变化
- 计算机的系统结构、指令集、计算机组织对CPI都会造成影响,时钟频率对CPI没有任何影响
一条指令的实际CPI除了CPU以外,主存、辅存的使用频率以及占用情况,实际的任务执行情况都会影响C实际的CPI
- 一般情况,执行一条指令的平均耗时 = CPI x CPU时钟周期
CPU执行时间(整个程序的耗时) = \(\frac{CPU时钟周期数}{CPU主频}\) = \(\frac{指令条数 * CPI}{CPU主频}\)
IPS,Instructions Per Second,指每秒执行多少条指令
- IPS = \(\frac{CPU主频}{平均CPI}\)
- 除了IPS指标以外,还有KIPS,MIPS,分别表示每秒执行多少千条、兆/百万条指令
FLOPS,Floating-point Operations Per Second,指每秒执行多少次浮点运算
- 除了FLOPS指标外,还有KFLOPS,MFLOPS,GFLOPS,TFLOPS,PFLOPS,EFLOPS,ZFLOPS,类似于KIPS,MIPS概念
注:这里的K、M、G、T 为数量单位,区别于容量使用的记号。K=Kilo=千=\(10^3\),M=Million=百万=\(10^6\),G=Giga=十亿=\(10^9\) ,T=Tera=万亿=\(10^{12}\),P=\(10^{15}\),E=\(10^{18}\),Z=\(10^{21}\)
1.7.3 计算机系统整体性能指标
数据通路带宽,指数据总线一次所能并行传送信息的位数。各硬件部件通过数据总线传输数据
- 假设数据通路带宽为8bit,而MDR为16bit,则CPU每次读入一个数据需要传输两次
吞吐量,指系统在单位时间内处理请求的数量
- 它取决于信息能多快地输入内存,CPU能多快地取指令,数据能多快地从内存取出或存入,以及所得结果能多快地从内存送给一台外部设备。然而这些步骤都与主存有关,因此系统吞吐量主要取决于主存的存取周期
- 相比时钟频率这种参数而言,对用户更加直观的就是吞吐率/吞吐量,能够直接感受到的正确处理的速率
响应时间,指从用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待时间
- 通常包括CPU时间(运行一个程序所花费的时间)与等待时间(用于磁盘访问、存储器访问、I/O操作、操作系统开销等时间)
机器字长表明了计算机可以同时处理最大的二进制位数,同时也代表了计算机的运算精确度,一定程度上也反映了计算机的性能
计算机系统整体性能可通过动态测试进行评估,一般采用基准程序。
- 基准程序是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同程序的其它计算机性能进行比较
- 基准程序即跑分软件
- 主频高的CPU不一定比主频低的CPU快,还取决于CPI的大小
- 同时尽管主频、CPI均相同的计算机,也需要看两个计算机指令系统如何设计。假如其中一台支持乘法指令,而另一台只能通过执行多次加法来实现乘法,那么两者效率就不同
- 基准程序种语句存在频度差异,运行结果的好坏不能完全说明计算机的性能强弱
扩展:
- 现代设计高性能计算机的中重要技术途径是采用并行处理技术
- 提高CPU主频、扩大主存在早期计算机性能不强的阶段,提升幅度比较客观,但是如今两个硬件的性能已经很强的前提下,继续提高主频、扩大主存的提升极其有限
本文来自博客园,作者:GK_Jerry,转载请注明原文链接:https://www.cnblogs.com/GKJerry/articles/18305852

浙公网安备 33010602011771号