1.1 计算机系统简介
软硬件概念
计算机系统
计算机的解题过程
电脑的应用程序由高级语言构成,但是计算机不能够直接理解高级语言,所以需要先通过“翻译”,把高级语言转换为计算机可以直接理解的低级语言,才能够执行相关的指令。
计算机系统的层次结构
首先我们知道计算机只能识别低级语言,而低级语言都是由二进制编码,所以编程难度较大,为了更加方便的记忆低级语言,从而出现了汇编语言。
简单的来说,汇编语言也是面向机器的编程语言,区别在于汇编语言采用了助记符号,让程序猿可以更容易理解代码。
汇编语言实际机器同样不能直接识别,所以需要将汇编语言翻译为低级语言,这里用于翻译的机器就被称为“虚拟机器”。
然而汇编语言的编程难度同样很大,所以出现了高级语言。高级语言更容易理解和编程。与汇编语言一样,同样需要虚拟机进行翻译。
高级语言的翻译程序有两种:
- 编译程序
- 解释程序
两者的不同在于:
- 编译程序:一次翻译,多次执行
- 解释程序:一次翻译,一次执行
实际机器完成二进制指令实际还可以划分为多个动作,所以实际机器又可以向下分解为微指令机器M0。
本课程主要研究的就是硬件部分。
计算机体系结构和计算机组成
计算机体系结构
程序员所见到的计算机系统的属性概念性的结构与功能特性。
例如:指令系统、数据类型、寻址系统、I/O机理。 例如:有无乘法指令
计算机组成
实现计算机体系结构所体现的属性
具体执行的实现。 例如:如何实现乘法指令
1.2 计算机的基本组成
冯诺依曼计算机的特点
基本特点
- 计算机由
运算器
、控制器
、输入设备
、输出设备
、存储器
五大部分组成 - 指令和数据以同等的地位存放在存储器当中,并且可以按照地址进行访问
- 指令和数据均由二进制表示
- 指令由操作码和地址码两大部分组成
- 指令在计算机中按照顺序进行存放
- 机器以运算器为核心,输入输出设备与存储器之间通过运算器完成。
传统计算机有第六个特点,也就是以运算器为中心,但是现代计算机普遍以存储器为中心,其余五个特点现代计算机仍然保留。
冯诺依曼计算机硬件构图
冯诺依曼计算机硬件的整体架构分为五个部分:
输入设备
:把外界的信息转化为机器能识别的形式输出设备
:把执行结果输出为人们熟悉的形式存储器
:存储指令和数据- 主存:内存条部分
- 辅存:辅助存储器,包括硬盘,光盘,磁带等
运算器
:做逻辑运算和算数运算- 以
**ALU**
为核心
- 以
控制器
:指挥程序运行- 以
**CU**
为核心
- 以
传统计算机以运算器为核心,数据输入之后先经过运算器,再到存储器,再返回运算器,最后再输出,但是现代计算机并不是以运算为主,所有数据都经过运算器会导致运算器压力过大。
实线代表数据和指令的流动,虚线代表控制信息的流动。
以存储器为中心的硬件构图
现代计算机的普遍硬件架构如下,以存储器为核心。
同时控制器和运算器可以统称为CPU,所以计算器硬件的构成又可以分为三个部分:
- CPU(中央处理单元)
- 存储器
- 输入/输出设备
如果要划分为两部分构成硬件系统,则是主机(CPU再加上存储器的主存部分)+外设(输入输出+辅存)。
整体架构图如下:
计算机的工作步骤
上机前准备
- 建立数学模型
- 确定计算方法
- 编制解题程序
程序:运算的全部步骤 指令:每一个步骤
举个例子:计算ax2 + bx + c
步骤如下:
取x 至运算器中
乘以x 在运算器中
乘以a 在运算器中
存ax^2 在存储器中
取b 至运算器中
乘以x 在运算器中
加ax^2 在运算器中
加c 在运篁器中
运算器中只能做运算,不可以存储数据,所以运算第二次取数据的时候,会覆盖前一次运算完的数据,所以需要在第四步把
ax2
先存入到存储器当中。
采用不同的计算方式可以化简步骤,例如原式可以化为:(ax + b)x + c
,那么步骤就可以是:
取x 至运算器中
乘以a 在运算器中
加b 在运算器中
乘以× 在运算器中
加c 在运算器中
指令构成
前面我们知道,计算的程序都是由指令构成的,所谓指令由下面两部分构成:
- 操作码:用于标记指令执行的是什么动作,例如
000001
表示改指令是取操作
。 - 地址码:用于标记动作执行需要的数据地址。
所以上述计算ax2 + bx + c
的实际指令执行过程如下:
指令和数据存于主存单元的地址 | 指令 | 注释 | |
---|---|---|---|
操作码 | 地址码 | ||
0 | 000001 | 0000001000 | 取x到ACC中 |
1 | 000100 | 0000001001 | 乘a得到ax到ACC中 |
2 | 000011 | 0000001010 | 加b得ax+b到ACC中 |
3 | 000100 | 0000001000 | 乘x得(ax+b)x到ACC中 |
4 | 000011 | 0000001011 | 加C,结果存到ACC中 |
5 | 000010 | 0000001100 | 结果转存于主存储单元 |
6 | 000101 | 0000001100 | 打印结果 |
7 | 000110 | 停机 | |
8 | x | 原始数据x | |
9 | a | 原始数据a | |
10 | b | 原始数据b | |
11 | c | 原始数据c |
这里的
ACC
表示的是寄存器,相当于一个暂时存储数据的地方。
计算机的解题过程
存储器的基本组成
存储器的基本组成如下:
其中存储体包含若干存储单元,每一个存储单元又包含若干存储元件,每一个存储元件代表一个二进制信息(0或者1)。
所以:
- 存储单元:存放一串二进制代码
- 存储字:存储单元中二进制代码的组合
- 存储字长:存储单元中二进制代码的位数
例如:存储单元的存储字为0110,那么存储字长为4。
访问主存实际访问的就是存储体,而访问存储体实际就是按照存储单元的地址进行寻访。
接下来是MAR和MDR:
**MAR**
:存储器地址寄存器(反映存储单元个数)**MDR**
:存储器数据寄存器(反映存储字长)
寄存器相当于数据暂存的地方,所有的数据在存入和取出的时候,都需要经过寄存器。
地址寄存器用于存储数据需要在实际存储体中存放的位置,如果地址寄存器有四位,那么根据二进制编码的组成,就会有24=16种编码组成,16种地址编码就代表了16个存储单元,也就能从地址寄存器的位数反应存储单元的个数。
数据寄存器就是存储真实的数据,所以数据寄存器的字长是多少,就代表存储字长是多少。
假设
MAR
是4位,存储单元有24=16个 假设MDR
是8位,存储字长就是1*8=8
运算器的基本组成和操作过程
运算器的基本组成如下:
其中:ALU
作为逻辑运算单元为核心单元,负责逻辑运算和算数运算,ACC
,MQ
,X
是三个常用的寄存器。
做四则运算存储如下:
ACC | MQ | X | |
---|---|---|---|
加法 | 被加数 + 和 | 加数 | |
减法 | 被减数 + 差 | 减数 | |
乘法 | 乘积高位 + (被乘数) | 乘数 + 乘积低位 | 被乘数 |
除法 | 被除数 + 余数 | 商 | 除数 |
以加法为例:
在执行加法操作之前,一般会先把被加数先取出,存入ACC
当中,再把被加数取出存入X
当中,两个数同时送个ALU
,根据指令的操作码执行加法操作,最后结果返回给ACC
。
其余三则运算类似。
这里需要注意的是ACC
是作为累加寄存器,一开始默认都会存储被加/减/乘/除数
,乘法部分需要一开始把ACC
当中的数据先存入X
当中,也就是[ACC]->X
。
做乘法运算的时候,两个数字相乘可能会导致存储器位数不够存储相乘之后的大数字,所以需要分高位低位进行存储。
控制器的基本组成
控制器想要控制指令的完成,有下面三个步骤:
- 取指令,一般通过
**PC**(程序计数器,本质上也是一个**地址寄存器**)
完成 - 分析指令,一般通过
IR
完成,IR
用于存放当前欲执行的指令 - 执行指令,一般通过
CU
完成PC取指令的过程如下:程序一开始会赋予PC初始的指令地址,指令的地址又是相对连续的,所以PC只要不断使得PC = PC +1,就可以按照顺序执行完所有的指令。 注意这里的指令地址是指令原始的地址,不是指令构成里面的地址码。
主机完成一条指令的过程
我们以取数指令(从存储体当中取出一个数存入ACC中)为例:
介图实在是太麻烦了画的,所以就直接截图看看了。
步骤分析如下:
- 程序一开始给
PC(程序计数器)
赋予初始的指令地址,PC
将地址传入MAR(地址寄存器)
当中。 - 存储体根据
MAR
当中的地址寻访到相应的取数指令。 - 存储体把这条指令返回给
MDR(数据寄存器)
。 MDR
将指令发送给IR(分析指令)
。IR
将分析完的指令发送给CU(执行指令)
,执行取数指令。IR
把指令地址码(注意是地址码,不是地址)存入MAR
。- 存储体根据
MAR
当中的指令地址码(注意是地址码,不是地址)寻访到相应的数据。 - 存储体把这个数据返回给
MDR
。 MDR
将数据发送至ACC(累加寄存器)
当中。上面九个步骤对应图中的九个步骤。 其余指令也类似,就不再赘述。 存数指令如下,就不解析了,应该都看得懂了。
1.3 计算机硬件的主要技术指标
机器字长
CPU一次能处理数据的位数,和CPU中的寄存器位数有关。
虽然之前所说的存储字长也和寄存器位数有关,但机器字长不等同于存储字长。
通常情况机器字长等于存储字长,但是也有可能机器字长大于存储字长。
详情参见:
计算机组成原理——机器字长、指令字长、存储字长白芷加茯苓的博客-CSDN博客数据字长和机器字长相等吗
运算速度
计算机的运算速度有以下几个指标:
- 主频
- 吉普僧法
- MIPS(每秒执行百万条指令)
- CPI(执行一条指令的时钟周期数)
- FLOPS(每秒浮点运算次数)
我觉得这个只要了解就好了,主要我也不想再写了。
存储容量
存储容量分为:
- 主存容量
- 辅存容量
其中主存容量=存储单元个数 * 存储字长
。
例如:MAR有10位,MDR有8位。
那么主存容量 = 210 * 8 = 8Kb
,(注意这里是b
也就是位,换算为B(Byte)
,由1B = 8b
可得主存容量为1KB
)