Linux内核线程优先级的三种调度策略

Linux系统开发维护实战 专栏收录该内容
34 篇文章 7 订阅

Linux内核三种调度策略:      

 (1).SCHED_OTHER 分时调度策略

 (2).SCHED_FIFO  实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。

  (3).SCHED_RR实  时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);

1). 第一个参数,用来保存创建好后线程uid

2). 第二个参数,即线程属性,通常传NULL,表示默认属性,这个属性在创建前可以设置,包括调度策略,栈大小,优先级等等

3). 第三个参数,即线程入口函数

4). 第四个参数,传给线程的参数

所以在创建线程前,对 第二个参数 pthred_attr_t 结构体进pthread_attr_t 进行赋值

1). pthread_attr_init(pthread_attr_t *attr);//使用默认值填充初始化

2). //获取设置栈大小 //这个属性只能在线程创建前设置,后面不能动态修改了

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

3). //设置获取调度策略

SCHED_FIFO, SCHED_RR, and

SCHED_OTHER //policy支持这三种值,

1). SCHED_OTHER 分时调度策略,

2). SCHED_FIFO实时调度策略,先到先服务

3). SCHED_RR实时调度策略,时间片轮转 

    SCHED_OTHER(分时调度)是不支持优先级使用的,其他两个实时调度可以

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

4). //设置调度参数,目前这个参数里面就一个量,优先级 //用户程序设置实时任务这个优先级,值越大,优先级越高

struct sched_param {

int sched_priority; /* Scheduling priority */

};

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);

5).//是否分离属性

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

上面这些都是静态,在创建线程之前的设置。

创建之前设置属性和创建好后修改属性,注意  sched_setscheduler 的第一个参数是 pid_t ,非pthread_t。

      pthread_t 和pid_t, 是两个不同的标识符,分别可以通过 pthread_self()  和getpid()来获取当前运行线程的相应标识符。所以上面所说线程运行起来后再动态修改优先级,这个修改放在线程体里面调用即可,通过getpid()来获取pid_t. (还没有深入了解关于具体的 pthread_t 和pid_t的区别,看到一种说法是 pthraed_t用来区分表示同一个进程之间的线程,而pid_t才是系统中认为的线程唯一标识符,没有找到关于这两个是否可以相互转换的说法,估计涉及到具体的操作系统)。

Ex1:

创建之前就设置好优先级

//创建线程之前就定好调度优先级 
//需要相关函数头文件 #include<errno.h> #include <sched.h>
pthread_t pliveThread;
 
  pthread_attr_t  pthread_pro;
  pthread_attr_init(&pthread_pro);
 
  pthread_attr_setschedpolicy(&pthread_pro, SCHED_FIFO);
  struct sched_param s_parm;
  s_parm.sched_priority = sched_get_priority_max(SCHED_FIFO);
  pthread_attr_setschedparam(&pthread_pro, &s_parm);
 
  int ret = 0;
  if(0 != (ret = pthread_create(&pliveThread,&pthread_pro,live555_main,url))){
       printf("craete thread erro: %s",strerror( ret));
        return -1;
  }

Ex2:

创建之后设置优先级:

//在待提升优先级的线程体中运行
    int ret =0;
    pid_t pid =getpid();
    int curschdu = sched_getscheduler(pid);
    if(curschdu <0 )
    {
        printf( "getschedu err %s\n",strerror( errno));
    }
    printf("schedu befor %d\n",curschdu);
    struct sched_param s_parm;
    s_parm.sched_priority = sched_get_priority_max(SCHED_FIFO);
    printf("schedu max %d min %d\n",sched_get_priority_max(SCHED_FIFO),sched_get_priority_min(SCHED_FIFO));
    
    ret = sched_setscheduler(pid, SCHED_FIFO, &s_parm);
    if(ret <0)
    {
       printf( "setschedu err %s\n",strerror( errno));
    }
    curschdu = sched_getscheduler(pid);
    printf("schedu after %d\n",curschdu);

 

 

 

 

 

 

  • 0
    点赞
  • 0
    评论
  • 9
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值