4.1多任务
多任务操作系统就是能同时并发地交互执行多个进程的操作系统。在单处理器机器上,这产生多个进程在同时运行的幻觉。在多处理器机器上,这会使多个进程在不同的处理机上真正同时、并行地运行。
多任务系统可以划分为两类:非抢占式多任务和抢占式多任务。
抢占式的多任务模式:在此模式下,由调度程序来决定什么时候停止一个进程的运行,以便其他进程能够得到执行机会.这个强制的挂起动作就叫做抢占。
非抢占式多任务模式:除非进程自己主动停止运行,否则它会一直执行。
4.2 几种不同的进程和评价标准
Linux 采用了两种不同的优先级范围。第一种是用nice 值,色的范围是从-20 到+19,默认值为0 :越大的nice 值意味着更低的优先级。nice值的-20~19刚好映射到100-139之间。
第二种范围是实时优先级,其值是可配置的,默认情况下它的变化范围是从0 到99 (包括0和99 )。与nice 值意义相反,越高的实时优先级数值意味着进程优先级越高。
4.3策略
进程可以被分为I/O消耗型和处理器消耗型。所以对进程的响应做了优化(缩短响应时间),更倾向于优先调度I/O消耗型进程。
优先级 调度算站中最基本的一类就是基于优先级的调度。这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。
时间片 Linux 系统是抢占式的。当-个进程进入可运行态,它就被准许投入运行。在多数操作系统中,是否要将一个进程立刻投入运行(也就是抢占当前进程),是完全由进程优先级和是否有时间片决定的。而在Lint践中使用新的CFS 调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比。
4.4 Linux 调度算法
调度器类;Unix 系统中的进程调度:进程优先级和时间片;公平调度:CFS 称为公平调度器是因为它确保给每个进程公平的处理器使用比。
4.5 Linux 调度的实现
我们现在可以开始具体探索CFS 是如何得以实现的.其相关代码位于文件kemel/sched_fair.c 中。我们将特别关注其四个组成部分:时间记账、进程选择、调度器入口、睡眠和唤醒。
4.6 抢占和上下文切换
上下文切换:也就是从一个可执行进程切换到另一个可执行进程。
用户抢占:内核即将返回用户空间的时候,如果need_resched 标志被设置,会导致schedule()被调用,此时就会发生用户抢占。
内核抢占会发生在以下四种情况:
- 中断处理程序正在执行,且返回内核空间之前。
- 内核代码再一次具有可抢占性的时候。
- 如果内核中的任务显式地调用schedule()
- 如果内核中的任务阻塞(这同样也会导敖调用schedule()
4.9 小结
进程调度程序是内核重要的组成部分,因为运行着的进程首先在使用计算机(至少在我们大多数人看来)。然而,满足进程调度的各种需要绝不是轻而易举的,很难找到“一刀切”的算棒,既适合众多的可运行进程,又具有可伸缩性,还能在调度周期和吞吐量之间求得平衡,同时还满足各种负载的需求。不过, Linux 内核的新CFS 调度程序尽量满足了各个方面的需求,并以较完善的可伸缩性和新颖的方挫提供了最佳的解决方案。前面的章节覆盖了进程管理的相关内容,本章则考察了进程调度所遵循的基本原理、具体实现、调度算能以及目前Linux 内核所使用的接口。