我想知道“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 sholud中的处理器频率可以从以下行获得:
model name : Intel(R) Core(TM) i3 CPU 540 @ 3.07GHz
=>处理器频率为3.07 GHz。不知道这行“cpu MHz:1197.000”的含义是什么。
由于
答案 0 :(得分:1)
进程解析取决于您运行测试代码的系统上配置的HZ值。 HZ值可以是100或1000,如果是100,则调度程序将在10 ms内仅唤醒一次。主要在桌面系统中,在最近的发行版中,它将设置为1000.(您可以在Fedora中的/ boot中检入配置文件)。调度程序将仅基于此进行调度,因此如果调度程序每10 ms唤醒一次,则无法获得小于10 ms的分辨率。或者您需要在内核中使用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,它将循环指定的时间并返回。