1. 进程优先级
调度算法中最常见的一类就是优先级调度。Linux采用两种不同的优先级范围,一种是用nice值,其范围从-20到+19,默认值为零,越大的nice值意味着越低的优先级。在MacOS中,nice值代表进程时间片的绝对值,而Linux系统中,nice值表示时间片的比例。另一种是采用实时优先级,其值是可配置的,默认范围从0到99,越高的实时优先级意味着进程的优先级越高。任何实时进程的优先级都高于普通进程,也就是说nice值和实时优先级处于互不相交的两个范畴。
2. 时间片
时间片是一个数值,表示进程被抢占前所能持续的时间。调度策略会规定一个默认的时间片,时间片过长会导致系统的交互性能欠佳,而时间片过短会带来进程切换的处理耗时。调度算法根据是普通进程还是实时进程有很大的不同,对于普通进程来说,基本时间片的确定和静态优先级有关,静态优先级是内核采用的从100到139的数值来表示的,越小的数字代表了越高的静态优先级:
新进程总是继承父进程的静态优先级,不过进程可以通过nice()和setpriority()系统调用来改变自己的静态优先级。
3. Linux公平调度算法
公平调度(CFS)的做法是允许每个进程运行一段时间、循环运行、选择运行最少的进程作为下一个运行进程,而不再采用分配时间片给进程的做法了。CFS的做法是在可运行进程总数上计算出一个进程应该运行多久,而不是依靠nice值来计算时间片。nice值作为进程获取时间片的权重:越高的nice值获得越低的处理器权重。CFS设立了一个‘目标延迟’,根据进程间nice值的差值来计算时间片,假设目标延迟为20ms,那么nice值为0和5的两个进程和nice值为10和15的两个进程所获得时间片是一样的,都是高nice值获得5ms的时间片,低nice值获得15ms的时间片。
4. 进程选择
当CFS选择下一个运行进程时,它会选择具有最小虚拟运行时间(vruntime)的进程,这就是CFS调度算法的核心。CFS通过红黑树来组织运行进程队列,通过键值来寻找最小虚拟运行时间。