Linux 线程的调度策略与优先级
16 Oct 2013调度策略有3种:
- SCHED_OTHER: 分时调度策略。线程的默认策略。此策略不能设置线程优先级。
- SCHED_FIFO: 实时调度策略,先到先服务。一旦线程占用cpu则一直运行。直到有更高优先级任务到达或自己放弃。此策略可设置线程优先级。
- 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);