实战操作:进程优先级与调度策略

进程优先级与调度策略

基础知识

1、Linux内核当中有三种调度策略:

  • SCHED_OTHER 分时调度策略
  • SCHED_FIFO 实时调度策略,先到先服务
  • SCHED_RR 实时调度策略,时间片轮转

备注:如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃之后才可以运行这个优先级相同的任务。而RR可以每个任务都执行一段时间。

2、获取线程设置的最高和最低优先级函数如下

int sched_get_priority_max(int policy); 获取实时优先级的最大值

int sched_get_priority_min(int policy); 获取实时优先级的最小值

SCHED_OTHER它不支持优先级使用,而SCHED_RR/SCHED_FIFO支持优先级使用,它们具体为1-99,数值越大优先级越高。

实时调度策略(SCHED_FIFO/SCHED_RR) 优先级最大值为99,最小值为1;有SCHED_FIFO先到先服务和实时调度策略,时间片轮转。

普通调度策略(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数。

3、设置和获取优先级2个主要核心函数

int pthread_attr_setschedparamg(pthread_attr_t *attr, const struct sched_param *param); 创建线程优先级

int pthread_attr_getschedparamg(pthread_attr_t *attr, const struct sched_param *param); 获取线程优先级

struct sched_param
{
    int __sched_priority;  // 所有设定的线程优先级
}
param.sched_priority=11  // 设置优先级

当操作系统创建线程时,默认线程是SCHED_OTHER,我们也可以通过改变调度策略,使用如下函数:

int pthread_attr_setschedpolicy(pthread_attr_t *attr , int policy) 设置线程调度策略。

基础案例分析

1,操作系统所支持优先级测试程序分析

THE END