【摘录自Linux内核设计】
进程调度程序
进程调度程序负责决定将那个程序投入运行,何时运行以及运行多长时间。进程调度程序可看做在可运行状态进程之间分配有限的处理器时间资源的内核子系统。调度程序没有太复杂的原理。最大限度的利用处理器时间的原则是,只要有可以执行的进程,那么就总会有进程正在执行。但是只要系统中可运行的进程数目比处理器个数多,就注定某一时刻就会有一些进程不能执行。这些进程在等待运行。在一组处于可运行态的进程中选择一个来执行,是调度程序所需完成的基本工作。
一、多任务
1.多任务操作系统
多任务操作系统就是能同时并发地交互执行多个进程的操作系统。
在单机处理器机器上,这会产生多个进程在同时运行的幻觉。
在多处理机器上,这会使多个进程在不同的处理机上真正同时、并行地运行。
无论在单处理器或者多处理器机器上,多任务操作系统都能够使多个进程
处于堵塞或者睡眠状态,也就是说,实际上不被投入执行,知道工作确实就绪。
2.多任务操作系统的分类
1.可分为两类:非抢占式多任务和抢占式多任务。
2.抢占式:Linux提供了抢占式的多任务模式。在此模式下,由调度程序决定什么
时候停止一个进程的运行,以便其他进程能够得到执行机会。这个强制
的挂起就叫做抢占(preemption)。进程在被抢占之前能够运行的时间
是预先设置好的,而且有一个专门的名字,叫进程的时间片(timeslice)。
3.非强占式:非抢占式多任务模式下,除非进程自己主动停止运行,否则它会一直执行。
【注】
时间片:时间片实际上就是分配给每个进程的处理器时间段。有效管理时间片能使调度
程序从系统全局的角度做出调度决定,这样做还可以避免个别进程独占系统资
源。
让步:进程主动挂起自己的操作称为让步。
二、Linux的进程调度
Linux2.5系列内核后,采用了一种O(1)调度程序的新调度程序,解决了先前版本的许多不足,引入了许多强大的新特性和性能特征。这里主要依赖于静态时间片算法和针对每一处理器的运行队列。
Linux2.6后,为了提高对交互程序的调度性能引入了新的进程调度算法。其中最著名的是”反转楼梯最后期限调度算法“,该算法吸取了队列理论,将公平调度的概念引入Linux调度程序。
【注】
交互进程:相应时间敏感的程序。
三、调度策略
策略决定调度程序在何时让什么进程运行。调度器的策略往往就决定系统的整体印象,并且,还要负责优化使用处理器时间。
1.I/O消耗型和处理器消耗型的进程
1.I/O消耗型进程:进程的大部分用来提交I/O请求或是等待I/O请求。因此,这样的
进程可经常处于可运行状态,但通常都是运行短短的一会儿,因为
它在等待更多的I/O请求时最后总会阻塞。
2.处理器型消耗进程:进程把时间大多用在执行代码上。除非被抢占,否则它们通常都
一直不停的运行,因为它们没有太多的I/O需求。但是,因为它们
不属于I/O驱动类型,所以从系统响应速度考虑,调度器不应该经
常让它们运行。对于处理器消耗型的进程,调度策略往往是尽量降
低它们的调度频率,而延长其运行时间。
3.调度策略的俩个平衡:进程相应迅速(响应时间短)和最大系统利用率(高吞吐量)。
2.进程优先级
调度算法中最基本的一类就是优先级的调度。这是一种根据进程的价值和其对处理器时间的需求来对进程分级的想法。通常做法是,优先级高的进程先运行,低的后运行,相同优先级的进程按轮转方式进行调度(一个接一个,重复进行)。在某些系统中,优先级高的进程使用的时间片也比较长。调度程序总是选择时间片未用尽而且优先级最高的进程运行。用户和系统都可以通过设置进程的优先级来影响系统的调度。
两种不同的的优先级范围
1.nice值:它的范围是-20到+19,默认值是0;越大的nice值就意味着更低的优先级。
相比高nice值的进程,低nice的进程可以获得更多的处理器时间。
2.实时优先级:实时优先级,其值是可配置的,默认情况下它的变化范围是从0到99(包括0和99)
与nice值的意义相反,越高的实时优先级数值意味着进程优先级越高。
任何实时进程的优先级都高于普通的进程,也就是说实时优先级和nice优先级处于
两个互不相交的范畴。
【注】
1.ps -el查看系统进程列表,结果中标记NI的一列就是进程对应的nice值
2.ps -eo state,uid,pid,ppid,rtprio,time,comm查看实时优先级
如果对应显示“-”,说明该进程不是实时进程
3.CFS调度器
在Linux中使用新的CFS调度器,其抢占时机取决于新的可运行程序消耗了多少处理器使用比。如果消耗的使用比比当前进程小,则新进程立刻投入运行,抢占当前进程。否则推迟运行。