bac*_*ash 39 c linux linux-kernel embedded-linux procfs
我正在寻找Linux内核的时间片(或量子)的值.
有没有/proc公开此类信息的文件?
(或)它在我的发行版的Linux头文件中是否定义良好?
(或者)是否有Linux API(可能是sysinfo)的C函数公开此值?
提前致谢.
Vil*_*ray 29
为特定过程分配的量程可能会有所不同:
您可以通过调整sched_latency_ns和 sched_min_granularity_ns来调整"切片" ,但请注意"切片"不是固定量子.另请注意,CFS抢占决策基于即时状态.任务可能已经收到了CPU时间的完整(可变)"切片",但只有当一个更值得的任务可用时才会触发抢占,因此"切片"不是您可能期望的"最大不间断CPU时间"要...但它有点类似.
对于使用SCHED_RR专用实时进程,默认的时间片是在Linux内核定义为RR_TIMESLICE在在include/linux /排程/ rt.h.
/*
* default timeslice is 100 msecs (used only for SCHED_RR tasks).
* Timeslices get refilled after they expire.
*/
#define RR_TIMESLICE (100 * HZ / 1000)
Run Code Online (Sandbox Code Playgroud)
您可以使用sched_rr_get_interval()获取特定SCHED_RR进程的SCHED_RR间隔.
Ale*_*lko 28
CFS(进程的默认调度程序)没有固定的时间片,它是在运行时根据目标延迟(sysctl_sched_latency)和正在运行的进程数计算的.时间片永远不会小于最小粒度(sysctl_sched_min_granularity).
时间片将始终在sysctl_sched_min_granularity和之间sysctl_sched_latency,默认分别为0.75毫秒和6毫秒,并在kernel/sched/fair.c中定义.
但实际的时间片不会导出到用户空间.
SCHED_OTHER流程(即在(默认)非实时循环分时策略下运行的SCHED_RR流程)和流程之间的接受答案存在一些混淆.
的sched_latency_ns和sched_min_granularity_ns文件(其旨在用于调试目的,可见仅在内核配置有CONFIG_SCHED_DEBUG)影响的调度SCHED_OTHER过程.正如Alexey Shmalko的回答所述,CFS下的时间片不是固定的(并且不会导出到用户空间),而是取决于内核参数和因素,例如流程的漂亮值.
sched_rr_get_interval()返回一个固定值,该值是SCHED_RR进程保证获得的量程,除非它被抢占或阻塞.在传统的Linux上,SCHED_RR量子是0.1秒.从Linux 3.9开始,限制可通过/proc/sys/kernel/sched_rr_timeslice_ms文件调整,其中量程表示为毫秒值,默认值为100.
小智 6
我试图用谷歌搜索这个问题是否与SCHED_RRLinux 的时间片相同,但是我从这里和内核的源代码都没有得到明确的答案。
经过进一步检查,我发现关键点是RR_TIMESLICE默认时间片(以jiffies为单位),而不是毫秒!因此,SCHED_RR无论HZ您配置了什么,默认时间片始终为100毫秒。
与的值相同/proc/sys/kernel/sched_rr_timeslice_ms,输入值以毫秒为单位,但以jiffies的形式存储和输出!
因此,CONFIG_HZ=100设置好之后,您会发现:
# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms
# cat /proc/sys/kernel/sched_rr_timeslice_ms
10
Run Code Online (Sandbox Code Playgroud)
有点困惑,希望这可以帮助您理解它!
sysctl用于在运行时读写内核参数。可用的参数列在 下/proc/sys/。此外,Linux 3.9 添加了一种用于调整(和查看)SCHED_RR量程的新机制:/proc/sys/kernel/sched_rr_timeslice_ms 文件将量程公开为毫秒值,其默认值为 100。向该文件写入 0 会将量程重置为默认值。所以你可能想尝试:
sysctl kernel.sched_rr_timeslice_ms
Run Code Online (Sandbox Code Playgroud)