【问题标题】:Clock frequency of the CPU & measuring time elapsesCPU的时钟频率和测量时间
【发布时间】:2013-04-02 07:28:22
【问题描述】:

我想知道“1ms 睡眠”需要多少时间。

在内核模块中运行这个任务:

rdtscl(aj);
msleep(1);
rdtscl(b);
printk(KERN_INFO "Difference = %lu", (b-a));// Number of clock cycles consumed

我得到的输出:

Difference = 13479219

cat /proc/cpuinfo 的输出

cpu MHz : 1197.000

这样,我计算了延迟,得到了 11.26 毫秒。

为什么我没有在 1 毫秒左右得到它?

更新:

cat /proc/cpuinfo 中的处理器频率应该从以下行获得:

model name  : Intel(R) Core(TM) i3 CPU         540  @ 3.07GHz

=> 处理器频率为 3.07 GHz。不知道这条线“cpu MHz : 1197.000”是什么意思。

谢谢

【问题讨论】:

    标签: linux-kernel cpu kernel cpu-speed


    【解决方案1】:

    进程分辨率取决于您运行测试代码的系统上配置的 HZ 值。 HZ 值可以是 100 或 1000,如果是 100,那么调度程序将在 10 毫秒内只唤醒一次。大多数在桌面系统中,在最近的发行版中,它将被设置为 1000。(您可以在 Fedora 的 /boot 中检查配置文件)。调度程序将仅基于此进行调度,因此如果调度程序每 10 毫秒唤醒一次,则无法获得小于 10 毫秒的分辨率。或者你需要在内核中使用 HR 计时器。

    kernel-3.4.5 (u3-1 *)$ cat /boot/config-3.6.10-4.fc18.x86_64 | grep HZ
    CONFIG_NO_HZ=y
    # CONFIG_RCU_FAST_NO_HZ is not set
    # CONFIG_HZ_100 is not set
    # CONFIG_HZ_250 is not set
    # CONFIG_HZ_300 is not set
    CONFIG_HZ_1000=y
    CONFIG_HZ=1000
    

    如果你真的想要延迟但不睡觉,那么你可以使用 mdelay,它只会循环指定的时间并返回。

    【讨论】:

    • {=> '这意味着'} 所以,在我的情况下,HZ 值为 250 => 可以计算的最小间隔是 4 毫秒 => 无法计算 1 毫秒间隔 => 我想以下方式:我需要增加间隔(像这样的睡眠(5))。此外,由于处理器频率为 3.05 GHz => 32 位变量每 0.76 秒溢出,我们不能给出更多的间隔 -> 解决方案:将变量大小增加到 64 位。谢谢
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2023-03-03
    • 2013-12-25
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多