一、概述
1、关于计算机原理:
(1)从硬件角度学习计算机的基本工作原理——CPU的基本工作原理。
(2)从操作系统软件角度,学习我们的程序是如何工作起来的——进程管理。
2、程序=指令+数据
程序=算法(有特定意义的指令)+数据结构(有组织的数据)
只有指令,才最终在运行阶段时,被运行程序的计算机的CPU去执行(其中指令也可以看作是一种特殊的数据)。
3、开发阶段->编译阶段->链接阶段(构建阶段)->运行阶段 【程序员 编译器 链接器 CPU】
4、冯诺依曼体系:
处理器(CPU)=运算器+控制器
存储器(Memory)=内存 【storage(二级存储)、memory(内存)】
外部数据(物理数据)进入到存储器via 输入设备(Input Device)
存储器内的数据出来到外部世界via 输出设备(Output Device)
运算器+控制器+存储器+输入设备+输出设备
处理器+存储器+输入设备+输出设备
一些基本功能
【CPU 中央处理器: 进行算术运算和逻辑判断.
存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
输入设备: 用户给计算机发号施令的设备.
输出设备: 计算机个用户汇报结果的设备】
【 *针对存储空间 :硬盘 > 内存 >> CPU
*针对数据访问速度 :CPU >> 内存 > 硬盘 】
5、程序=指令+数据
(1)指令:是一组预规定的动作,表现为一种特殊的数据,需要存储在内存中【利用编码表规定】。
(2)数据:同样需要存储在内存中,前提是(内存是电子元件组装而成以二进制的形式存储。)
6、广义数据在内存的存储问题(数||非数的数据)
(1)“数” 类型的数据在内存中的表示方法(整数(整数型)、小数(浮点型)…)。
有限范围内的整数表示:正码、反码、补码 -> 整型数
有限范围的小数表示:IE标准 ->浮点数
(2)“非数数据” 都会按照一定的标准格式编码成整数。
任何的数据,基本上都是以整型、浮点型进行表示,以保存到内存中。其中,“非数数据”都会按照一定的标准格式编码成整数。接下来的内容我们局限在整型中,但表示的数据可能是整数、指令、字符、图片、声音等…
二、CPU的基本工作原理 (CPU =ALU + CU)
CPU:逻辑算术运算器
【(与、或、非、加、减、乘、除、取余)、控制器、临时存储数据的存储单元(每个只能保存一个整型数、但是不止一个)——寄存器(register)。】
现代的高级CPU为了提升性能,一般都带有缓存(CPU内缓存)
(一)逻辑门
1、非门【真假、假真】
2、与门【串联,两个都为1才为1】【1000】
3、或门【并联,有一个1即为1】【1110】
4、异或门 【相同为0】【0110】
(二)ALU(Arithmetic & Logic Unit) 算术逻辑单元ALU
【负责进行 逻辑+算术运算,需要利用寄存器完成中间数据的临时保存】
算术:加法、减法、乘法、除法、取余
逻辑:与、或、非
利用 与或非 + 异或门 构建8位加法器
1、进制的回顾与理解
246 = 210^2 + 410^1 + 610^0
Ob11011 = 12^4 + 12^3 + 02^2 + 12^1 + 12^0
13进制的数13A6 = 113^3 + 313^2 + A13^1 + 613^0
【遇10进1】和【遇2进1】
2、算术单元(Arithmetic Unit)
算数单元,负责计算机里的所有数字操作,比如四则运算,接下来我们会
带着大家实现一个 8 位(bits)的加法器(adder)。
8位数的加法器 = 1半加器 + 7全加器
(1)半加器:进行两个1位(bit)数的相加
(2)全加器:进行三个1位(bit)数的相加
3、逻辑单元(Logic Unit)
逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较。
8位数 != 0 的判断
0000 0000 = 0
0000 0001 = 1
… … = 1
1111 1111 = 1
只要有一个1就能够保存下来。
ALU的基本组成
(1)三个输入:
A:要参与计算的第一个数。
B:要参与计算的第二个数。
C:操作码(opcode),本次的运算是什么,指导ALU进行什么运算。
(2)输出
正常输出:加减乘除都有一个8位数的输出。
额外输出:一般有三个,都只有1个(bit),代表它是否溢出、为0、负数。
(三)控制单元CU(Control Unit)
【CU具有的两个功能:1、控制register <-> memory数据传递的指令 2、驱使ALU进行计算】
1、CU中有两个很重要的寄存器(RAM)
(1)PC寄存器(Program Counter)程序计数器寄存器,下一条要执行的指令在内存中的地址【很重要,可以影响当前CPU的执行流,默认情况下是正常顺序走(自动+1)。CPU中提供了指令,可以修改PC的值(可以带条件),产生分支逻辑】。
(2)IR寄存器(Instruction Register)指令寄存器 ,下一条要执行的指令。
2、指令(Instruction)
指令作为一种特殊的数据,完全也是以整型的形式保存在内存中。
首先,我们先介绍下我们需要到的指令(instruction)。
所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。
其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。 指令本身也是一个数字,用二进制形式保存在内存的某个区域中。
流程:(此时人为认为PC为0)
(1)取码阶段
CU根据PC(0)寄存器的值,去内存的响应位置,读取指令(00101110)到IR寄存器。(正常情况下,PC寄存器中的值自动 + 1.)
(2)解码阶段
CU按照预先设计的指令集解读指令数据(opcode + 操作数)
Eg: 0010 1110,人为规定前面四位为操作码(查询指令表可以知道0010代表的意思),后四位才是地址(后四位指定内存的处),地址为10进制的14,从地址为14的内存中加载数据(00000011),加载到例如图中A寄存器中。
(3)执行阶段(CU)
LOAD指令应该由CU执行,所以按照规定执行指令:
从内存为14号地址处将数据(00000011)被读到A寄存器中,就执行结束。
结论:程序顺序执行的秘密
(1)由于硬件中PC在自动+1,所以我们的代码变成的指令才能顺利地执行下去
(2)代码中的一条语句,很可能需要多条指令才能完成。
语句是一组指令的封装抽象
变量是一段内存空间的封装抽象
(3)PC寄存器中的值在这个指令周期中很关键,可以控制执行哪里的指令
3、CPU主频可以粗略地看作:每秒钟CPU能执行多少个指令周期
【周期会一直执行,频率一般就是我们认为的主频】
CPU执行的快慢,就是看CPU执行指令周期的频率(假定每个指令周期的频率恒定)。
4、分支语句
分支语句是怎么来的:(if\else\while\for\break\continue…)
CPU中往往会提供一些指令,这些指令可以去修改PC的值。
通过CPU中预先规定指令,可以修改PC中的值(带条件修改),进而影响执行流(execution flow)。
5、CPU的正常工作流程:取码 -> 编码 -> 执行周期
只要在你的电脑开机状态下,CPU就在不停循环着这个周期。
在硬件CPU的视角中,只有指令的概念,没有指令属于谁的概念!!【即CPU视角是有要执行的下一条指令是什么,改变不知道执行的是属于哪个程序。】
6、CPU的中断模式(Interrupt Mode )【可以暂停当前的执行流】
正常模式下,CPU可以顺序执行,可以分支执行。但总归只能按照既定顺序去执行。但是现实中很多时候,需要暂停中断CPU的当前执行流,先让CPU去做点其他工作,再回过头来继续原来的执行流。
【CPU硬件中提供了一种机制(中断)让CPU停下
1、保存当前的PC的值到内存的某个位置
2、修改PC的值,让执行其他执行流
3、其他执行流执行结束后,通过将刚才保存的PC值恢复到PC寄存器
4、继续原来的执行流】
中断一般都有编号,内存中提前保存好了中断向量表。
中断经常用作:
(1)IO设备的处理
当有外部数据到达Input设备时,触发某个中断。
让当前正在执行的执行流暂停,切换到Input驱动对应的执行流。
把Input设备中读取到的数据,放到内存中的某个位置。
恢复之前的执行流。
(2)操作系统中用来作进程调度(线程调度)。