🐵本篇文章将对cpu的相关知识进行讲解
一、认识CPU
下图是简略的冯诺依曼体系结构图
上图中,存储器用来存储数据,注意在存储器中都是以二进制的形式存储数据的,CPU就是中央处理器,其功能主要是进行各种算术运算和各种逻辑判断
我们在计算机上运行的任何一个程序,本质上都是在CPU上运行的,接下来再结合任务管理器来对CPU进行讲解
1.1 占有率和频率
上图中,“3%” 就是CPU占有率
举个例子:假如一个人上班总时间为8小时,但他用4小时就完成了今天的工作,此时称CPU占有率为50%,计算机中运行的程序并非都是全力的工作,通过计算每一个程序的CPU占有率,最终算得的总占有率就是上图中显示的
“3.03GHz” 就是CPU频率
CPU频率用来描述CPU工作的效率,数字越大,工作效率越快,CPU频率也可以简单认为1s执行多少个指令/计算了多少次
CPU频率还有基础频率和最大睿频的概念,基础频率就是CPU保底的工作效率,最大睿频就是CPU最高能达到的工作效率
1.2 核心
以前的CPU都是单核心CPU,要想提高这种CPU的性能,就必须增加其内部的集成原件的数量,那么就得让每个单位原件更小,但是并不能无限小下去,单核CPU就达到了发展瓶颈
于是就有了多核心CPU,现在的计算机大多都是多核心CPU
内核为物理核心,逻辑处理器是逻辑核心,买电脑时看到的8核 16线程就是这个意思(这里有一个简单的了解就行)
CPU是多核心的,但每一个核心的工作效率是一样的,所以在设计程序时为了提高工作效率,就得做到合理分配,把要完成的任务交给不同的核心去完成,这也就是我们后续要研究的“多线程编程”
1.3 缓存
寄存器是CPU内部存储数据的模块,在存储空间上:硬盘 > 内存 > 寄存器,在速度上:寄存器 > 内存 > 硬盘;寄存器和内存大概差3~4个数量级,内存和硬盘又差3~4个数量级,由于速度差异过大,CPU提供了缓存模块
上述CPU中有3个缓存,对于缓存数字越小,速度越快,空间越小
有些要频繁使用的数据如果存在内存中,CPU要频繁从内存中读取,这样速度会比较慢,因此可以将这些要高频使用的数据放到缓存中
CPU在读取指令时,先看缓存中有没有,如果有直接从缓存中读取,没有则从内存中读取
二、CPU如何执行指令
2.1 CPU执行指令的步骤
CPU执行指令分为3个步骤:
1. 读指令:将内存中的指令数据读取到CPU的寄存器中
2. 解析指令
3. 执行指令
2.2 指令
指令就是指导CPU工作的命令,主要由 操作码+操作数 组成,操作码就是指令的编号,操作数就是接下来通过指令要操作的数据
下图是一个指令表:
每一个CPU被设计出来时都会提供一个指令表
2.3 CPU如何读到指令
写完一个Java程序,就会生成一个 .java 的源文件,经过编译后生成 .class 的二进制字节码文件,之后运行程序时JVM会把 .class 文件加载到内存中,在内存中进一步被翻译为CPU认识的二进制指令
写完一个C程序,就会生成一个 .c 的源文件,经过编译后生成 .exe 的二进制文件,之后运行程序时操作系统会把 .exe 文件加载到内存中,在内存中进一步被翻译为CPU认识的二进制指令
CPU中有一个专门的寄存器保存接下来要从哪个内存地址取指令(在不同的CPU中可能叫不同的名字,在有些操作系统书中称其为“程序计数器”简称“pc”)
此处假设从0号地址开始读取,CPU每次读取执行完一个指令之后,就会自动把pc中的值+1,即顺序取下一条指令(有些情况会遇到跳转类指令,此时就根据设置的地址进行取地址)
接下来通过具体的操作进一步熟悉CPU执行指令的过程
2.4 模拟操作
第一轮操作:
读取指令:从0号地址读取到 00101110
解析指令:操作码:0010;操作数:1110(10进制:14),通过查询指令表该指令就是将14号地址的数据加载到A寄存器中
执行指令:将14号地址的数据:00000011(10进制:3)加载到A寄存器中
第二轮操作:
读取指令:顺序读取1号地址指令:00011111
解析指令:操作码:0001;操作数:1111(10进制:15),通过查询指令表该指令就是将15号地址的数据加载到B寄存器中
执行指令:将15号地址的数据:00001110(10进制:14)加载到B寄存器中
执行到这一步:CPU中,寄存器A:3,寄存器B:14
第三轮操作:
读取指令:顺序读取2号地址指令:10000100
解析指令:操作码:1000;通过查指令表,此处是将两个寄存器的数据求和并将求和后的数据加载到第二个寄存器,操作数:0100,此处的01 和 00 就代表两个寄存器的id,id是在CPU设计出来的时候提前约定好的,这里就假定01:B,00:A
执行指令:AB寄存器中数据求和等于17 并将其加载到A中
此时CPU中,寄存器A:17,寄存器B:14
第四轮操作:
读取指令:顺序读取3号地址指令:01001101
解析指令:操作码:0100;操作数:1101(10进制:13),通过查指令表,此处将A寄存器中的数据加载到13号地址处
执行指令:13号地址的数据:00000000 -> 00010001(17的二进制形式)
第五轮操作:
读取指令:顺序读取4号地址指令:00000000
解析指令:操作码:0000;操作数:0000,指令表中没有0000的操作码,一般认为程序运行结束
执行指令:程序退出
🙉本篇文章只是对CPU进行了大致的了解,接下来会对操作系统的相关知识进行讲解