1

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

在内核模块中运行此任务:

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”的含义是什么。

谢谢

4

1 回答 1

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,它只会循环指定的时间并返回。

于 2013-04-02T10:55:20.223 回答