分类: LINUX
2013-12-02 17:56:14
原文地址:Linux内核之进程优先级 作者:harvey_perfect
Linux内核之进程优先级
作者:harvey wang
邮箱:
注:本文参考的内核代码版本为3.3.5
在进程控制块定义中,如下,每个进程有4个优先级成员变量,往往给初学者造成一些困惑。下面分实时进程和普通进程看看他们都用了哪些优先级?
struct task_struct { 删除了无关的成员变量
int prio, static_prio, normal_prio;
unsigned int rt_priority;
}
实时进程的优先级
在调用函数sched_setscheduler()设置实时进程优先级时,最终调用了下面的函数
其中进程的rt_priority 就等于配置给进程的优先级,而进程的normal_prio=MAX_RT_PRIO-1 - p->rt_priority; p->prio =p->normal_prio; 即 prio和normal_prio都与rt_priority成反比。
我们知道,在调度时使用了prio,其数值0对应最高优先级,99为最低实时优先级。Prio和normal_prio 数值越大优先级越小,而rt_priority的数值越大优先级越大。
这就是为什么有人说实时进程优先级数值越小优先级越高,也有人说实时进程优先级数值越大优先级越高的原因。
另外,实时进程只是用了四个优先级变量中的三个(prio、normal_prio和rt_priority),而没有使用static_prio。
普通进程
在调用接口set_user_nice()设置普通进程的优先级时,读者可以自己顺着函数set_user_nice()查看下面的关系。
p->static_prio = NICE_TO_PRIO(nice);
p->prio = effective_prio(p); 即p->prio = p->static_prio;
p->normal_prio = p->static_prio 参见函数effective_prio(p);
结论是:非实时进程的static_prio、prio和normal_prio 一直保持相同。
另外,从函数effective_prio()来看,非实时进程的动态优先级等于其静态优先级。内核不再动态修改其优先级。