微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nanosleep高CPU使用率?

我注意到一个调用nanosleep的小testing程序,在内核比2.6.22更新的Linux机器上运行时,显示cpu使用率的巨大差异。

#include <time.h> int main (void) { struct timespec sleepTime; struct timespec returnTime; sleepTime.tv_sec = 0; sleepTime.tv_nsec = 1000; while (1) { nanosleep(&sleepTime,&returnTime); } return 0; }

(是的,我知道这个程序什么都不做)

如果我编译并在openSUSE 10.3机器(2.6.22.19-0.2-default)上运行它,程序甚至不会显示在由“top”生成的进程列表中,这表明它正在使用很less的cpu时间。 如果我在openSUSE 11.1机器(2.6.27.23-0.1-default)上运行它,top会显示占用40%cpu间的程序。 在Fedora 9(2.6.25-14.fc9.i686)和Fedora 10上运行的时候,在“top”中也显示了相同的高cpu使用率。

内核的变化是否影响到了这一点?

Windows服务OnPowerEvent

为什么系统时间在这里

一个进程的信号如何影响其子线程?

在时钟漂移过程中,Windows C / Sleep()函数如何工作?

如何使电脑从待机模式返回

高精度的睡眠/等待.net

“隐式函数声明”与函数原始版本的区别

我怎么能暂停,然后恢复呼叫`睡眠`

如何睡在Linux内核?

睡在某些数字永远持续在Linux bash

这是因为将NO_HZ引入主线调度程序。

以前,你的1,000纳秒的睡眠时间通常是一整秒–100万纳秒。 现在,当机器空闲时,它实际上只是在为你所要求的而睡觉。 所以它运行while()循环和系统调用的频率大约是1000次,因此cpu使用率更高。 如果你增加tv_nsec,你会看到cpu使用率的下降。

我没有明确的答案,但我首先要看的是内核编译的配置选项:

cat /boot/config-`uname -r`

我认为可能相关的选项是CONfig_HZ , CONfig_HPET_TIMER和CONfig_HIGH_RES_TIMERS 。 也许这些内核之间有所不同……这可能会帮助你缩小范围。

以前在2.4内核上,如果在实时调度策略( SCHED_FIFO或SCHED_RR ,参见nanosleep手册页 )下运行,nanosleep会等待2 ms以下的等待,但是由于所有内核都是2.6,似乎不是一个因素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐