计算机是如何工作的
目录
1、CPU
2、指令
3、指令(程序)的执行
4、操作系统
6、进程
7、PCB中的关键要点
8、并发和并行
9、进程调度
1、CPU
1.1、cpu的频率
现代cpu的一个特性,会动态的根据当前的任务量,变更频率。任务量越大,睿频越高,但也是有上限的
Hz表示1s多少次
G相当于10^9,也就是10亿
3.60GHz:一秒钟能够进行36亿次的计算
1.2、cpu核心数
内核分为大核和小核,一个大核有两个逻辑处理器,一个小核有一个逻辑处理器
核心数越多,CPU就越强,工作效率越高
上图是 14核 18线程 的(4个大核,10个小核) 也就是 14个物理核心,18个逻辑核心(能同时处理18个工作)
物理核心:可以理解为真实干活的人 逻辑核心:实际上这些人能同时干几个活
2、指令
1. 指令,即指导CPU进行工作的命令,主要有操作码+被操作数组成
2. 操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。操作码可以类比为函数,操作数类比为函数参数
3. 一条指令 = 4位操作码(opcode) + 4位操作数
op => Operation code => 码
4. 指令本身也是一个数字,用二进制形式保存在内存的某个区域中。
“简化版” 的指令表:(约定为,一条指令是8个bit,1个字节)
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
1. 简单地说,寄存器也是存储数据的模块,是在cpu上的。
2. cpu 存储数据,就是通过寄存器,主要是在cpu执行指令进行各种运算的时候存储临时数据,起到一些辅助效果
3. 一个 cpu 上不止一个寄存器,大概有几十个
cpu的寄存器: 访问速度比内存要快很多 存储空间比内存小很多 成本比内存高很多 掉电之后数据会丢失
工作中可能有这样的一个场景: 生产环境中,服务器有一个严重bug,但是现在服务器还不能重启,如何给一个正在运行的程序进行修复bug?
核心思路:热(不重启)补丁
答: 找到出现bug的代码对应在内存指令中的位置,然后把这个指令修改掉,比如在这里插入一个跳转指令,让程序执行到这个指令的时候跳转到内存中的另外一段(已经修复过bug)的指令进行执行
3、指令(程序)的执行
以这段数据为例:
假设cpu从0号地址开始执行
1. 从0号地址开始执行
1)读取指令(CPU内部有专门的寄存器负责保存读到的指令)
00101110
2)解析指令(对照指令表,理解指令的含义)
把1110地址(对应十进制14)上的数据(00000011),读取到寄存器A中;
3)执行指令
2. CPU默认的就是顺序的执行下一条指令(遇到条件语句,循环语句,函数调用语句除外)
1)读取指令(读取1号地址)
10000100
2)解析指令
3)执行指令
3. CPU继续顺序的执行下一条指令
1)读取指令(读取2号地址)
10000100
2)解析指令
约定 00 是 A 寄存器的编号,01 是 B 寄存器的编号
3)执行指令
0000 0011 + 0000 1110 = 0001 0001(17),放到A中
4. CPU仍然顺序执行下一条指令
1)读取指令(读取3号地址)
0100 1101
2)解析指令
3)执行指令
把A寄存器的数据(0001 0001)写入 1101(13) 位置
5. CPU继续顺序执行下一个指令
0000 0000 遇到这样的值,我们认为程序结束了
上述过程就是3+14的运算过程
4、操作系统
操作系统是一组做计算机资源管理的软件的统称。是计算机中,最重要的“软件“
操作系统是一个搞管理的软件 1. 管理各种硬件设备
操作系统通过驱动程序,间接的管理硬件设备(驱动是和硬件配套的软件)
2. 给各种应用程序,提供一个稳定的运行环境 这些应用程序,在工作过程中是互不干扰的,即使某个应用程序有bug(比如,程序崩溃),不会影响到其他的应用程序运行
电脑上的操作系统:
Windows系列:Windows10/11等
Linux:
1. 后端开发,服务器程序使用的系统,一般都是Linux
2. 嵌入式设备,Linux也是主力系统
嵌入式:还有的设备,路由器,门禁,洗衣机,空调,投影仪等,这些设备,往往功能单一,但上面也搭载了标准的计算机(符合冯诺依曼体系结构),Linux 就是这种设备主流系统
Mac OS:苹果电脑上面的系统
手机上的操作系统:
IOS:苹果手机系统,和 MacOS 不一样 Android:当前手机市场上使用最多的系统
上述系统,彼此之间是不兼容的
6、进程
一个运行起来的程序,就称为进程(process),是操作系统中的重要概念
现代的计算机同时运行百十来个进程,很常见。但进程多了就容易乱,为了避免乱套,就需要管理,所以操作系统就需要能够很好的管理进程
站在操作系统的视角,如何管理进程? 1. 先描述进程
使用结构体,描述出进程的核心属性
用于描述进程核心属性的结构体称为进程控制块(PCB)(是个非常大的结构体,有很多属性)
2. 再把多个进程组织起来
比如,Linux这样的操作系统,是使用链表这样的形式(一个或多个链表),把多个PCB串到一起的
进程的相关操作:
1. 创建一个新的进程 创建一个PCB,初始化PCB中的各个属性,把PCB加到链表上 2. 销毁一个进程 把这个进程的PCB在链表上找到,并且从链表上删除掉 3. 查看进程列表 遍历链表,取出链表上的每个元素,把里面的一些关键信息显示到界面上
7、PCB中的关键要点
1. pid(进程id):进程的身份标识符
区分两个进程是不是同一个,就看 pid 是否相同
进程的 pid 是唯一的。每个进程运行的时候,操作系统都会分配一个唯一的 pid
2. 内存指针(一组指针) 进程需要知道要执行的指令在哪,指令依赖的数据在哪
操作系统加载exe文件的过程:
操作系统,会把exe中的指令和数据,读取出来加载到内存中,后续进程在运行过程中,就会从指令内存区域一条一条的取指令并进行执行
exe文件:可执行文件(保存在硬盘上的一段数据)
1)exe文件运行过程中,要执行的指令(二进制的) exe是程序员写代码生成的,代码最终被编译成二进制指令,包含在 exe 文件中了 2)这些指令运行过程中,依赖的数据
^
通过上述过程可以看出,进程在运行的过程中,需要依赖内存资源,用于存储指令和数据
3. 文件描述符表
1)进程运行过程中,很多时候也需要和硬盘这个硬件设备进行交互
2)硬盘上的数据是以文件的形式来组织的
3)进程在读写文件的时候,需要先"打开文件",每打开一个文件,就会把这个文件的信息保存到文件描述符表中,表里的每个项,就对应着一个打开了的文件
4)操作系统中,会把很多资源抽象成文件来表示,不一定是硬盘上的资源。例如网卡,操作系统管理网卡的时候,就是当做“文件”一样来管理
通过上述过程可以看出:
1. 进程的运行,也会依赖到硬盘,网卡等相关的资源设备
2. 进程运行,执行指令,都是靠cpu的,进程也需要消耗cpu资源
得出结论:进程是操作系统中,资源分配的基本单位
8、并发和并行
电脑上进程通常有百八十个,但是电脑cpu的逻辑核心数只有18个(我的电脑),如果一个cpu逻辑核心,同一时刻只能执行一个进程的指令,18个逻辑核心,如何同时进行一百多个任务的工作?
早期计算机的操作系统,是“单任务" 操作系统,同一时刻只能运行一个进程。要想运行下一个进程,就得结束上一个进程
后来有了多任务操作系统(在有多核处理器之前,多任务系统就已经有了)即使cpu只有一个核心,也能同时运行多个进程
分时复用:
把一个单位时间分成多份,第一份,运行进程1的指令;第二份,运行进程2的指令……
cpu运行速度足够快,上述的切换过程会非常快,快到超出人类的反应时间,使人看起来感觉好像这些进程在 “同时执行” 一样。但如果运行的任务实在太多了,人也是有可能感知到这个卡顿的过程
在一个CPU核心上,按照分时复用,执行多个进程这样的方式,称为 “并发执行” 看起来是同时执行,在微观上,其实是一个CPU在串行执行,切换速度极快
在多个CPU核心上,同时执行多个进程这样的方式,称为 “并行执行” 一个CPU核心执行一个进程,另一个CPU核心执行另一个进程,两个进程互不抢占CPU资源,可以同时进行
现代cpu在运行这些进程的时候,并发和并行是同时存在的。程序员在写代码的时候,无法区分当前这些进程是并行执行还是并发执行,所以会把并行和并发,统称为“并发”
9、进程调度
因为需要并发执行,操作系统需要进行进程的快速切换,也就是 “进程调度”,所以 进程调度 是操作系统进行进程管理的过程中,要完成的重要工作
定制时间表,并且按照时间表来执行,就是进程调度的过程
为了支持进程调度,PCB中进一步引入一些属性:
1. 进程状态
进程有很多状态,其中两个最典型的
1)就绪状态
该状态下,进程可以随时到cpu上进行执行
2)阻塞状态
该状态下,进程当前不适合到cpu上执行
2. 进程优先级
这么多进程的在CPU上运行的机会并不是均等的,有些进程,就是要优先级更高一些,吃到更多的cpu资源。
3. 进程的上下文
进程调度的过程中,一个进程执行一会,失去CPU,过了一段时间之后进程还会回到cpu上沿着上次执行到的状态,继续往下执行(而不能是重头执行)。
进程的上下文就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文(存档),以便再次执行该进程时,能够恢复切换时的状态,继续执行。
进程在CPU中运行的过程中,CPU上的各种寄存器不仅存储了当前进程运行的 “中间状态”,还会存储当前这个进程执行到第几条指令了,以及当前进程中“函数调用关系
保存上下文:把CPU中的这些寄存器的值,保存到内存中(PCB的对应属性中)
恢复上下文:把PCB中刚才保存属性,填写回对应的寄存器中
4. 进程的记账信息
统计功能。统计每个进程都在CPU上运行了多久,如果发现某个进程,好久没有吃到cpu资源了,就会给这个进程倾斜一些资源