计算机硬件能识别的数据
低/高电平
用低/高电平分别表示 0/1
我们在计算机内部传递数据就是靠这种电信号来传递的,而硬件传递方式就是针脚。


这些玩意就是针脚,越多高低电平传递越多;同样的,这些东西也是用来导电的。

通过很多条电线,可以传递多个二进制数位,每个二进制位称为1 bit(比特)
二进制0/1
计算机硬件唯一能识别的数据
计算机硬件的基本组成
计算机硬件的基本组成分别为以下两种结构:
- 早期冯诺依曼机的结构
- 现代计算机的结构
冯诺依曼机
什么是冯诺依曼机
早期第一台计算机ENIAC就是冯诺依曼当设计顾问的,这台计算机有一个很大的问题,就是实行任意程序都需要人员来进行手动接线来控制计算。

于是冯诺依曼首次提出了一个概念为:
- “存储程序” 的概念是指
将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他命令,直至程序执行结束。
这大幅地提高了计算机的运算速度,于是世界上第一台采用冯诺依曼结构的计算机EDVAC诞生了。

按照这个理论,我们可以得出早期的冯诺依曼机: - 输入设备:将要输入的指令信息等
转换为机器能识别的形式 - 运算器:转换完的数据通过运算器的中转,将其存储在内存,也就是存储器中,这里最主要是实现
算数运算和逻辑运算 - 存储器:
存放数据和程序 - 输出设备:经过运算器之后,这些数据的运算结果会通过输出设备将
结果转换为人们熟悉的形式 - 控制器:通过
电信号来控制其他部件相互配合的工作,另外控制器也会负责来解析存储器里存储的那些程序指令。比如,控制器读取了存储器是加法还是减法后,才来指挥运算器。所以最主要的就是指挥程序运行
软件和硬件区别
在计算器系统中,软件和硬件在逻辑上是等效的。这是为什么呢?:因为在计算机上对于同一个功能,我们既可以用软件来实现,也可以用硬件来实现。通常来讲,用软件实现的成本更低,但是效率也会更低。而用硬件来实现成本会更高,当然效率也会更高。
冯诺依曼机的六大特点
- 计算机由五大部件组成
- 指令和数据以同等地位(都以二进制)存于存储器,可按地址寻访。
- 指令和数据用二进制表示(更好的用电信号)
- 指令由操作码和地址码组成(操作码就是加减乘除,地址码就是指令要操作的数据在内存在哪)
- 存储程序
是以运算器为中心的
冯诺依曼:- 输入 → 运算器(只搬运,不计算) → 存储器
- 运算时 → 存储器 → 运算器(真正计算) → 存储器
- 输出 → 存储器 → 运算器(又搬运一次) → 输出
现代计算机结构
根据冯诺依曼第六条我们就会发现一个问题,我们的运算器本来就是用以处理这些数据的核心部件,但现在所有的数据中转还需要通过它来完成,这会导致数据计算的效率降低。那么我们的现代计算机结构成功解决了这个问题。

现代计算机的一大特点是:以存储器为中心
在冯诺依曼机中,数据的传输都需要通过运算器作为中转。但是现在计算机它的数据是直接放在存储器中的,当运算器处理完这些数据后,输出设备也会直接从存储器当中取走最终的数据进行计算结果的输出,可以让运算器在有限时间内进行更多的运算。
由于运算器和控制器它们的逻辑关系十分紧密,所以在大规模集成电路制作工艺出现了之后,这两个部件通常是被集成在同一个芯片上。那么整合了这两个芯片的东西叫什么呢?
CPU = 运算器+控制器
我们把现代计算机结构图简化一下,就得到了这个形式:

但这个主机并不是我们生活中见的那个大主机。
运转过程:
- 输入 → 存储器
- 存储器 → 运算器(只在真正计算时才用)
- 运算完 → 存回存储器
- 输出 → 直接从存储器输出
另外一个我们需要注意的是存储器分为主存和辅存: - 主存:运行内存
- 辅存:硬盘

我们的现代计算机结构里面的主机用的是主存,而辅存属于IO设备。
各个硬件的工作原理
看看主机内部的:运算器,控制器和主存储器它们的一些内部细节,以及如何协调工作的。
主存储器的基本组成

主存储器当中包含存储体,MAR和MDR
- MAR:存储地址寄存器(Memory Address Register)
- MDR:存储数据寄存器(Memory Data Register)
那么这三个主要是干什么的呢?我们可以通过下面这个图例来了解:

MAR和MDR寄存器
寄存器其实也是用来存放二进制数据的,只不过MAR和MDR这两个寄存器它们存放的数据各不相同。从名字就可以看出,MAR主要是存储和地址相关的二进制数据;而MDR则是存放实际的数据。
CPU从主存储器读取数据
对于主存储器来说,CPU想要从里面取得一个数据,CPU会提供一个内存地址在MAR,接着从存储体当中根据这个地址找到数据,然后寄存在MDR上,接着从数据线路返回给CPU。
CPU从主存储器存放数据
CPU会指明它想要写入哪个位置,然后想要写入的具体数据会放在MDR当中,最后CPU会通过控制总线告诉主存储器想要执行写操作,最后主存储器会根据CPU发出的这三个信息往对应的位置写入数据。
存储体
数据在存储体内按地址存储的,也就是说我们的一整个存储体,会被分成一个个存储单元,每一个存储单元都会存放一串二进制代码,每个单元存储的一串二进制代码被称为存储字(word)。而每一个存储字包含多少个二进制位,这个信息我们称之为存储字长。

存储单位:每个存储单元存放一串二进制代码,每个存储单元都会对应一个地址信息存储字:存储单元中二进制代码的组合,字(word)并不算是字节(Byte)(8bit)存储字长:存储单元中二进制代码的位数- 存储元:即存储二进制的电子元件(电容),每个存储元可存1bit
通常每个存储单元可以存放的二进制数都是8bit的整数倍
这样我们也可以得知: - MAD位数反映存储单元的个数
- MDR位数 = 存储字长
eg:
MAR = 4位 -> 总共有$2^4$个存储单元
MDR = 16位 -> 每个存储单元可存放16bit = 一个字的大小
易错点:
- 字(word)并不等于 字节(Byte)
- 字节固定8bit大小
- 字节单位为B,比特单位为b
eg:
100Mbps下载速度也就是每秒下载100万比特,而我们除8就可以获得MBps,也就是MB/S
运算器的基本组成

运算器:用于实现算术运算(如:加减乘除),逻辑运算(如:与或非)
- ACC:累加器,用于存放加减乘除或者逻辑运算的操作数,或运算结果
- MQ:乘商寄存器,在乘、除运算时,用于存放操作数或运算结果
- X:通用操作数寄存器,用于存放操作数(一般一个运算器会有多个)
- ALU:算术逻辑单元:通过内部复杂的电路实现算数运算、逻辑运算
其中ALU是核心部件,主要都是通过它来运算的,也是最贵的。其余三个都算寄存器。
控制器的基本组成

- CU:控制单元,分析指令,给出控制信号
- IR:指令寄存器,存放当前执行的指令
- PC:程序计数器,存放下一条指令地址,有自动加1功能
其中CU是控制器的核心部件。

计算机的工作过程
比如我们来用逻辑语言模仿机器运行一遍这个高级代码

取数操作

- ①:(PC) = 0, 指向第一条指令的存储地址
- ②:(PC)->MAR,导致(MAR)=0
- ③:M(MAR)->MDR,导致(MDR)=
0000010000000101 - ④:(MDR)->IR,导致(IR) =
0000010000000101 - ⑤:OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是”
取数"指令 - ⑥:Ad(IR)->MAR,指令的地址码送到了MAR,导致(MAR)=5
- ⑦:M(MAR)->MDR,导致(MDR)=0000000000000010=2
- ⑧:(MDR)->ACC,导致(ACC)=0000000000000010=2
乘法操作

- 上一条指令取值后PC自动+1,(PC)=1
- (PC)->MAR,导致(MAR)=1
- M(MAR)->MDR,导致(MDR)=
0001000000000110 - (MDR)->IR,导致(IR)=
0001000000000110 - OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是”
乘法“指令 - Ad(IR)->MAR,指令的地址吗送到MAR,导致(MAR)=6
- M(MAR)->MDR,导致(MDR)=0000000000000011=3
- (MDR)->MQ,导致(MQ)=0000000000000011=3
- (ACC->X),导致(X)=2
- (MQ) * (X)->ACC,由ALU实现乘法运算,导致(ACC)=6,如果乘积太大,则需要MQ辅助存储。(存低位)
加法操作

- 上条指令取值后(PC)=2,执行后,(ACC)=6
- (PC)->MAR,导致(MAR)=2
- M(MAR)->MDR,导致(MDR)=
0000110000000111 - (MDR)->IR,导致(IR) =
0000110000000111 - OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是”
加法“指令 - Ad(IR)->MAR,指令的操作码送到MAR,导致(MAR)=7
- M(MAR)->MDR,导致(MDR)=0000000000000001=1
- (MDR)->X,导致(X)=0000000000000001=1
- (ACC)+(X)->ACC,导致(ACC)=7,由ALU实现加法运算
存数操作

- 上一条指令取值后(PC)=3,执行后,(ACC)=7
- (PC)->MAR,导致(MAR)=3
- M(MAR)->MDR,导致(MDR)=
0000100000001000 - (MDR)->IR,导致(IR)=
0000100000001000 - OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是”
存数“指令 - Ad(IR)->MAR,指令的地址码送到MAR,导致(MAR)=8
- (ACC)->MDR,导致(MDR)=7
- (MDR)->地址为8的存储单元,导致y=7
停机操作

- 上一条指令取值后(PC)=4
- (PC)->MAR,导致(MAR)=3
- M(MAR)->MDR,导致(MDR)=
0001100000000000 - (MDR)->IR,导致(IR)=
0001100000000000 - OP(IR)->CU,指令的操作码送到CU,CU分析后得知,这是”
停机“指令
计算机软件
系统软件和应用软件
- 应用软件:是为了解决某个应用领域的问题而编制的软件 eg:QQ
- 系统软件:系统软件负责管理硬件资源,并向上层应用程序提供基础服务。eg:操作系统,数据库管理系统,标准程序库,网络软件,语言处理程序,服务程序
三种级别语言
高级语言编写程序->编译程序(编译器)->汇编程序(汇编器)->机器语言
其中编译器、汇编器、解释器统称为翻译程序
高级语言
C和和JAVA和C#等
有些高级语言会跳过汇编语言,直接编译成机器语言
有些高级语言如JavaScript和Shell和Python会通过解释器的方法,直接解释成机器语言。
编译程序
编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,比如C语言会变成.exe文件,而后执行机器语言程序(只需一次)
解释程序
解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句。(每次执行都需要翻译)
汇编语言(低级语言)
汇编语言采用助记符的方式更便于人类理解。
机器语言(低级语言)
二进制代码,反正我看不懂👍
但是差不多都是指令:
00000000000000000000010000000000
软件和硬件的逻辑功能等价性
软件和硬件在逻辑功能上是等价的,同一个功能,我们既可以用硬件的方式性能高,成本高来实现,也可以用软件性能低,成本低的方式来实现。举个例子,假设我现在需要计算$114514 * 2$,如果这个硬件本身就涉及了一些电路,可以直接支持乘法运算,我们就可以直接通过一个乘法指令来执行。那么如果这个CPU本身就不支持乘法运算,只支持加法,那么我们就可以在软件中编写两个114514相加的指令,这在逻辑上等同意乘2。
指令集体系结构(ISA)
指令集体系结构:软件和硬件之间的界面。设计计算机系统的ISA,就是要定义一台计算机可以支持哪些指令,以及每条指令的作用是什么,每条指令的用法是什么。
这其实就是要清晰的定义软件和硬件之间的界限,既然软件和硬件在逻辑功能上等价,我们可以用两种方式实现,所以在设计的时候既要考虑性能问题,也要考虑成本问题。
比如我们要做一个10项的是5以内的乘法,那么我们就没有必要在硬件上下功夫,本身就不吃效率,所以直接ALL IN 成本就行了。
计算机系统的层次结构
硬件
传统机器M1和微程序机器M0

这两个是计算机系统层次的最底层
V指令/微操作
我们传统意义上的机器,智能识别机器语言,CPU在执行这些用二进制表示的机器指令时,会将其细化为更细的一些小步骤来执行,那我们把这些更细分的小步骤把它成为V指令,或者也可以称作微操作。
比如我们在各个硬件工作原理时候发现,机器会把一条指令的执行过程细化为更多个步骤来依次执行,才能完成某个操作(比如取数),所以我们可以把传统机器M1分解为微程序机器M0。也就是用微程序机器的V指令来解释和执行传统机器的每一条机器指令
软件
虚拟机器M2(操作系统机器)
向上提供“广义指令”(系统调用)
虚拟机器M3(汇编语言机器)
传统机器只能读懂二进制,这是很不方便的,于是发明了虚拟机器符号语言,也就是汇编语言。对于使用汇编语言的程序员来说,他所看到的机器是能直接识别他所编写的汇编语言程序,而这种机器我们就称之为虚拟机器(汇编也是把符号语言翻译成机器语言)
汇编语言指令和机器语言指令都是一一对应的。
汇编语言
1 | LOAD 5 这里的LOAD就是说明,进行的是取数操作。而这个5就是从内存地址5的地方来取数 |
机器语言
1 | 000001 0000000101 (取数指令) |
虚拟机器 M3(高级语言机器)
没有任何一台机器可以直接执行高级语言的代码,所以我们看起来就是虚拟的。
用编译程序翻译成汇编语言程序。
总结

-
虚拟机器 M4(高级语言机器)
- 你的视角:你直接写出高级语言代码
y = a * b + c。 - 动作:这一层不需要你关心底层是怎么算的,M4 层通过编译程序,把这行高级代码翻译成计算机能听懂的 “汇编语言”。
- 你的视角:你直接写出高级语言代码
-
虚拟机器 M3(汇编语言机器)
- 中间视角:计算机接收到的是汇编指令,比如
LOAD 5(取数)、MUL 6(乘法)。 - 动作:M3 层通过汇编程序,把这些人类可读的汇编指令,翻译成计算机纯认的 “机器语言”(二进制代码)。
- 中间视角:计算机接收到的是汇编指令,比如
-
虚拟机器 M2(操作系统机器)
- 系统视角:此时需要操作系统介入,管理内存、分配资源,提供 “广义指令”(系统调用),确保运算所需的数据和指令能被正确加载和执行。
- M2(操作系统)的核心作用:
- 帮你管理内存:给每个程序分配独立的虚拟地址空间,防止互相干扰。
- 帮你调度 CPU:把时间片分给多个程序,实现 “同时运行”。
- 帮你封装硬件:把复杂的硬件操作变成简单的 “系统调用”(广义指令),上层程序不用关心底层细节。
- 没有操作系统时:程序员必须知道硬件的具体地址,比如 “这个数据必须放在 0x1000 这个内存格子里”。
-
传统机器 M1(硬件核心层)
- 硬件视角:CPU 读取到最终的二进制机器指令(如
000001...取数指令、000100...乘法指令)。 - 动作:M1 层的硬件控制器直接解析并执行这些二进制指令,完成取数、乘法等物理操作。
- 硬件视角:CPU 读取到最终的二进制机器指令(如
-
微程序机器 M0(微指令系统)
- 最底层:每一条机器指令,背后都由硬件自动拆解成一系列更细微的微指令(如微指令 1、微指令 3…)。
- 动作:M0 层由硬件电路直接执行这些微指令,这是物理层面的信号流转,运算最终完成。
计算机系统的工作原理
从C语言源程序到可执行文件

程序员编程出xxx.c源文件- 源程序经过
预处理器,对C语言中#开头的命令处理。如把常量符号变成本身的值。 - 预处理后的源文件为xxx.i
- 通过编译器,将源程序翻译成汇编语言xxx.s
- 接着汇编语言程序xxx.s通过汇编器,将汇编语言程序翻译成二进制机器语言
- xxx.o为机器语言程序,也被称为目标模块,由01010组成
- 最后通过连接器,将其他被引用到的库和机器语言程序连接在一起,将多个相关的目标模块链接完整的可执行文件
- 最后获得可执行文件xxx.exe
- 最后将可执行文件放在外存(硬盘)中
计算机性能指标
存储器的性能指标

- MAR:MAR位数反映存储单元的个数(
最多支持多少个) - MDR:MDR位数 = 储存字长 = 每个存储单元的大小
$$总容量 = (存储单元个数 * 存储字长)bit = (存储单元个数 * 存储字长/8)Byte$$
Eg:
MAR为32位,MDR为8位,则$总容量 = 2^{32} *8 bit = 4GB$。但是注意上面说的是最多储存单元的个数,所以说最多为4GB。不过我们平时做题按照最大考虑就行了。
一些单位
- $2^{10}Byte=1KB$
- $2^{20}Byte=1MB$
- $2^{30}Byte=1GB$
- $2^{40}Byte=1TB$
CPU性能指标
CPU的主频

GHz就是CPU主频:CPU内数字脉冲信号振荡的频率

这里每一个波峰都是一个脉冲信号,所以CPU的脉冲信号是有规律,有节奏的发生的。脉冲信号我们可以理解为指挥CPU内部的所有部件来一步一步工作的节奏。类似于广播体操,总得有人喊4个拍子来跟做。

这里的每一个动作都对应着一个脉冲信号,依次从上往下进行,但是有些步骤可能在一个脉冲内完成不了。
我们把每个脉冲信号称为一个CPU周期,单位以微秒或者纳秒。
$$\text{CPU 主频(时钟频率)} = \frac{1}{\text{CPU 时钟周期}} $$
单位为:赫兹,Hz。
主频=10Hz的含义就是每秒有10个CPU脉冲信号。
CPI
但是也不是CPU主频完全影响了CPU的性能,不能说越高越好。还有一个指标就是CPI
==CPI:执行一条指令所需的时钟周期数。==不同的指令,CPI不同。甚至同一个CPU执行相同的指令,CPI也可能有变化。所以我们比较的时候一般比较平均CPI。
$$执行一条指令的耗时 = CPI * CPU时钟周期 $$
$$\text{CPU执行时间} = \frac{\text{CPU时钟周期数}}{\text{主频}} = \frac{\text{指令条数} \times \text{CPI}}{\text{主频}} $$
IPS
IPS为每秒执行多少条指令:

我们在使用这个的时候,通常还会带上单位,比如KIPS之类的。
FLOPS
FLOPS为每秒执行多少次浮点运算,假如我们计算机经常要进行科学的数据处理,那么看这个指标分别CPU好坏是没问题的。同样它偶尔也会带单位,比如KFLOPS和GFLOPS和TFLOPS。
- K = Kilo =千 = $10^3$
- M = Millon = 百万 = $10^6$
- G = Giga = 十亿 = $10^9$
- T = Tera = 万亿 = $10^12$
系统整体的性能指标(静态指标)
数据通路带宽
数据通路贷款:数据总线一次所能并行传送信息的位数(各硬件部件通过数据总线传输数据)
吞吐量
吞吐量:指系统在单位时间内处理请求的数量。
这里的请求你可以随意理解,你可以理解为一条指令是一个请求,你也可以理解为一个完整的程序运行才是请求。
响应时间
响应时间:指从用户向计算机发送一个请求,到系统对该请求做出响应并获得它所需要的结果的等待请求。
系统整体的性能指标(动态测试)
基准程序(也就是跑分软件)是用来测量计算机处理速度的一种实用程序,以便于被测量的计算机性能可以与运行相同程序的其他计算机性能进行比较。
一些问题
①主频高的CPU一定比主频低的CPU快吗?
答:不一定,如两个CPU,A的主频是2GHz,平均CPI为10;B的主频是1GHz,平均CPI是1。
②若A、B两个CPU的平均CPI相同,那么A一定更快吗?
也不一定,你还要看你要干什么,你的指令系统是什么,比如A不支持乘法,B支持乘法。
③跑分软件分越高,机器越好吗?
跑分软件语句频度是有差异的,比如有些专看你的显卡,显卡分数偏低,但是你主要不是用显卡的,这不代表你的CPU比它人的烂。
说些什么吧!