计算机是如何工作的

目录

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资源了,就会给这个进程倾斜一些资源