linux内核的三种调度方法:
1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务
3,SCHED_RR实时调度策略,时间片轮转
SCHED_RR调度和SCHED_FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。
当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
SCHED_RR线程和SCHED_FIFO线程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。
使用pthread_yield()可以放弃线程的执行权
采用SCHED_RR和SCHED_FIFO的实时线程调用pthread_yield后,还是处于就绪队列中,没有同等优先级或者更高优先级的情况下,他们将继续运行
linux内核的调度单位是线程(linux下线程和进程的概念是比较模糊的,执行线程是内核的调度对象),在测试时,使用SCHED_FIFO和SCHED_RR能够达到95%的cpu使用率,而运行while(1)的分时线程(在不通的进程里面)得到30%左右。同时同时运行带有实时调度的线程(不阻塞)的进程和分时线程时,分时线程也能获得少量的执行时间。
SCHED_FIFO和SCHED_RR并不是严格按照SCHED_FIFO和SCHED_RR定义执行的,根据linux 内核的调度策略不通其它线程或多或少获得了CPU时间(如上)
实时线程的创建需要超级用户权限
实时线程的创建
routine是执行例程,dwPriority是优先级sched_get_priority_max和sched_get_priority_min得到一般为1-99越大优先级越高
int create_fifo_thd(void* (* routine)(void* param),int dwPriority)
{
int hea ;
pthread_attr_t Attr;
pthread_attr_init(&Attr);
/*优先级继承 pthread_attr_setinheritsched 后SCHED_RR SCHED_FIFO 才会起作用********************/
if (pthread_attr_getinheritsched(&Attr, &hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
hea = PTHREAD_EXPLICIT_SCHED;
if (pthread_attr_setinheritsched(&Attr, hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_EXPLICIT_SCHED\n");
// exit(1);
/***********************************************************************/
if (pthread_attr_setschedpolicy(&Attr,SCHED_FIFO) != 0)
printf("\npthread_attr_setschedpolicy\n");
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
if (pthread_attr_setschedparam(&Attr,&sch_param) != 0)
printf("\npthread_attr_setschedparam\n");
pthread_t pid = 0;
if (pthread_create(&pid,&Attr,routine,0) != 0) {
printf("\npthread_create err\n");
}
pthread_attr_destroy(&Attr);
return pid;
}
int create_rr_thd(void* (* routine)(void* param),int dwPriority)
{
int hea ;
int policy;
pthread_attr_t Attr;
pthread_attr_init(&Attr);
/*优先级继承 pthread_attr_setinheritsched 后SCHED_RR SCHED_FIFO 才会起作用********************/
if (pthread_attr_getinheritsched(&Attr, &hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
hea = PTHREAD_EXPLICIT_SCHED;
if (pthread_attr_setinheritsched(&Attr, hea) != 0)
printf("\npthread_attr_getinheritsched err\n");
if (hea == PTHREAD_INHERIT_SCHED)
printf("\nPTHREAD_INHERIT_SCHED\n");
else if (hea == PTHREAD_EXPLICIT_SCHED)
printf("\nPTHREAD_EXPLICIT_SCHED\n");
/***********************************************************************/
if (pthread_attr_setschedpolicy(&Attr,SCHED_RR) != 0)
printf("\npthread_attr_setschedpolicy\n");
pthread_attr_getschedpolicy(&Attr,&policy);
if (policy == SCHED_RR) {
printf("\nSCHED_RR\n");
} else if (policy == SCHED_FIFO) {
printf("\nSCHED_FIFO\n");
} else if (policy == SCHED_OTHER) {
printf("\nSCHED_OTHER\n");
}
//exit(1);
pthread_attr_setdetachstate(&Attr,PTHREAD_CREATE_DETACHED);
struct sched_param sch_param;
sch_param.sched_priority = dwPriority;
if (pthread_attr_setschedparam(&Attr,&sch_param) != 0)
printf("\npthread_attr_setschedparam\n");
pthread_t pid = 0;
if (pthread_create(&pid,&Attr,routine,0) != 0) {
printf("\npthread_create err\n");
}
pthread_attr_destroy(&Attr);
return pid;
}