进程调度的基本过程:
一句话总结——进程调度的基本过程就是规划时间表的过程
我们假设我们的计算机是单CPU核的计算机
操作系统对CPU资源的分配,采用的是时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源。
同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列中等待,等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下,操作系统就需要从众多的就绪进程中选择一个最合适的进程来运行,这个就是调度器需要做的事情。
进程调度涉及到几个属性:
- 状态:描述当前这个进程接下应该怎样调度,其中有两个常见状态
就绪状态:随时可以去CPU上执行
阻塞状态/睡眠状态:暂时不可以去CPU上执行 - 优先级:决定谁先谁后的问题
- 记账信息:统计每个进程都分别被执行了多久,分别都执行了哪些指令,分别都排队等了多久,以便为进程调度提供指导依据
- 上下文:表示上次进程被调度处CPU的时候,当时程序的执行状态,下次进程上CPU的时候,就可以回复之前的状态,然后继续往下执行
进程被调度处CPU之前,要先把CPU中的所有寄存器中的数据都给保存到内存中(PCB的上下文字段中),这个操作相当于存档。
下次进程再被调度上CPU的时候,就可以从刚才的内存中恢复这些数据到寄存器中,这个操作相当于读档。
进程调度的核心就是操作系统如何考虑CPU资源给各个进程分配的问题。
这里就引出了一个概念:虚拟地址空间。
在我们的操作系统上,会有很多个进程运行着,那么如果某个进程发生奔溃了,它会不会影响其它进程?
答案是不会的,因为存在一个“进程独立性”的东西,而这个东西,依仗的就是虚拟地址空间。
虚拟地址空间隔开了每个进程,但是不影响进程之间的相互交互。
它类似于我们的共同空间。打个比方,在疫情的时候有一个小区有人在隔离了,每一个人我们把他比作一个进程,那么如何保证志愿者给他送菜的时候不接触到别人。
很简单,我们在小区里开辟一个共同空间,先把菜放到哪里,然后让他自己来取,这样就避免了可能传染的问题。