计算机硬件能识别的数据:
计算机硬件唯一能识别的数据 —— 二进制 0/1
用低 / 高电平分别表示 0/1,低电平表示二进制 0,高电平表示二进制 1
通过电信号传递数据
通过很多条电路,可以传递多个二进制数位,每个二进制数位称为 1bit(比特)
# 计算机发展历程
# 什么是计算机系统
计算机系统 = 硬件 + 软件
硬件:计算机的实体,如主机、外设等
软件:由具有各类特殊功能的程序组成
- 系统软件:用来管理整个计算机系统
- Eg:操作系统、数据库管理系统(DBMS)、标准程序库、网络软件、语言处理程序、服务程序
- 应用软件:按任务需要编制成的各种程序
- Eg: 抖音,原神,迅雷等
计算机性能的好坏取决于软硬件功能的总和
# 硬件的发展
发展阶段 | 时间 | 逻辑原件 | 速度 (次 / 秒) | 内存 | 外存 |
---|---|---|---|---|---|
第一代 | 1946-1957 | 电子管 | 几千 - 几万 | 汞延迟线、磁鼓 | 穿孔卡片、纸带 |
第二代 | 1958-1964 | 晶体管 | 几万 - 几十万 | 磁芯存储器 | 磁带 |
第三代 | 1964-1971 | 中小规模集成电路 | 几十万 - 几百万 | 半导体存储器 | 磁带、磁盘 |
第四代 | 1972 - 现在 | 大规模、超大规模集成电路 | 上千万 - 万亿 | 半导体存储器 | 磁盘、磁带、光盘、半导体存储器 |
第一台电子数字计算机:ENIAC(1946 年)
- 逻辑原件:电子管
第一代:电子管时代
第二代:晶体管时代
- 出现面向过程的程序设计语言:FORTRAN
第三代:中小规模集成电路时代
第四代:大规模、超大规模集成电路时代
机器字长:计算机一次整数运算所能处理的二进制位数
摩尔定律:揭示了信息技术进步的速度,集成电路上可容纳的晶体管数目,约每隔 18 个约便会增加一倍,整体性能也将提升一倍
# 软件的发展
机器语言、汇编语言 -> FORTRAN -> PASCAL -> C++ -> Java
DOS -> Windows -> Android,IOS
# 目前的发展趋势
"两级分化":
一极是微型计算机向更微型化、网络化、高性能、多用途方向发展
另一极是巨型化向更巨型化、超高速、并行处理、智能化方向发展
# 计算机硬件的基本组成
# 早期冯诺依曼的结构
"存储程序" 的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束
第一台采用冯诺依曼的计算机 EDVAC
- 输入设备:将信息转化成机器能识别的形式
- 存储器:存放数据和程序
- 运算器:算术运算、逻辑运算
- 输出设备:将结果转化成人们熟悉的形式
- 控制器:指挥程序运行
在计算机系统中,软件和硬件在逻辑上是等效的(E.g: 对于乘法运算,可以设计一个专门的硬件电路实现乘法运算,也可以用软件的方式,执行多次加法运算来实现)
冯诺依曼计算机的特点:
- 计算机由五大部件组成(输入设备、存储器、运算器、输出设备、控制器,统称 I/O 设备)
- 指令和数据以同等地位存于存储器,可按地址寻访
- 指令和数据都是用二进制表示
- 指令由操作码和地址码组成
- 存储程序
- 以运算器为中心(输入 / 输出设备与存储器之间的数据传送通过运算器完成)
# 现代计算机的结构
现代计算机:以存储器为中心
CPU = 运算器 + 控制器
# 各个硬件的工作原理
# 主存储器的基本组成
- 存储体
- 数据在存储体内按地址存储
- 每一个地址对应一个存储单元
- 存储单元:每个存储单元存放一串二进制代码
- 存储字:存储单元中二进制代码的组合
- 存储字长:存储单元中二进制代码的位数
- 存储元:即存储二进制的电子元件,每个存储元可存 1bit
- 例:MAR=4 位,MDR=16 位 -> 一共有 个存储单元,每个存储单元可存放 16bit,1 个字 = 16bit
- 易混淆:1 个字节 = 8bit,1B=1 字节,1b=1bit
- MAR:存储地址寄存器
- MDR:存储数据寄存器
# 运算器的基本组成
运算器:用于实现算数运算 (如:加减乘除)、逻辑运算(如:与或非)
- ACC:累加器,用于存放操作数,或运算结果
- MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果
- X:通用的操作数寄存器,用于存放操作数
- ALU:算数逻辑单元,通过内部复杂的电路实现算数运算、逻辑运算
加 | 减 | 乘 | 除 | |
---|---|---|---|---|
ACC | 被加数、和 | 被减数、差 | 乘积高位 | 被除数、余数 |
MQ | 乘数,乘积低位 | 商 | ||
X | 加数 | 减数 | 被乘数 | 除数 |
# 控制器的基本组成
- CU:控制单元,分析指令,给出控制信号
- IR:指令寄存器,存放当前执行的指令
- PC:程序计数器,存放下一条指令地址,由自动加 1 功能
完成一条指令:
- 取指令(PC) 取址
- 分析指令(IR) 取址
- 执行指令(CU) 执行
# 计算机工作过程示例
int a=2,b=3,c=1,y=0;
void main()
{
y=a*b+c;
}
编译装入主存
主存地址 | 指令 | 注释 | |
---|---|---|---|
操作码 | 地址码 | ||
0 | 000001 | 0000000101 | 取数 a 至 ACC |
1 | 000100 | 0000000110 | 乘 b 得 ab,存于 ACC 中 |
2 | 000011 | 0000000111 | 加 c 得 ab+c,存于 ACC 中 |
3 | 000010 | 0000001000 | 将 ab+c,存于主存单元 |
4 | 000110 | 0000000000 | 停机 |
5 | 0000000000000010 | 原始数据 a=2 | |
:--: | ---------------- | ----------- | |
6 | 0000000000000011 | 原始数据 b=3 | |
7 | 0000000000000001 | 原始数据 c=1 | |
8 | 0000000000000000 | 原始数据 y=0 |
(PC)=0,指向第一条指令的存储地址
(PC)->MAR,导致 (MAR)=0
M (MAR)->MDR,导致 (MDR)=000001 0000000101
(MDR)->IR,导致 (IR)=000001 0000000101
OP (IR)->CU,指令的操作码送到 CU,CU 分析后得知,这是 “取数” 指令
Ad (IR)->MAR,指令的地址码送到 MAR,导致 (MAR)=5
M (MAR)->MDR,导致 (MDR)=0000000000000010=2
(MDR)->ACC,导致 (ACC)=0000000000000010=2
执行后,PC 自加 1,执行下一条指令
后几次指令同样的方式进行操作
取指令和分析指令的操作是必经步骤,执行指令的操作有所不同
CPU 区分指令和数据的依据:指令周期处于不同阶段
# 计算机系统的层次结构
下层是上层的基础,上层是下层的扩展
- 三种级别的语言:
- 高级语言:C/C++,Java
- 汇编语言:助记符
- 机器语言:二进制代码
- 编译程序:将高级语言编写的程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次)
- 解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句(每次执行都需要翻译)
注:编译、汇编、解释程序,可统称为 “翻译程序”
# 存储器的性能指标
MAR 位数反映存储单元的个数(最多支持多少个)
MDR 位数 = 存储字长 = 每个存储单元的大小
总容量 = 存储单元个数 存储字长 bit = 存储单元个数 存储字长 / 8 Bytes
- Eg: MAR 为 32 位,MDR 为 8 位,总容量 =
# CPU 的性能指标
CPU 主频:CPU 内数字脉冲信号振荡的频率
CPU 时钟周期:脉冲信号的周期(单位:微秒,纳秒)
CPU 主频(时钟频率)=1/CPU 时钟周期(Hz)
CPI(Clock cycle Per Instruction):执行一条指令所需要的时钟周期数,不同的指令,CPI 不同。甚至相同指令,CPI 也有可能变化
每一条指令的耗时 = CPUCPU 时钟周期
例:某 CPU 主频为 1000Hz,某程序包含 100 条指令,平均来看指令的 CPI=3。该程序在该 CPU 上需执行多久?
CPU 执行时间(整个程序的耗时)=CPU 时钟周期数 / 主频 =(指令条数 * CPI)/ 主频
IPS (Instructions Per second):每秒执行多少条指令 IPS = 主频 / 平均 CPI
FLOPS (Floating-point Operations Per Second):每秒执行多少次浮点操作
K=10^3,M=10^6,G=10^9,T=10^
# 系统整体的性能指标
数据通路带宽:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
吞吐量:指系统在单位时间内处理请求的数量
- 它取决于信息能多快地输入内存,CPU 能多快地取指令,数据能多快地从内存中取出或存入,以及所得结果能多快地从内存送给一台外部设备。这些步骤中的每一步都关系到主存,因此,系统吞吐量主要取决于主存的存取周期
响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待时间
# 系统整体的性能指标 (动态测试)
基准程序是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同程序的其他计算机性能进行比较
主频高的 CPU 一定比主频低的 CPU 快?
- 不一定,两者 CPI 可能不同,执行时间 =(指令条数 * CPI)/ 主频
若 A、B 两个 CPU 的平均 CPI 相同,那么 A 一定更快?
- 不一定,还要看指令系统,如 A 不支持乘法指令,只能用多次加法实现乘法,而 B 支持乘法指令
基准程序执行得越快说明机器性能越好?
- 不一定,基准程序的语句存在频度差异,运行结果也不能完全说明问题