进程调度
在进程执行的某些时刻,内核可以决定抢占当前进程,然后重新开始执行先前被抢占的进程。这种决策称为进程调度,是由内核中的调度器来执行的
上下文
上下文就是内核重新启动一个被抢占的进程所需的状态。它是由一些对象的值组成
回忆一下,这里所谓的重启被抢占的进程是什么意思
上下文切换
通过上下文切换,控制流从一个进程传递到另一个进程
第一步:保存
保存当前进程的上下文
第二步:恢复
恢复这个进程上次被别人抢占时的状态
第三步:传递
将控制传递给这个新恢复的进程。
切换的原因
当内核代表用户程序执行系统调用时,可能会发生上下文的切换,中断也可能引发上下文切换
切换示例
- 读取的时候,这个进程等不到东西啥也干不了,就让处理器去干点别的
最开始,进程 a 运行在用户模式下,当进程 a 需要从磁盘中读取数据时,它会执行系统调用函数 read 陷入到内核中,然后陷阱处理程序向磁盘控制器发起了一个 DMA 的请求,并且安排磁盘控制器完成从磁盘到内存的数据传输。之后磁盘需要向处理器发送中断。
磁盘读取数据需要一个较长的时间,一般为几十毫秒,对于处理器来说,几十毫秒的时间是非常长的,所以内核直行从进程 a 到进程 b 的上下文切换,而不是等着什么都不做。
- 东西从磁盘里等来了,就先回来做事情
随后,进程 b 在用户模式下运行,直到磁盘发出一个中断信号,表示数据已经从磁盘传输到了内存。内核判定进程 b 已经运行了足够长的时间,就执行一个从进程 b 到进程 a 的上下文切换,将控制返回给进程 a 中,紧跟在系统调用 read 之后的那条指令,然后进程 a 继续执行,直到下一次异常发生。