一、并发和并行
首先,我们引入两个概念:
- 并发:多个进程在多个CPU下分别运行,称为并发;
- 并行:多个进程在1个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称为并行;
接下来我们介绍一种并行情况下,CPU基于进程切换和时间片轮转的调度算法:
每个进程执行固定的时间片的时间(通常为10ms~100ms),此时若该进程未被执行完,则会被强制挂起,然后到等待队列当作排队!
此时我们会有一个疑问:如果该进程的优先级为60,那么执行完时间片后此时再次排队还是轮到它,会被一直调用吗?
答案:不会!因为对于进程调用结束后,此时会去另一个等待队列当中排队,当运行队列中所有的进程都被执行结束后,才会再次调用该进程!
CPU当作存在不少的寄存器!
接下来我们拓展两个方面的问题:
- 为什么函数的返回值,会被外界拿到呢?
实际上我们是将返回值保存到寄存器中,然后再从寄存器中取数据!
在32位环境下,返回值通常存放在eax寄存器,64位则是eax和edx。
- 系统如何得知我们的进程当前执行到哪行代码了?
这里因为CPU内有程序计数器pc,也叫eip:作用是记录当前进程执行指令的下一行指令的地址!
程序计数器本质是一个存储指令地址的寄存器,它始终指向下一条待执行的机器指令地址。
接下来我们介绍一些常见的寄存器:
这些寄存器的作用是什么?
答案:提高效率,将进程相关的高频数据存放到寄存器中!(距离CPU越近,存储的效率越高!)
也就是说寄存器存放的是和进程相关的数据!(这些数据可能随时被CPU进行修改或者访问的!)
因此,可以得出相关结论:CPU中存放的是进程的临时数据,也就是进程的上下文!
什么是上下文?(deepseek)
进程的上下文数据主要包括CPU寄存器中的临时值,具体分为:
- 通用寄存器(如eax、erx):存储运算产生的中间数据 。
- 指令相关寄存器:
- eip(扩展指令指针):指向下一条待执行指令的地址(即程序计数器PC) 。
- ir(指令寄存器):暂存当前正在执行的指令 。
- 状态寄存器(如PS程序状态字):记录处理机的硬件状态(如中断标志、运算结果状态等)。
- 堆栈指针(如ESP):指向当前栈顶位置 。
此外,上下文还包含与进程相关的内存映射信息(如页表)、打开的文件描述符等系统级数据。
需要注意:进程在从CPU离开的时候,要将自己的上下文数据保存好,甚至带走!(否早下一个进程来执行的时候会将代码和数据进行覆盖!)
保存的目的都是为了将来再次调用的时候恢复数据!
因此进程切换的时候包含两个重要步骤:
- 保存上下文;
- 回复上下文;
那么上下文是保存到哪里的?
实际上进程的上下文是保存在对应的PCB里面!(暂时可以这样认为)