本文侧重介绍cpu的工作任务,与cpu执行指令的过程是怎么样的?
目录
1.理解CPU
1.1.CPU的功能
1.2.CPU的逻辑构成
2.认识指令
2.1.什么是指令
2.2.CPU执行指令的准备工作(重点)
3.指令的执行过程
前景知识:
什么是计算机
就是遵循冯诺依曼体系结构。也就是由CPU、存储器、输入设备、输出设备组成的。基本基调:计算机使用二进制表示存储数据
(1)CPU(中央处理器):进行算术运算和逻辑判断
(2)存储器:用于存储数据(使用二进制方式存储)
1)存储器分成内存和外存
2)外存类型很大,其中,硬盘是典型的代表
(3)输入设备:用户给计算机发号施令的设备
网卡、蓝牙、触摸屏、键盘、鼠标、摄像头
(4)输出设备:计算机各用户汇报结果的设备。
蓝牙、网卡、触摸屏、显示屏,音响
1.理解CPU
1.1.CPU的功能
1.进行各种算术运算 2.进行各种逻辑判断
1.2.CPU的逻辑构成
1)如13%的数字:CPU的占有率。如3.36Hz:CPU的频率。如内核:核心
2)占有率:干活时间/总时间
例子:CPU像一个打工人,如果一天工作时间为8小时,但是花4小时把活做完了,剩下时间摸鱼,此时CPU的占有率为:50%
一般都不是为100%,因为在一个程序中,会同时运行着很多的程序,这些程序并不都是全力在干活
3)频率:表示工作的快慢
CPU的频率分为基础频率(最低的时候)和最大频率,一般的频率都是在不断的跳动
4)核心
一般都是多核心,核心越多,工作效率也越快,计算机的性能也就更高。所以写在引入更多的核心,就需要各个核心相互配合工作,因此,多线程就是这么来的
2.认识指令
指令就是CPU中的一部分,下面了解CPU是怎么工作的。
2.1.什么是指令
(1)指令,可以粗略的认为是CPU在被设计的时候,给程序员提供的一些“编程接口”。所以指令≈API
(2)不同的CPU,所提供的指令不一样,但大体相同。
(3)CPU有多种架构,不同架构的CPU,支持的指令也就不一样
(4)指令=操作码+操作数(内存地址或者寄存器编号)
2.2.CPU执行指令的准备工作(重点)
指令,需要先加载到内存中,然后才能被cpu读取
(1)执行指令的大致三步
1.读取指令(将内存中的指令数据,读取到CPU的寄存器中)
2.解析指令(分析当前的指令是做什么)
3.执行指令
寄存器是cpu中一块很小的内存空间
(2)指令表
指令 | 功能说明 | 4位opcode | 操作的地址或寄存器 |
---|---|---|---|
LOAD_A | 从RAM的指定地址,将数据加载到A寄存器 | 0010 | 4位RAM地址 |
LOAD_B | 从RAM的指定地址,将数据加载到B寄存器 | 0001 | 4位RAM地址 |
STOP_A | 将数据从A寄存器写入RAM的指定地址 | 0100 | 4位RAM地址 |
ADD | 计算两个指定寄存器的数据之和,并将结果放入第二个寄存器 | 1000 | 2位的寄存器ID 2位的寄存器ID |
上面的0010之类的是为了区分这是一个什么操作,后面操作的地址啥的类似函数的参数
上述的指令是8位二进制数字(一个字节):前面四位用来区分是什么操作,后面四位是操作数
操作数:如果是前面三个地址,就是通过这个四位数的地址找到地址中存放的数据,这个数据才是真正的操作数。
(3)程序表
例如下面这种,需要根据下面的表执行指令操作
第二列的数据,不一定是数据,也有可能是地址。只有当程序跑起来才能知道
1)介绍PC
在cpu中有一个特殊的寄存器,用来保存接下来要从哪个内存地址(如上面的地址0-15)取指令(如地址右边的就是指令,也有可能是数据),一般称为程序计数器,简称PC
举例
假设此时从0号开始执行,CPU每次读取执行完一个指令之和,就会自动把PC中的值进行+1,顺序的读取下一条。但是如果遇到一些跳转指令,就不是+1,就会跳转到指定的位置。
3.指令的执行过程
第一轮操作:
默认从0号地址开始
(1)取指令
(2)解析指令
1)先拆分
2)将操作码和指令表对照
发现0010的操作是LOAD_A,说明后面的四位数据就是地址,需要去该地址上面取出数据作为真正的操作数。
取出真正的操作数:1110为14,就需要去14号地址
(3)执行指令
第二轮操作:
(1)取指令
(2)解析指令
1)拆分指令
2)查询指令表
发现0001是LOAD_B的操作,后面跟着的数据就是四位数地址,需要去程序表中取出该地址上面的数据作为真正的操作数
1111十进制为15,也就是取出15号地址的数据
(3)执行指令
第三轮操作:
(1)取指令
(2)解析指令
1)拆分指令
2)查找指令表
操作码:1000就是ADD操作,也就是把两个寄存器上面的数据进行相加,并且把结果放入第二个寄存器中。操作数:0100就是两个寄存器的编号,0100就需要拆分成01和00;按照之前约定:00就是寄存器A,01就是寄存器B
(3)执行指令
第四轮操作:
(1)读指令
指令为:0100 1101
(2)解析指令
1)拆分指令
2)查找指令表
操作码:0100就是STOP_A操作,说明后面跟着的四位数是地址;1101十进制就是13
(3)执行指令
第五轮操作:
(1)取指令
(2)解析指令
0000 0000的指令在指令表中没有,但是默认为结束程序的意思
(3)执行指令
退出程序
上述指令的操作,都是在cpu中执行的
实际应用场景:
当一个不能挂的服务器发生bug时,可以写入特定的程序,是可以修改服务器的内存数据的。直接写到指定的内存中,并且修改原有的服务器指令中的逻辑,插入跳转指令,跳过bug。
也就是写入跳转指令,当执行到bug指令前,让程序跳转过去,进而避免发生bug,这种操作称为热补丁