根据我在搜索过程中的理解,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内核。
谢谢你
亚历克斯

最佳答案

在linux中,SCHED_FIFO和SCHED_RR共享实时优先级,至少在用户空间中从0到99(99是最高的)。从现在开始,我假设你在谈论这些优先级(rt_priority),而不是内部prio字段。根据这里的信息,您的场景应该如何工作:
由于99更高,它将抢占任务90的FIFO任务,除非该任务禁用抢占。
不,因为优先级50较低,所以它不能抢占优先级99的任务。
是的,优先级99更高,所以它应该抢占优先级50的任务。
最后,如果你混淆了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;
}

关于linux - Linux调度策略:针对SCHED_RR的SCHED_FIFO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46500155/

10-14 03:04