组成原理学习方法(来自大学老师的总结):
- 抽象课程,联想现实,克服畏难,转变思路。
- 抓住信息流的变换、表示、处理、传送、存储。
- 整体学习,避免孤立。
一.计算机系统简介
1.1 计算机系统的组成
计算机系统由软件和硬件构成,图1-1为计算机系统的基本组成。
![55767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/55767bb1-7a13-eb11-8da9-e4434bdf6706.png)
1.2 计算机系统层次结构
操作系统是一种系统软件,它是与计算机硬件直接打交道的人。我们通常说的操作系统工程师就会接触到底层硬件的驱动开发,就是让操作系统更好的控制各种硬件。
![56767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/56767bb1-7a13-eb11-8da9-e4434bdf6706.png)
图1-2展示了计算机系统的基本层次结构,从这个图当中我们也可以看出一个程序是如何编译运行的。
以C/C++程序为例子:
![57767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/57767bb1-7a13-eb11-8da9-e4434bdf6706.png)
![59767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/59767bb1-7a13-eb11-8da9-e4434bdf6706.png)
一个程序的核心执行流程为编译和汇编,编译就是将特殊的语言例如C++编译为汇编器可以进行翻译的语言(test.s),而汇编器将这种语言汇编为机器语言(test.o)。
机器语言是计算机可以直接执行的代码和语言,主要成分为0和1。
编译笼统上来说是产生目标程序的过程(包括预处理、编译、汇编这些细节过程),也就是从test.c到test.o就是广义的、非正式的编译过程。
1.3 语言分类
1.3.1 语言分级(笼统概念)
目前随着计算机科学水平不断提高,计算机语言已经发展出第四代、第五代甚至更高级的语言。
- 第一代:机器码。也就是上文提到的机器语言,主要成分0、1。冯姓男子曾定下行业标准要用二进制表示指令和数据,因此机器码中既有指令也有数据。
- 第二代:汇编码。机器码都是0、1比较难记,汇编码就是将机器码串改编为助记符。例如: add ax,1。底层就是一串二进制代码。
- 第三代:高级语言。C都是高级语言,C++不用说,Python、JS这些脚本语言不用说,C#、Java这些更“面向对象”(Object-Oriented)的语言更不用说了。
- 第四代:非过程语言。说白了,就是抽象程度更高了,我一句话,就能够自动生成高级语言并有序执行。例如SQL就是比较常见的第四代语言。
- 第五代:智能语言。Prolog,只要给出事实和规则,它会自动分析其中的逻辑关系,然后允许用户通过查询,完成复杂的逻辑运算。
1.3.2 解释型/编译型语言
解释型语言:程序不需要编译,在解释器上运行时,先翻译成中间代码,解释器将中间代码解释为目标指令集进行执行。
编译型语言:程序需要编译,编译成机器码执行。
- 解释型语言和编译型语言的区别主要是是否编译,而不在于是否逐条执行。
举LZ最喜欢的三种语言为栗子。
Scala语言的运行过程:
Scala语言是编译型语言,它的执行需要经过编译,但它是基于JVM平台逐条执行的。也就是每执行一条源码指令就编译成字节码程序在JVM平台上运行。
Python语言的运行过程:
Python语言是解释型语言,需要带着一个解释器。例如:
a=1
先翻译成中间代码,解释器解读并执行。因为我们说源程序到产出机器码的过程才笼统叫做编译,因此这种源程序到中间代码的过程只能描述为“
翻译”。
同类语言:JS、Ruby、PHP等。
Java语言的运行过程:
Java也是一门编译型的语言。源程序文件经过编译之后形成字节码文件(.class),这种字节码文件还不能在操作系统上直接运行,还需要在JVM(Java Virtual Mechine)平台上运行。
二.计算机的基本组成
冯诺依曼冯大佬,被誉为“计算机之父”,20世纪最重要的数学家之一。兴趣爱好为博弈论、计算机、生化武器、原子弹等。
![5c767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/5c767bb1-7a13-eb11-8da9-e4434bdf6706.png)
该冯姓男子创建了一个广为流传、并被“取其精华、弃其糟粕”的计算机结构-----冯诺依曼计算机。
![5e767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p05.5ceimg.com/content/5e767bb1-7a13-eb11-8da9-e4434bdf6706.png)
取其精华:
1/采用存储程序的思路进行工作:将程序按照地址顺序放在内存储器中,运行时,按地址顺序取出存放在内存储器中的指令,并分析执行,当遇到跳转指令时,跳转(cs:ip)到指定地址,再按次序执行。
优点:计算任务能够按序列批量执行。
2/指令和数据都使用二进制表示:物理信号的逻辑就是基于0、1进行传输的。别看我们现在看它很容易,但是把你放到过去,你未必能想到。
3/指令和数据以同等地位存储于存储器,可按地址寻访,其中指令由操作码和地址码组成。
弃其糟粕:
1.使用运算器为中心:什么都要走运算器的流程?我就打印一个Pi运算器都要走半天?那我核心的计算任务就不用干了。
![60767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/60767bb1-7a13-eb11-8da9-e4434bdf6706.png)
冯诺依曼计算机提出了计算机在硬件组成上的五大部件:运算器、控制器、存储器、输入设备、输出设备。
![63767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/63767bb1-7a13-eb11-8da9-e4434bdf6706.png)
- 主存储器包含了ROM和RAM,也就是内存。外存属于外设而不是主存。
三.从计算机处理问题的过程看五大部件
![64767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p02.5ceimg.com/content/64767bb1-7a13-eb11-8da9-e4434bdf6706.png)
STEP1: 取指令
机器启动后,将PC中存储的下一条指令的地址送入MAR,并命令存储器做读操作,存储器读出对应的指令并存入MDR。然后送入IR。
[1] PC -> MAR
[2] [MAR] -> MDR
[3] MDR -> IR
STEP2:分析指令
IR中的指令送入CU进行分析。
[4] OP(IR) -> CU
STEP3:执行指令
例如0000010000001000中分析出000001是取数指令,于是将0000001000送入MDR进行一个取数流程(将数据的地址送入MAR,并命令存储器读数据,将数据存储到MDR)。最后将数取到运算器的ACC中进行下一步操作,PC寄存器加一。
[5] Ad(IR) -> MAR
[6] [MAR] -> MDR
[7] MDR -> ACC
[8] (PC) + 1 -> PC
3.1 主存储器的构成
![67767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/67767bb1-7a13-eb11-8da9-e4434bdf6706.png)
- 存储体:存储体由许多存储单元构成,每个存储单元又包含多个存储元件(触发器或者电容),每个存储元件能够寄存一位的0或者1。
- 存储单元:存放一串二进制代码/数据。一般存储单元的大小为8位。每个存储单元赋予一个地址号,计算机可以按照这个地址号寻访。
- 存储字:几个存储单元组成一个存储字。
- 存储字长:存储单元中二进制代码的位数。存储字长可以是8位、16位、32位等。
主存的工作方式就是按存储单元的地址号存取存储字。这个流程称为地址访问存储器
简称访存
。为了能够实现访存,主存中还必须配置两个寄存器MAR、MDR:
- MAR(Memory Address Register):存储器地址寄存器,用于暂存欲访问的存储单元地址,地址号的长度能够反映存储单元的个数。例如MAR有10位,则存储单元的个数就是2^10个,也就是有1024个存储单元。
- MDR(Memory Data Register):存储器数据寄存器,用于暂存从存储体某单元取出的代码或者准备往某存储单元存入的代码,反映的是存储字长。例如MDR有16位,则存储字长就是16位。
早期的计算机,存储字长=指令字长=数据字长,一次访存可以取出一条数据或者指令。
如今计算机需要适应高精度高内存利用效率的存储,存储字长、指令字长、数据字长可以各不相同。但它们都是字节的整数倍。
3.2 运算器运算流程
![69767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/69767bb1-7a13-eb11-8da9-e4434bdf6706.png)
- ACC(Accumulator):累加器,有特殊用途的二进制八位寄存器。
- MQ(Multiple-Quotient Register):乘商寄存器,在乘、商计算中用于保存计算参数与计算结果的寄存器。
- ALU(Arithmetic and Logic Unit): 算逻单元,是能够实现多组算术运算和逻辑运算的组合逻辑电路。
- X:操作数寄存器,用于暂存参与运算的数,包括加数、减数、被乘数、除数等。
以乘法为例子: 我们要将乘数和被乘数分别放到MQ和X寄存器当中,最终计算结果是乘积高位保存到ACC,低位保存到MQ。
假设计算机读到了指令乘 M
,其详细步骤为:
第一步:将被乘数存入ACC
第二步:[M] -> MQ
第三步:[ACC] -> X
第四步:0 -> ACC
第五步:[X] x [MQ] -> ACC//MQ
3.3 控制器的基本组成
![6b767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/6b767bb1-7a13-eb11-8da9-e4434bdf6706.png)
控制器是计算机的神经中枢,由它指挥各部件自动、协调地工作。
- CU:控制流程,负责计算机的流程控制。
- IR(Instruction Register):指令寄存器,存储下一条需要执行的指令。
- PC(Program Counter):指令计数器,存储下一条要执行指令的地址。
- ID(Instruction Decoder):指令译码器,对指令进行分析解释。
- 时序部件:提供时序功能。
3.4 I/O设备
CPU和主存构成了主机,除主机外的大部分硬件设备都可以称为I/O设备或者外设。
详细的外设知识点可以参照:
【操作系统】总结五(I/O管理) - peterYong - 博客园www.cnblogs.com![6d767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/6d767bb1-7a13-eb11-8da9-e4434bdf6706.png)
四.硬件主要技术指标
4.1机器字长
机器字长:计算机运算部件能够同时处理的二进制数据的位数。机器字长与CPU中的寄存器位数有关。
注意区别存储字长:存储体中存储字的长度位数。
机器字长越长,计算机计算精度越高,针对高精度计算的运算次数越少,运算速度就越快。
常见的机器字长有32位、64位的。
4.2 运算速度
运算速度一般使用主频和MIPS来衡量。
1)MIPS - Million of Instruction Per Second 每秒执行多少百万条指令
2)主频。
主频: CPU在单位时间内发出的脉冲数。单位为MHz。
CPI(Cycle Per Instruction): 执行一条指令所需的时钟周期,也就是机器主频的倒数。
3)Flops
一般超算使用的是Flop/s也就是每秒执行多少次浮点数计算。
![6e767bb1-7a13-eb11-8da9-e4434bdf6706.png](http://p04.5ceimg.com/content/6e767bb1-7a13-eb11-8da9-e4434bdf6706.png)
IBM的Summit尖峰的最大运算速度为每秒完成148600万亿次浮点运算(TFlops)。我国的“神威•太湖之光”峰值运算速度为每秒125435.9万亿次浮点运算(TFlops)。
4.3 存储容量
存储容量 = 存储单元个数 x 存储字长
假设MAR为16位,MDR为32位。则存储单元的个数是2^16也就是65536个存储单元,存储字长为32位,总的存储容量也就是2^16 x 32 = 2M 位。
参考
[1] 系统架构师教程.第四版 P14-18
[2] 计算机组成原理 唐朔飞 第二版 高教社