1.进程调度的目标:进程响应时间尽可能快,后台作业的吞吐量尽可能高,尽可能避免进程的饥饿现象,低优先级和高优先级进程需要尽可能调和。
2.Linux的调度基于分时(time sharing)技术:多个进程以“时间多路复用”方式运行;CPU的时间被分成片;分时依赖于定时中断,对进程是透明的。
3.在Linux中,进程的优先级是动态的。较长时间间隔内没有使用CPU的进程,会动态的增加它们的优先级;在CPU上运行了较长时间的进程,会减少它们的优先级。
4.传统上把进程分类为和I/O-bound和CPU-bound。
还有一种分类法把进程分为三类:
(1)交互式进程:大部分时间在等待输入,接受输入后应很快被唤醒。
(2)批处理进程:后台运行,常受到调度程序的慢待。典型的批处理进程如编译程序,数据库搜索引擎及科学计算。
(3)实时进程:有很强的调度需要,应该有一个短的响应时间。
Linux 2.6调度程序实现了基于进程过去行为的启发式算法,以确定进程应该被当作交互式进程还是批处理进程。
5.Linux的进程是抢占式的。如果进程进入TASK_RUNNING状态,内核检查它的动态优先级是否大于当前正运行进程的优先级,如果是,正在运行的进程被中断,并调度选择另一个进程运行。进程在它的时间片到期时也可以被抢占。
6.时间片长短的考虑因素:时间片太短,进程切换会非常频繁,系统开销会变高;时间片太长会降低系统的响应能力(并不全对,因为Linux的进程调度是抢占式,但是在部分情况下是会降低系统的响应能力,比如大部分进程都是交互式进程)。
对时间片大小的选择始终是一种折衷,Linux采取单凭经验的方法,选择尽可能长又能保持良好响应时间的时间片。
7.Linux进程有三个调度类型:
(1)SCHED_FIFO:先进先出的实时进程。
(2)SCHED_RR:时间片轮转的实时进程。
(3)SCHED_NORMAL:普通的分时进程。
8.每个普通进程都有自己的静态优先级,调度程序使用静态优先级来估价系统中这个进程与其他普通进程之间调度的程度。内核使用100-139的数来表示静态优先级,值越大静态优先级越高。静态优先级本质上决定了进程的基本时间片,静态优先级越高,基本时间片就越长。普通进程还有动态优先级,是调度程序在选择新进程来运行的时候使用的数。
9.为了避免进程饥饿,当一个进程用完它的时间片时,它应该被还没有用完时间片的低优先级进程取代。为了实现这种机制,调度程序维持两个不相交的可运行进程的集合:
(1)活动进程:这些进程还没有用完它们的时间片,因此允许它们运行。
(2)过期进程:这些可运行进程已经用完了它们的时间片,并因此被禁止运行,直到所有活动进程都过期。
10.每个实时进程都与一个实时优先级相关,实时优先级是一个范围从1-99的值。实时进程总是被当作活动进程。
实时进程被取代的条件:
(1)进程被另外一个具有更高实时优先级的实时进程抢占。
(2)进程被阻塞。
(3)进程停止。
(4)主动调用放弃CPU。
(5)进程是基于SCHED_RR,并且用完了时间片。
11.创建子进程时,父进程剩余的时间片会被分为两等份,一份给自己,一份给子进程,这样可以避免频繁创建子进程而获得无限的CPU时间。
12.schedule()函数实现调度程序,可以采取主动调用和延迟调用的方式。