设置内核线程的调度策略

来源:互联网 发布:java开发界面 编辑:程序博客网 时间:2024/06/11 01:58
调度策略总共分为三种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_setschedulerstatic 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;}


原创粉丝点击