调度策略总共分为三种
1:sched_normal 非实时调用,就是常说的cfs,优先值的范围为100~139,有nice值决定
2:sched_fifo 实时调用策略,先到先服务,高优先级的可以抢占第优先级的.
3:sched_RR 实时调用策略,按照时间片运行,同样高优先级的可以抢占第优先级的.
这两种优先级的额凡是是0~MAX_RT_PRI0-1 , 其中MAX_RT_PRI0等于100.
我们在创建内核线程的执行函数中可以调用sched_setscheduler 等函数来改变调动策略。例如下例所示:
static int power_saving_thread(void *data)
{
struct sched_param param = {.sched_priority = 1};
int do_sleep;
unsigned int tsk_index = (unsigned long)data;
u64 last_jiffies = 0;
sched_setscheduler(current, SCHED_RR, ¶m);
}
那我们看看sched_setscheduler 是如何设置调度策略的
sched_setscheduler->_sched_setscheduler->__sched_setscheduler
static void __setscheduler(struct rq *rq, struct task_struct *p,
const struct sched_attr *attr, bool keep_boost)
{
__setscheduler_params(p, attr);
/*
* Keep a potential priority boosting if called from
* sched_setscheduler().
*/
p->prio = normal_prio(p);
if (keep_boost)
p->prio = rt_effective_prio(p, p->prio);
可见最终是根据优先级还设置当前线程属于那个调度类的。本来很明显就属于rt clss
if (dl_prio(p->prio))
p->sched_class = &dl_sched_class;
else if (rt_prio(p->prio))
p->sched_class = &rt_sched_class;
else
p->sched_class = &fair_sched_class;
}
设置内核线程的调度策略
最新推荐文章于 2024-08-26 19:39:48 发布