gpt4 book ai didi

linux-kernel - sched_wakeup_granularity_ns 、 sched_min_granularity_ns 和 SCHED_RR

转载 作者:行者123 更新时间:2023-12-05 05:23:19 30 4
gpt4 key购买 nike

我的框中的以下值:

sysctl -A | grep "sched" | grep -v "domain"

kernel.sched_autogroup_enabled = 0
kernel.sched_cfs_bandwidth_slice_us = 5000
kernel.sched_child_runs_first = 0
kernel.sched_latency_ns = 18000000
kernel.sched_migration_cost_ns = 5000000
kernel.sched_min_granularity_ns = 10000000
kernel.sched_nr_migrate = 32
kernel.sched_rr_timeslice_ms = 100
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
kernel.sched_shares_window_ns = 10000000
kernel.sched_time_avg_ms = 1000
kernel.sched_tunable_scaling = 1
kernel.sched_wakeup_granularity_ns = 3000000

表示在一秒内,0.95秒用于SCHED_FIFO或SCHED_RR,只有 0.05 保留给 SCHED_OTHER ,我很好奇的是
sched_wakeup_granularity_ns ,我用谷歌搜索并得到解释:

Ability of tasks being woken to preempt the current task. 
The smaller the value, the easier it is for the task to force the preemption

我认为 sched_wakeup_granularity_ns 只影响 SCHED_OTHER 任务,SCHED_FIFO 和 SCHED_RR 不应该处于 sleep 模式,所以不需要“唤醒”,我是对的吗?!

对于 sched_min_granularity_ns,解释是:

Minimum preemption granularity for processor-bound tasks. 
Tasks are guaranteed to run for this minimum time before they are preempted

我想知道,虽然 SCHED_RR 任务可以拥有 95% 的 cpu 时间,但是由于 sched_min_granularity_ns 值 = 10000000,它是 0.01 秒,这意味着每个 SCHED_OTHER 在被抢占之前获得 0.01 秒的时间片运行,除非它被阻塞套接字或 sleep 或其他阻塞,这意味着如果我在核心 1 中有 3 个任务,例如,2 个任务与 SCHED_RR,第三个任务与 SCHED_OTHER ,第三个任务只是运行一个无限循环,没有阻塞 socket recv 也没有 yield ,所以一旦第三个任务获得 cpu 并运行,它将运行 0.01 秒然后上下文切换,即使下一个任务优先于 SCHED_RR ,这是对 sched_min_granularity_ns 用法的正确理解?!

编辑:

http://lists.pdxlinux.org/pipermail/plug/2006-February/045495.html

描述:

No SCHED_OTHER process may be preempted by another SCHED_OTHER process.
However a SCHED_RR or SCHED_FIFO process will preempt SCHED_OTHER
process before their time slice is done. So a SCHED_RR process
should wake up from a sleep with fairly good accuracy.

意味着 SCHED_RR 任务可以抢占无尽的 while 循环而不会阻塞甚至时间片没有完成?!

最佳答案

具有较高调度类“优先级”的任务将抢占具有较低优先级调度类的所有任务,而不管任何超时。看一下 kernel/sched/core.c 中的以下代码片段:

void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags)
{
const struct sched_class *class;

if (p->sched_class == rq->curr->sched_class) {
rq->curr->sched_class->check_preempt_curr(rq, p, flags);
} else {
for_each_class(class) {
if (class == rq->curr->sched_class)
break;
if (class == p->sched_class) {
resched_curr(rq);
break;
}
}
}

/*
* A queue event has occurred, and we're going to schedule. In
* this case, we can save a useless back to back clock update.
*/
if (task_on_rq_queued(rq->curr) && test_tsk_need_resched(rq->curr))
rq_clock_skip_update(rq, true);
}

for_each_class 将按以下顺序返回类:停止、截止日期、rt、公平、空闲。当尝试抢占与抢占任务具有相同调度类的任务时,循环将停止。

所以对于你的问题,答案是肯定的,“rt”任务将抢占“公平”任务。

关于linux-kernel - sched_wakeup_granularity_ns 、 sched_min_granularity_ns 和 SCHED_RR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136641/

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