【发布时间】:2011-06-26 14:06:20
【问题描述】:
考虑以下代码:
#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);
}
在我的 2.6.32 系统上,结果是
Elapsed: 5.308000 us
Elapsed: 69.142000 us
我同意这很可能是因为 nanosleep() 要求内核重新安排进程。我怎样才能避免这种情况?我想保留 CPU 的所有权,并且只是闲置一段精确的时间。
【问题讨论】:
-
你有 linux 和 real-time 作为标签。为什么?它们是粉笔和奶酪。
-
@David:好像没有疯狂的人在 linux-rt 或类似的东西上工作……哦等等。
-
我很好奇:具体的上下文是什么?你需要这种准确度是为了什么?
-
@asdf:磁约束等离子体的实时反馈控制。
标签: c linux real-time glibc libc