目录
从硬件角度了解计算机的基本工作原理——CPU的基本工作原理
指令:不是传递给计算机的都是指令,只有让计算机行动的命令才是指令,指令一定是明确的而不是模糊的。只有指令才最终在运行阶段运行,被运行的程序在计算机的CPU中执行。
比如,到 A 中取出一个数,这就是一条指令;但 预测我明天会不会中彩票,这就不是一条指令,因为结果是不确定的。
数据:我要取 A 中的数,那么首先我需要先把这个数放入 A 中,放入的就是数据
因此,粗略的可以看作
程序 = 指令 + 数据;程序 = 算法(有特定意义的指令) + 数据结构(有组织的数据)
一次开发阶段产生的程序,可以有多次运行阶段。
了解编译器:
举个例子:小明只会英语,小红只会汉语,导致小明和小红无法直接交流。小明写的东西,小红无法看懂,这个时候,出现了小译,小译把英文翻译成了中文给小红,而小译在翻译的过程中,顺便还会帮小明把步骤也调优。而小译在这里其实就相当于编译器。因此现在的百编译器去其实就是在做这两个事请:1)编译(compile) 2)优化(optimize)
整个过程,小明相当于处于开发阶段(程序员),小译属于编译阶段(编译器),小红属于运行阶段(CPU)
随着发展,小明可能会写了很多很多程序片段,小译进行翻译,出现一个小连,他把小译翻译后的程序片段,把可以合并的进行合并形成程序,最后小红来对这些程序进行运行。小连其实就是计算机中的链接阶段(链接器)。
1.图灵机 -> 冯诺依曼体系
现代的计算机大多遵守冯诺依曼体系结构,冯诺依曼体系中指令只是一种特殊一些的数据
处理器(CPU)= 运算器 + 控制器
存储器(Memory) = 内存
外部数据(物理数据)通过 输入设备 进入到 存储器;存储器内的数据 通过 输出设备 来到外部世界
运算器 + 控制器 + 存储器 + 输入设备 + 输出设备
处理器 + 存储器 + 输入设备 + 输出设备
CPU + 内存 + I/O:CPU和内存间和I/O间(内部数据)交换通过 总线(BUS)
程序 = 指令 + 数据
指令表现为一种特殊的数据需在存储在内存中,它是一组与规定的动作,利用编码表规定,opcode 操作码
广义数据在内存中的存储问题
一类是数,一类是非数的数据(字符串、声音、图片......)
1.1 非数类型的数据在内存中的表示方法
要在计算机中进行“非数数据”的存储,把非数数据转换成数类型的数据 via 编码表
比如字符串可以转为字符,字符有 Unicode 编码,可以进行转换。
图片有 RGB 编码,因此颜色也可以进行编码。
声音可以由波形编码。
这些都可以把非数转化成数。
1.2 数类型的数据在内存中的表示方法
1.整数(整型数)
一般是 有序范围内的整数表示:原码、反码、补码
2.小数(浮点数)
IE标准
2.CPU的基本工作原理
CPU:逻辑算术运算器
与、或、非、加、减、乘、除、取余
控制器
寄存器:临时存储数据的存储单元
现代的高级CPU为了提升性能,一般都带有缓存(CPU内缓存)
1.门电路:
组建 与门、或门、非门、异或门 可以实现 1 位(bit)的基本逻辑运算
2.算术逻辑单元(ALU):
算数:加法、减法、乘法、除法、取余
逻辑:与、或、非
3.利用与或非门构建 8 位加法器:
1. 1位加法:
2. 8位加法:
8 位数的加法器 = 7个全加器 + 1个半加器
CPU是计算机的核心;ALU是CPU的核心
由此,所有的程序执行,本质上都是计算 + 读取 + 存入
程序:多个(opcode + a + b)来组成,a、b都是需要寄存器来临时保存数据的,同理计算的结果也是需要寄存器来保存的。
读取:从内存到寄存器的过程
存入:从寄存器到内存的过程
控制单元CU :计算的结果由寄存器保存、把本次计算的 opcode 告诉 ALU
3.CPU的基本工作流程
CPU = ALU + CU
ALU 主要负责进行 逻辑+算数运算,需要利用寄存器完成中间数据的临时保存
CU 主要负责控制 内存和寄存器 之间数据传递的指令 以及 驱动 ALU 工作
1.ALU 和CU之间的关系
CU :1)控制 寄存器 和 内存 之间的数据交换 2)控制 ALU 进行计算
PC:下一条要执行的指令在内存中的地址
IR:下一条要执行的指令
指令作为一种特殊的数据,在内存中也是以整型的形式保存的
2.程序执行的过程:
1.取码阶段:CU 根据PC 寄存器的值,去内存的响应位置,把数据(指令)读取到 IR 寄存器中,
正常情况下,PC寄存器中的值自动 + 1
2.译码阶段:CU 按照预先设定的指令集解读 指令数据(opcode + 操作数)
3.执行阶段:LOAD指令应该由 CU 执行,按照规定执行指令
4.编程语言
1.顺序执行:
由于 PC 的自动 +1,我们的代码才可能顺序的执行下去,我们所写的代码中的一条语句,很可能是需要多条指令才能完成。
语句是一组指令的封装抽象,变量是一段内存空间的封装抽象。
2.分支语句:
if、else、while、for、break、continue...
CPU 中往往会提供一些指令,这些指令可以去修改 PC 的值。
if(a > b) { 甲 } else { 乙 }
把 a 变量的值加载到寄存器中,把 b 变量的值加载到寄存器中,计算 a - b 的结果,判断 a - b 的结果是不是负数或者 0,如果是负数或者 0,修改 PC 的值,跳转到 乙。如果不满足那么就顺序的执行 甲。
通过 CPU 中预先规定的指令,可以修改 PC 中的值(带条件修改),进而影响执行流。
只要有个起始位置填充到 PC 里,执行流就可以正常的运行起来了,就比如我们平常的 main 方法。
至于我们程序中出现的变量、方法(函数)等概念,并不是计算机硬件要用到这些概念,这是为了方便人(程序员)而诞生的。
在CPU 眼中,只有指令的概念,没有指令属于谁的概念。
5.CPU的中断模式
正常模式下,CPU 可以顺序执行,可以分支执行,但总归还是要按照既定的顺序去执行。
但现实中,我们可能需要暂时中断 CPU 当前的执行流,先让 CPU 去做点其他的工作,再回过头来继续原来的执行流。
CPU 硬件中提供了一种机制(中断)让 CPU 停下:
1.保存当前的 PC 值到内存的某个位置
2.修改 PC 的值,去执行其他的执行流
3.其他执行流结束之后,返回保存的 PC 值恢复到 PC 寄存器
4.继续原来的执行流
中断经常用作:
1)IO设备的处理
当有外部数据到达 Input 设备时,触发某个中断,让当前的执行流暂停,切换到 Input驱动对应的执行流,把 Input 设备中读取到的数据,放到内存的某个位置,恢复之前的执行流
2)操作系统中用来做进程调度(线程调度)
6.操作系统(Operating System)OS
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、 Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
计算机是 多用户-多任务场景 OS 的主要职责就是协调——专门的软件来协调工作
硬件(资源)会被多任务“同时”访问
OS 协调不同任务对硬件的资源访问,OS 管理着硬件资源,分配给不同的任务去使用。
(1)OS 是一个 管理(硬件、软件)资源的 软件
(2)OS 是一个协调者(管理的含义就是做协调)
(3)OS 是一个分配者,分配的主要主体就是任务。站在任务的角度,就是一切硬件资源都需要找 OS 申请后才能被授权使用。
我们程序其实是以进程的角度去操作系统(OS)中申请资源来使用,这个硬件资源就包括:CPU、内存、IO设备。