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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)