/* * setitimer の精度試験 * * Copyright (C) NAKAMURA Minoru */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #define rdtsc() \ ({uint64_t high, low; \ __asm__ volatile ("lfence\n rdtsc" : "=a" (low), "=d" (high) : : "memory"); \ ((high << 32) | low);}) #define CLOCK_REALTIME (0) enum { REPEAT = 10000, WORK_CPUID = 1, DURATION = 100 // micro second }; static void balast(); int main(int argc, char **argv) { int i; // 低優先度のダミー負荷プロセスを走らせる。 balast(); // setitimer を動かすプロセスを固定する。 cpu_set_t cset; CPU_ZERO(&cset); CPU_SET(WORK_CPUID, &cset); if (sched_setaffinity(0, sizeof(cset), &cset) < 0) { perror("sched_setaffinit"); exit(EXIT_FAILURE); } sigset_t sigmask; sigemptyset(&sigmask); sigaddset(&sigmask, SIGALRM); // setitimer の結果のシグナルは sigwaitinfo で吸い上げ // るので SIGALRM はブロックする。 sigprocmask(SIG_BLOCK, &sigmask, NULL) ; struct itimerval time; time.it_interval.tv_sec = 0; time.it_interval.tv_usec = 0; time.it_value.tv_sec = 0; time.it_value.tv_usec = DURATION; uint64_t account = 0; for (i=0 ; i