linux进程管理和调度(一)
内核和处理器建立了多任务的错觉,即可以并行做几种操作,这是通过以很短的间隔在系统运行的应用程序之间不停切换而做到的。由于切换间隔如此之短,使得用户无法注意到短时间内的停滞,从而在感观上觉得计算机能够同时做几件事情。
- 内核必须决定为各个进程分配多长时间,何时切换到下一个进程。这又引出了哪个进程是下一个的问题。此类决策是平台无关的。
- 在内核从进程A切换到进程B时,必须确保进程B的执行环境与上一次撤销其处理器资源时完全相同。例如,处理器寄存器的内容和虚拟地址空间的结构必须与此前相同。
这两个任务是称之为调度器的内核子系统的职责
1. 进程优先级
首先进行比较粗糙的划分,进程可以分为实时进程和非实时进程
- 硬实时进程有严格的时间限制,某些任务必须在指定的时限内完成
- 软实时进程是硬实时进程的一种弱化形式;进程在需要CPU时间时应该能够得到保证,至少优先于所有其他普通进程
- 大多数进程是没有特定时间约束的普通进程,但仍然可以根据重要性来分配优先级
后续会深入讨论调度器的实现细节。
2. 进程生命周期
当调度器在进程之间切换时,必须知道系统中每个进程的状态。将CPU时间分配到无事可做的进程,显然是没有意义的。进程在各个状态之间的转换也同样重要。例如,如果一个进程在等待来自外设的数据,那么调度器的职责是一旦数据已经到达,则需要将进程的状态由等待改为可运行。
进程可能有以下几种状态:
- 运行:该进程此刻正在执行。
- 等待:进程能够运行,但没有得到许可,因为CPU分配给另一个进程。调度器可以在下一次任务切换时选择该进程。
- 睡眠:进程正在睡眠无法运行,因为它在等待一个外部事件。调度器无法在下一次任务切换时选择该进程。