🍃冯诺依曼体系
冯诺伊曼体系认为,指令只是一种特殊一些的数据
并且冯诺依曼体系将计算机系统分为处理器(CPU)+ 存储器 + 输入设备 + 输出设备
处理器:运算器 + 控制器
存储器:内存
输入设备:外部数据(物理数据)进入到存储器
输出设备:存储器内的数据出来到外部世界
🍃程序 = 指令 + 数据
指令表现为一种特殊的数据,需要存储在内存中,是一组预规定的动作,利用编码表规定
数据同样需要存储在内存中
opcode编码:给CPU支持的所有动作都编码一个唯一的数据
🍃广义数据在内存中的存储问题
🍀非数的数据在内存中的存储
要在计算机中进行 “非数数据” 的存储,要把非数数据转换成数类型的数据
字符串:unicode 编码
图像:RGB 编码
声音:波形编码
🍀数类型的数据在内存中的存储
数类型可分为整数,小数
有限范围内的整数表示:正码、反码、补码 -> 整型数
有限范围内的小数表示:IE标准-> 浮点数
🍃演示一个8位加法器的过程
🍀逻辑上的电子二级开关
🍀组建与门、或门、非门、异或门
或门
非门
异或门
🍀利用与或非 + 异或门构建 8 位加法器
二进制相加
在每一位上
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0
半加器:进行两个一位(bit)数的相加
全加器:进行三个一位(bit)数的加法
8位加法器 = 7 个全加器 + 1 个 半加器
🍃CPU的基本工作原理
🍀组成
逻辑算术运算器:与、或、非、加、减、乘、除、取余
控制器:分析指令并发出相应的控制信号
寄存器:临时存储数据的存储单元(每一个都只能保存一个整型数,但是寄存器个数不止一个)
现代的高级 CPU 为了提升性能,一般都带有缓存(CPU 缓存) Level1缓存 / Level2缓存 / Level3缓存
🍀ALU
CPU是计算机的核心,ALU是CPU的核心
三个输入:
A:要参与运算的第一个数
B:要参与运算的第二个数
C:本次运算的操作码 opcode
🍀程序
所有程序的执行,本质上都是计算 + 读取 + 存入
读取:内存 -> 寄存器
存入:寄存器 -> 内存
🍀控制单元CU
CU 可以驱动 ALU 进行具体的计算工作,即ALU 工作时的 opcode 就是 CU 提供的
🍀指令
所谓指令,即指导 CPU 进行工作的命令,主要由操作码和被操作数组成
其中被操作数用来表示要做的动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号
指令本身也是一个数字,用二进制的形式保存在内存的某个区域
🍀CPU 的基本工作流程
提码阶段
CU 根据 PC 寄存器的值,去内存的相应位置,把数据(指令)读取到 IR 寄存器中,正常情况下,PC 寄存器的值自动加 1
解码阶段
CU 按照预先设定的指令集解读指令数据(opcode + 操作数)
执行阶段
LOAD 指令由 CU 执行,CU 将在指令中得到的内存地址处的数据读取到寄存器 A 中
由于硬件中 PC 在自动加 1 ,所以我们的代码变成的指令才能顺序的往下执行
代码中的一条语句。很可能需要多条指令才能完成
语句是一组指令的封装抽象
变量是一段内存空间的封装抽象
PC寄存器中的值在这个指令周期中很关键,可以控制执行哪里的指令
🍀分支语句是怎么来的
CPU 中往往会提供一些指令,这些指令可以去修改 PC 的值
例如:
if(a > b){
…甲
} else {
… 乙
}
此语句在内存中的执行流
- 把a变量的值加载到寄存器中;
- 把b变量的值加载到寄存器中;
- 计算a-b的结果
- 判断a- b的结果是不是负数或者0,如果是负数或者0,修改PC的值变成乙所在的地址
🍀指令周期
CPU 的运算快慢,就是看 CPU 执行指令周期的频率
CPU 的主频可以粗略地看作:每秒钟 CPU 能执行多少个指令周期
🍀CPU的中断模式
正常模式下,CPU 可以顺序执行,可以分支执行,但现实中,很多时候,需要暂时中断 CPU 的当前执行流,先让 CPU 去做点其他工作,再回过头来继续原来的执行流
CPU硬件中提供了一种 机制(中断) 让CPU停下
保存当前的PC的值到内存的某个位置
修改PC的值,让执行其他执行流
其他执行流执行结束之后,通过将刚才保存的PC值恢复到PC寄存器
继续原来的执行流
中断经常用作:
IO设备的处理
当有外部数据到达Input设备时,触发某个中断
让当前正在执行的执行流暂停,切换到Input驱动对应的执行流
把Input设备中读取到的数据,放到内存的某个位置
恢复之前的执行流
操作系统中用来作进程调度(线程调度)