冯诺依曼体系:指令只是一种特殊一些的数据
处理器CPU = 运算器+控制器
存储器Memory = 内存
storage二级存储
外部数据(物理数据)进入到存储器via 输入设备(Input Device)
存储器内的数据出来到外部世界via 输出设备(Output Device)
运算器+控制器+存储器+输入设备+输出设备
CPU+内存+I/O 内部数据交换通过 总线BUS
程序 = 指令+数据
广义数据的存储问题:数|非数的数据(字符串、声音、图片)
要在计算机上进行非数数据的存储:把非数数据转换成数类型的数据via 编码表
字符串 ->字符 Unicode编码(子集ASCII编码)
图片-> RGB编码 红绿蓝0-255/0-255/0-255
声音 -> 波形
数类型的数据在内存中表示方法
整数、小数...
有限范围内的整数表示:正码、反码、补码(为了表示有范围的数) ->整数
有限范围内的小数表示:IE标准 ->浮点数
接下来我们局限在整形中,但表示的数据可能是数据、指令、字符、图片、声音等
CPU的基本工作原理:
CPU:逻辑算数运算器 处理 与或非、加减乘除、取余
控制器
临时存储数据的存储单元(每个都只能保存一个整形数,但是不止一个)——寄存器register
现代的高级CPU为了提升性能,一般都带有缓存(CPU内缓存)level1、level2、level3
组件:与门(and gate)、或门(or gate)、非门(not gate)、异或门(xor gate)
ALU算术逻辑运算单元
算数:加法、减法、乘法、除法、取余
逻辑:与或非
利用与或非门+异或门构建8位(bit)加法器:
7*全加器(数字a+数字b+进位c) +1*半加器(数字a+数字b,例如个位数字相加,进位到十位才有)
通过两个半加器就可以得到8位(bit)全加器
三个输入:a:参与运算的第一个数
b:参与运算的第二个数
c:本次ALU的运算是什么 pocode
输出:正常输出
CPU是计算机的核心,ALU是CPU的核心
所有程序的执行,本质上都是计算+读取(memory->register)+存入(register->memory)
程序:opcode1 + a1+b1
opcode2 + a2+b2
opcode3 + a3+b3
....
a、b都需要放到寄存器临时保存
计算的结果也需要寄存器来保存
本次要计算的Opcode是谁告诉ALU的?
这些都是由控制单元CU(control Unit)完成的
PC:下一条要执行的指令在内存中的地址
IR:下一条要执行的指令
指令作为一种特殊的数据,完全也是以整形保存在内存中
1.取码阶段:CU根据PC寄存器的值,去内存的响应位置,把数据(指令)读取到IR寄存器中,正常情况下,PC寄存器中的值会自动+1
2.解码阶段:CU按照预先设定的指令集解读指令数据(opcode +操作数)
例如:0010 1110
人为规定过:0010是opcode
查询指令表,直到0010代表的意思是,从后面地址指定的内存处,将数据读取到A寄存器
地址:1110 代表十进制的14
3.执行阶段:
LOAD指令应该由CU执行,所以按照规定执行的指令:
从内存的14地址处,将数据读取到A寄存器中
正常模式下的CPU流程周期:ALU+CU
1.由于硬件中PC自动加一,所以我们的代码变成指令才能顺序的往下去执行
2.代码中的一条语句,很可能是需要多条指令才能完成
语句是一组指令的封装抽象,变量是一段内存空间的封装抽象
3.PC寄存器中的值在这个指令周期中很关键,可以控制执行哪里的指令
CPU的运算快慢,实际上就是看CPU执行指令周期的频率(假定每个指令周期的频率是恒定的)
CPU的主频可以粗略的看做:CPU每秒钟能执行多少个指令周期
分支语句怎么来的:if else while for break continue
CPU中往往会提供一些指令,这些指令可以修改PC的值
通过CPU中预先规定的指令,可以修改PC中的值(带条件修改),进而影响执行流executio flow
只要有个起始位置填充到PC里,执行流就可以正常的运作起来了
我们平时的Main方法:
我们的程序启动:有“人”把我们程序翻译出来的一条指令的第一条地址放到PC中,我们的程序就正常跑起来了。
为什么我们程序中有函数(方法)等概念,并不是计算机硬件要用到这些概念,这些概念是为了方便人(程序员)而诞生的。
java中的方法是保存在jvm内存区的哪块区域? 方法区
Jvm中的内存区:栈、堆、方法区
指令主要放在方法区
CPU的正常工作流程:取码->编码->执行周期
只要你的电脑在开机状态下,CPU就不停的在循环着这个周期
在硬件CPU的视角中,只有指令的概念,没有指令属于谁的概念
CPU的中断模式Interrupt Mode
正常模式下,CPU可以顺序执行,可以分支执行,但总归只能按照既定顺序去执行
但现实很多时候,需要暂时中断CPU的当前执行流,先让CPU去做点其他的工作,再回过头来继续原来的执行流。
这是咋做到的?
硬件中提供了一种机制(中断)让CPU停下
1.保存当前的PC的值到内存某个位置
2.修改PC的值,让它执行其他执行流
3.其他执行流执行结束之后,通过将刚才保存的PC的值恢复到PC寄存器
4.继续原来的执行流
中断有编号,内存中提前保存好了中断向量表
例如:
中断编号 地址
001 0x3F5C
002 0x4444
003 0x9492
中断经常用作:
1.I/O设备的处理 ,当有外部数据到达Input设备时,触发某个中断,让当前正在执行的执行流暂停,切换到Input驱动对应的执行流,把Input设备中读取到的数据,放到内存的某个位置,恢复之前的执行流
2.操作系统中用作进程调度(线程调度)
CPU的主要工作模式结束~