linux kernel调度算法之timeslice

1. 进程的nice值与static_prio之间的转换关系

/*

* Convert user-nice values [ -20 ... 0 ... 19 ]

* to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],

* and back.

*/

#define NICE_TO_PRIO(nice) (MAX_RT_PRIO + (nice) + 20)

#define PRIO_TO_NICE(prio) ((prio) - MAX_RT_PRIO - 20)

#define TASK_NICE(p) PRIO_TO_NICE((p)->static_prio)

2. 进程的用户优先级值与static_prio之间的转换关系

/*

* 'User priority' is the nice value converted to something we

* can work with better when scaling various scheduler parameters,

* it's a [ 0 ... 39 ] range.

*/

#define USER_PRIO(p) ((p)-MAX_RT_PRIO)  

#define TASK_USER_PRIO(p) USER_PRIO((p)->static_prio)

#define MAX_USER_PRIO (USER_PRIO(MAX_PRIO))

说明:MAX_RT_PRIO为100,MAX_PRIO为140,即可计算出MAX_USER_PRIO=40

3. 时间片与进程优先级的关系

#define DEF_TIMESLICE (100 * HZ / 1000)  //默认时间片是100ms

/*

* task_timeslice() scales user-nice values [ -20 ... 0 ... 19 ]

* to time slice values: [800ms ... 100ms ... 5ms]

*

* The higher a thread's priority, the bigger timeslices

* it gets during one round of execution. But even the lowest

* priority thread gets MIN_TIMESLICE worth of execution time.

*/

#define SCALE_PRIO(x, prio) \

max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)

static unsigned int task_timeslice(task_t *p)

{

    if (p->static_prio < NICE_TO_PRIO(0))

        return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);

    else

        return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);

}

说明:

    当进程的静态优先级<120时,时间片=400*(140-prio)/20;

    当进程的静态优先级>=120时,时间片=100*(140-prio)/20;

结论:进程的时间片与其静态优先级(static_prio)相关,在运行队列中的位置与其实时优先级相关(prio)。


你可能感兴趣的:(linux kernel调度算法之timeslice)