linux中有两套调度类,实时调度和CFS调度,在不同的调度类中优先级的使用方法不同,但是他们的计算方法是一致的.我们这里不在乎优先级怎么被使用(后续文章中会讲),我们这里只讨论,优先级怎么算,分几类,什么关系,到底那个起作用!
抛弃你原有的一切关于优先级的概念,往下看:
首先你要知道,优先级是用整数表示的,范围是:

0-99称为实时优先级范围
100-139称为普通优先级范围
显然值越低优先级越高,实时进程的优先级一定在实时优先级范围,普通进程一般在普通优先级范围,但是可以提高到实时优先级范围,但是提高到实时优先级范围的普通进程依然是普通进程!
实时进程永远比普通进程优先调度,获得实时优先级的普通进程,只是说将会比其他的普通进程更有话语权,这里就又涉及到CFS的调度策略了,我们不展开
此外,普通优先级和nice(一个改变优先级的系统调用)值有对应关系,nice=0时优先级对应为120
nice的范围是(-20到19,为什么这么诡异呢,这你就要问写这段代码的人了)
好了,到目前为止,我们所说的优先级,即被调度类使用的优先级,他的真名叫做动态优先级,他是在task_struct中的一个项:task_struct->prio,类型是整数
那么动态优先级怎么来的呢?继承自他的父进程的普通优先级,普通优先级也是task_struct中的一个项:task_struct->normal_prio,类型是整数
那么普通优先级又是怎么来的呢:
- 对于普通进程,他的值等于静态优先级
- 静态优先级依然还是task_struct中的项,创建时指定,可以通过nice修改
- 对于实时进程,他的值等于(99-实时优先级)
- 注意这里的实时优先级同样是task_struct中的项,区别于上面说到的实时优先级范围,实时优先级取值范围是(0-99),值越大,优先级越高,因此在计算普通优先级时,需要用99去减,
捋一下逻辑,和普通进程相关的有:静态优先级,普通优先级,和动态优先级
他们的关系很明确:静态优先级=普通优先级=动态优先级
那么既然他们都相等,还整三个干嘛呢?
首先静态优先级是计算的起点,可以通过系统调用nice修改,当静态优先级改变时,普通优先级和动态优先级也会保持同步的修改.
而动态优先级可能因为调度策略的影响,而临时调整.而这个调整我是不希望继承到子进程的,因此,在设置的时候我让动态优先级继承了普通优先级,而普通优先级.
那为什么不直接继承静态优先级呢?因为还有实时进程呀!实时进程中静态优先级无效,起作用的是他的实时优先级,为了在继承的时候不区分实时进程/普通进程,就添加了普通优先级这个中间商