睡眠不到1ms

时间:2012-10-31 06:33:54

标签: c linux usleep

我正在尝试创建cpu load generator工具。其中我的输入将是0到100之间的数字。我使用时间函数计算负载,然后检查负载。如果负载超过期望值,我会尝试睡眠过程。我面临的问题是我获得了所需的负载,但仅限于500ms或更长的时间段。不低于那个。我在一个名为'top'的工具上检查负载。当我试图减少顶部的时间段。我观察到负载波动。有没有办法让进程睡眠时间不超过1毫秒。

5 个答案:

答案 0 :(得分:3)

由于您在linux-kernel上标记了这个问题,我将回答有关Linux调度程序的具体细节......

简短的回答:没有你不能睡不到1毫秒,因为这是调度程序的分辨率。换句话说,内核每毫秒唤醒以决定调度哪个进程,因此无法进行低于此的休眠。

答案很长:为Linux设计一个cpu负载生成器是一个复杂到足以得到多个出版物的主题。您可以在Google学术搜索中尝试使用 cpu burner cpu load generator 这些术语来查找更多信息。现在最有效的方法之一就是不要这样做:在任何最新内核的cgroups功能中都存在cpu带宽限制,这意味着你不必执行代码来限制其他进程可用的cpu时间量。

并且不,nanosleep不保证您的流程将被停止,只是时钟提前至少您请求的时间。

答案 1 :(得分:1)

nanosleep(2)但是无保证由于计划安排,进程将按照确切的请求时间休眠。您也可以将其与renice(8)结合使用 将流程设置为更高的优先级。

答案 2 :(得分:1)

使用nanosleep function。它要求暂停调用线程至少给定的纳秒分辨率持续时间。

答案 3 :(得分:1)

操作系统中的计时器始终不可靠和准确。通常,OS计时器非常适合大多数用途。但是如果你想获得一些高分辨率的标记,你必须这样做: 1,检查系统硬件,即有任何定时器发生器可以提供硬件定时器中断; 2,检查OS系统,没有其他进程/线程或设备将屏蔽硬件定时器中断;如果可能的话,还可以注册定时器设备中断并将定时器值调到所需的时间; 3,同时,当你得到设计的中断来检查时间浮动和准确性时,cputime也被用作参考。 它更喜欢使用一些技术来做到这一点。 Nanosleep不知何故没有按你的意愿工作。

答案 4 :(得分:1)

我认为在短至500毫秒的时间窗口上生成固定的CPU负载是不可能的。考虑到CPU是一个动态系统,很难从数学角度进行建模。您可以做的是生成一个平均与您想要达到的目标匹配的CPU负载。

例如,这个简单的脚本https://github.com/GaetanoCarlucci/CPULoadGenerator通过PID调节器控制CPU内核的“休眠时间”,以便平均达到所需的CPU负载。

在这里,您可以看到在CPU核心0上生成50%负载的动态示例:

enter image description here

您可以注意到瞬态时间大于500毫秒。