Linux进程管理与调度机制详解
1. 进程调度基础
进程调度器是内核子系统,负责在系统的各个进程之间分配有限的处理器时间。简单来说,它决定了接下来要运行哪个进程。在决定哪些进程可以运行以及何时运行时,调度器要在最大化处理器使用率的同时,营造出多个进程在同时无缝执行的假象。
可运行进程是指未被阻塞的进程,而阻塞进程则是处于睡眠状态、等待内核进行I/O操作的进程。与用户交互、频繁读写文件或响应网络事件的进程,在等待资源可用时往往会花费大量时间处于阻塞状态,在这些时间段内它们是不可运行的。如果只有一个可运行进程,进程调度器的工作就很简单:运行该进程。但当可运行进程的数量超过处理器数量时,调度器的价值就体现出来了。在这种情况下,一些进程会运行,而其他进程则必须等待轮到它们。决定哪些进程运行、何时运行以及运行多长时间,是进程调度器的基本职责。
操作系统的多任务处理有两种类型:协作式和抢占式。Linux采用的是抢占式多任务处理,即调度器决定一个进程何时停止运行,另一个进程何时恢复运行。我们将暂停一个正在运行的进程以运行另一个进程的行为称为抢占。进程在被调度器抢占之前被允许运行的时间长度称为该进程的时间片,之所以这样称呼,是因为调度器为进程分配了处理器时间的“一片”。
在协作式多任务处理中,进程直到自愿决定停止运行才会停止。自愿暂停自身被称为让步。理想情况下,进程会频繁让步,但操作系统无法强制这种行为。一个不礼貌或有问题的程序可能会运行很长时间,破坏多任务处理的假象,甚至无限期运行,导致整个系统崩溃。由于这种方法的缺点,现代操作系统几乎普遍采用抢占式多任务处理,Linux也不例外。
Linux的进程调度器多年来发生了变化。自Linux内核版本2.6.2