gpt4 book ai didi

Linux 调度策略 : SCHED_FIFO against SCHED_RR

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:13 26 4
gpt4 key购买 nike

根据我在搜索过程中了解到的情况,FIFO 任务需要阻塞或自愿放弃,以便释放 CPU 并允许其他任务在该 CPU 上运行。我不能确定的是 3 个具体情况:

1) 优先级为 99 的(可运行的)FIFO 任务是否会抢占优先级为 90 的(运行中的)FIFO 任务?

我认为答案是否定的,请发表评论

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

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

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

我认为答案是否定的,请发表评论

采用最新的 Linux RedHat 内核。

谢谢

亚历克斯

最佳答案

在 linux 中,SCHED_FIFO 和 SCHED_RR 共享实时优先级,至少在用户空间中从 0 到 99(99 是最高的)。从现在开始,我假设您正在谈论这些优先级 (rt_priority) 而不是内部 prio 字段。在此处给出此信息后,您的场景应该如何工作:

  1. 由于 99 更高,它将抢占任务 90 的 FIFO 任务,除非该任务禁用了抢占。
  2. 不,因为优先级 50 较低,所以它不能抢占优先级 99 的任务。
  3. 是的,优先级 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 调度策略 : SCHED_FIFO against SCHED_RR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46500155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com