我们有以下内核参数:
sysctl_sched_min_granularity = 0.75
sysctl_sched_latency = 6 ms
sched_nr_latency = 8
我理解(我不知道是否正确),参数sysctl_sched_latency
说,runqueue中的所有任务都应该及时执行6ms
。
因此,如果任务到达time X
,则任务应至少在X + 6 ms
之前执行一次。
check_preempt_tick
定期执行函数task_tick_fair
。
在此功能开始时,我们会检查delta_exec
是not greater
还是ideal_runtime
:
ideal_runtime = sched_slice(cfs_rq, curr);
delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
if (delta_exec > ideal_runtime)
例如:
4 tasks
(优先级相同)ideal_runtime
应该为第一项任务返回1.5 ms
。假设此任务已针对1.5 ms
和exit
执行。
3 tasks
已queue
了。 task2
的第二个计算是这样的:
我们在队列中有3 tasks
,因此ideal_runtime
的时间应为2 ms
。
Task2
已针对2 ms
和exit
投放。
再次
task3
计算时间,我们2 tasks
在queue
中
3ms
运行。 总结
task4
将在1.5 ms (task1) + 2ms (task2) + 3ms (task3)
因此超出了sysctl_sched_latency
(即6毫秒)。
CFS
如何确保队列中的所有任务在sysctl_sched_latency
时间内执行,此时队列可以一直动态更改?
谢谢,