【问题标题】:linux kernel changing the ticks / jiffies to higher hz than 1000linux内核将tick / jiffies更改为高于1000的hz
【发布时间】:2015-10-16 21:27:49
【问题描述】:

是否有可能在 linux 中更改它的滴答速率以获得更精细的时间分辨率?

在我的系统中默认分辨率设置为 1000hz,这意味着我的最小延迟为 1ms,我需要一个更精确的系统,延迟为 1us 甚至 1ns,但我不知道这是否可能将其更改为 1000hz 以上。

如果可以改变,在哪里/如何实现?

考虑到我正在编写一个 c 脚本,还有其他可能的解决方法吗?

【问题讨论】:

  • 如果您只是在寻找更高的计时器分辨率(例如纳秒),您可以使用clock_gettime() 而不是乱七八糟的。更多细节可以看这个SOanswer。
  • 您需要更精细的调度程序分辨率以使系统更具反应性,还是需要更高的时间测量分辨率?
  • 这是为了更好的反应时间,能够睡 x 我们和/或执行每 x 我们
  • 你可能会进入一个负载过重的系统。在这种情况下,您将无法获得预期的效果。为什么不使用clock_gettime(2) syscall 提供的高分辨率时钟?它使用 cpu 滴答计数器,比时钟滴答给出的0.001s 提供更高的分辨率。
  • 这里相同,但由于 tc-htb(8) 使用 jiffies...

标签: c linux


【解决方案1】:

当然,它取决于硬件(如果特定嵌入式)和内核版本,但是在现代 Linux 中,睡眠时间不受 Jiffies 控制。 2.6.24以上的Linux内核可以有高精度的事件定时器(HPET)来触发一些事件。

它与应用程序睡眠无关。如果要休眠 1ms 或更短时间,则无需设置 CONFIG_HZ_1000。

在 Linux 中,您可以使用函数 usleep() 和 nanosleep()。在运行 Ubuntu 的台式 PC 中,时钟分辨率已经是 1 ns。然而,这并不意味着在非实时系统中可以完美地休眠几纳秒。

查看这个例子(用gcc clock.c -O3 -Wall -lrt -o clock编译):

#include <stdio.h>
#include <unistd.h>
#include <time.h>

int main()
{
    struct timespec res, tp1, tp2;

    clock_getres(CLOCK_MONOTONIC, &res);

    clock_gettime(CLOCK_MONOTONIC, &tp1);
    usleep(100);
    clock_gettime(CLOCK_MONOTONIC, &tp2);

    printf("resolution: %ld sec %ld ns\n", res.tv_sec, res.tv_nsec);
    printf("time1: %ld / %ld\n", tp1.tv_sec, tp1.tv_nsec);
    printf("time2: %ld / %ld\n", tp2.tv_sec, tp2.tv_nsec);
    printf("diff: %ld ns\n", (tp2.tv_sec - tp1.tv_sec) * 1000000000 + tp2.tv_nsec - tp1.tv_nsec);

    return 0;
}

默认情况下,我在所需的睡眠时间之上有额外的 60 微秒延迟。这种精度对于数百微秒的睡眠时间是可以接受的(在我的系统中为CONFIG_HZ=250)。

为了减少延迟,进程应该以更高的优先级运行,例如:

sudo chrt --rr 99 ./clock

在这种情况下,我的误差可以小于 20 us。

在对clock_gettime 的后续调用之间没有任何睡眠功能,我可以看到200 - 900 ns 范围内的延迟。因此,可以通过忙循环以usec 精度测量睡眠:

clock_gettime(CLOCK_MONOTONIC, &tp1);
clock_gettime(CLOCK_MONOTONIC, &tp2);
while (get_diff(&tp1, &tp2) < ns_time_to_sleep)
    clock_gettime(CLOCK_MONOTONIC, &tp2);

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多