设置内核线程的调度策略

调度策略总共分为三种
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值