从我的阅读中可以看出,有一个定时器中断,由硬件调用,该中断经常执行,并将控制权从正在运行的进程转移回内核/调度程序,然后内核/调度程序可以确定正在运行的进程是否超过了其时间量,如果是,运行另一个任务。
这似乎不准确。
例如: 如果计时器中断是每1个单位
并且调度程序算法将cpu绑定进程时间量确定为1.5个单位,实际上它将获得2个单位的CPU时间。
还是调度程序仅以中断计时器为单位给进程分配时间量?
答案 0 :(得分:2)
Linux的调度程序(CFS)通过首先定义每个线程将运行一次的时间段来为线程分配时间片。该时间段是由sched_slice()函数计算的,并且取决于CPU上的线程数以及可以在用户空间中设置的2个变量(sysctl_sched_latency
和sysctl_sched_min_granularity
):>
如果线程数大于sysctl_sched_latency / sysctl_sched_min_granularity
;则期间为nr_threads * sysctl_sched_min_granularity
;否则期间将为sysctl_sched_latency
。
例如,在我的笔记本电脑上,我具有以下值:
% cat /proc/sys/kernel/sched_latency_ns
18000000
% cat /proc/sys/kernel/sched_min_granularity_ns
2250000
因此,sysctl_sched_latency / sysctl_sched_min_granularity = 8
。现在,如果我在CPU上的线程少于8个,则每个线程将被分配18.000.000纳秒(即18毫秒);否则,每个节点将被分配2.250.000 ns(2.25 ms)。
现在,请记住这些值,如果我们使用以下命令查看滴答频率(在内核编译时定义):
% zcat /proc/config.gz | grep CONFIG_HZ
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=300
因此,在我的笔记本电脑上,我每秒有300次滴答声,这意味着每3毫秒一次滴答声。这意味着在我的情况下,CPU上有8个以上的线程,我会在时间片中放一些精度(应该运行2.25毫秒的线程将运行3毫秒),但是我可以通过重新编译来解决问题内核具有更高的滴答声。
但是,应该指出的是,这实际上不是问题,因为正如其名称所示,CFS(完全公平调度程序)旨在做到公平,在这里就是这种情况。