内核调度程序如何通过计时器中断来保持时间量精度?

时间:2018-08-26 05:32:27

标签: process linux-kernel cpu scheduling

从我的阅读中可以看出,有一个定时器中断,由硬件调用,该中断经常执行,并将控制权从正在运行的进程转移回内核/调度程序,然后内核/调度程序可以确定正在运行的进程是否超过了其时间量,如果是,运行另一个任务。

这似乎不准确。

例如: 如果计时器中断是每1个单位

并且调度程序算法将cpu绑定进程时间量确定为1.5个单位,实际上它将获得2个单位的CPU时间。

还是调度程序仅以中断计时器为单位给进程分配时间量?

1 个答案:

答案 0 :(得分:2)

Linux的调度程序(CFS)通过首先定义每个线程将运行一次的时间段来为线程分配时间片。该时间段是由sched_slice()函数计算的,并且取决于CPU上的线程数以及可以在用户空间中设置的2个变量(sysctl_sched_latencysysctl_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(完全公平调度程序)旨在做到公平,在这里就是这种情况。