Menu Home

Linux线程的调度策略与优先级

调度策略有3种:

  1. SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。
  2. SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。
  3. SCHED_RR: 实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。保证了所有具有相同优先级的RR任务的调度公平此策略可设置线程优先级。

这3个宏在 sched.h 中定义。

线程优先级:

不同操作系统的优先级范围是不相同的,所以在设置线程优先级的时候需要先使用下面2个函数来查询其最大值和最小值:

int sched_get_priority_max(int policy); 
int sched_get_priority_min(int policy); 

参数policy是上面介绍的调度策略中的SCHED_FILO或SCHED_RR,注意不能是SCHED_OTHER,因为SCHED_OTHER不支持优先级。

查询和设置调度策略:

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);

查询和设置线程优先级:

查询:

struct sched_param param; 
//首先查询线程的调度策略,赋给param
//参数attr是create线程时所使用的线程属性
pthread_attr_getschedparam(attr, ¶m); 
//从sched_param结构中获取线程优先级
param.__sched_priority; 

设置:

pthread_attr attr;
struct sched_param param;
//为param设置优先级10,这个值的范围由查询系统获得
param.__sched_priority = 10;
//参数attr是create线程时所使用的线程属性
pthread_attr_setschedparam(attr, ¶m);