Linux调度策略:针对SCHED_RR的SCHED_FIFO

时间:2017-09-30 06:23:47

标签: linux scheduled-tasks

根据我在搜索过程中的理解,FIFO任务需要阻止或自愿产生,以便释放CPU并允许其他人在该CPU上运行。我无法确定的是3个具体案例:

1)prio 99的(可运行的)FIFO任务是否会抢占prio 90的(正在运行的)FIFO任务?

我相信答案是否定的,请发表评论

2)prio 50的(可运行的)FIFO任务是否会使用prio 99抢占(正在运行)RR任务(在RR时间片结束之前)?

我相信答案是肯定的,请发表评论

3)prio 99的(可运行的)RR任务是否会抢占prio 50的(正在运行的)FIFO任务?

我相信答案是否定的,请发表评论

假设有一个最新的Linux RedHat内核。

谢谢

亚历

1 个答案:

答案 0 :(得分:0)

在Linux中,SCHED_FIFO和SCHED_RR共享实时优先级,至少在用户空间中从0到99(99为最高)。从现在开始,我假设您正在讨论这些优先级(rt_priority)而不是内部prio字段。根据此信息,您的方案如何工作:

  1. 由于99更高,它将抢占任务90的FIFO任务,除非该任务禁用抢占。
  2. 不,由于优先级50较低,因此不应该抢占优先级99的任务。
  3. 是的,优先级99更高,因此它应该优先于50的任务。
  4. 最后如果你在prio和rt_prio之间感到困惑,这里是它们之间的关系,它可以在函数normal_prio中找到

    /*
     * Calculate the expected normal priority: i.e. priority
     * without taking RT-inheritance into account. Might be
     * boosted by interactivity modifiers. Changes upon fork,
     * setprio syscalls, and whenever the interactivity
     * estimator recalculates.
     */
    static inline int normal_prio(struct task_struct *p)
    {
        int prio;
    
        if (task_has_dl_policy(p))
                prio = MAX_DL_PRIO-1;
        else if (task_has_rt_policy(p))
                prio = MAX_RT_PRIO-1 - p->rt_priority; // This is for FIFO/RR Tasks
        else
                prio = __normal_prio(p);
        return prio;
    }