如何睡几微秒

Nik*_*tio 7 c linux glibc real-time libc

请考虑以下代码:

#include <stdio.h>
#include <time.h>
#include <math.h>

// Compile with gcc -lrt -lm -o test_clock test_clock.c

#define CLOCK CLOCK_MONOTONIC

int main(int argc, char** argv) {
    double temp, elapsed;
    int j;
    struct timespec requestStart, requestEnd, req;

    // Pseudo-sleep
    clock_gettime(CLOCK, &requestStart);
    temp = 0;
    for(j=0; j < 40; j++)
        temp += sin(j);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;
    printf("Elapsed: %lf us\n", elapsed);

    // Nanosleep
    clock_gettime(CLOCK, &requestStart);
    req.tv_nsec = 5000;
    req.tv_sec = 0;
    clock_nanosleep(CLOCK, 0, &req, NULL);
    clock_gettime(CLOCK, &requestEnd);
    elapsed = ( requestEnd.tv_sec - requestStart.tv_sec ) / 1e-6
                 + ( requestEnd.tv_nsec - requestStart.tv_nsec ) / 1e3;

    printf("Elapsed: %lf us\n", elapsed);

}
Run Code Online (Sandbox Code Playgroud)

在我的2.6.32系统上,结果是

Elapsed: 5.308000 us
Elapsed: 69.142000 us
Run Code Online (Sandbox Code Playgroud)

我同意这很可能是因为nanosleep()要求内核重新安排进程.我怎么能避免这个?我希望保留CPU的所有权,并在一段精确的时间内闲置.

Yan*_*aud 8

如果您希望应用程序能够尽可能精确地"睡眠",请首先将您的应用程序置于实时状态

  • 为程序/线程使用实时调度程序类:SCHED_FIFO或SCHED_RR
  • 提升您的程序/线程优先级
  • 如果你要以低于内核要处理的最小数量"休眠",请手动忙碌

看看http://www.drdobbs.com/184402031

而另一个问题是:nanosleep高CPU使用率?

  • 凭借实时优先级,nanosleep可以按照我想要的方式工作.谢谢! (4认同)

Ano*_*on. 7

操作系统调度程序不会执行任何操作,例如"哦,将此线程从处理器中取出正好86个时钟周期然后重新启用".

你放弃了处理器,你放弃了处理器.操作系统会让你重新回到它的感觉.你可能需要等到其他任何正在运行的东西放弃处理器才能重新开始.

  • @bestsss:这绝对是一个多任务系统。也许您应该阅读阿波罗 11 号着陆的报道,其中一个软件组件(着陆雷达)无法跟上并满足其最后期限,但系统能够保持所有其他具有实时要求的组件顺利运行。 (2认同)