2016-05-08 15 views
0

Ich habe folgende Test in g ++ kompiliert, die nanosleep zu lang, es 60 Mikrosekunden dauert bis zum Ende, ich erwartet, dass es nur weniger als 1 Mikrosekunde kosten:Nanosleep Schlaf 60 Mikrosekunden zu lange

int main() 
{ 
    gettimeofday(&startx, NULL); 
    struct timespec req={0}; 
    req.tv_sec=0; 
    req.tv_nsec=100 ; 
    nanosleep(&req,NULL) ; 
    gettimeofday(&endx, NULL); 
    printf("(%d)(%d)\n",startx.tv_sec,startx.tv_usec); 
    printf("(%d)(%d)\n",endx.tv_sec,endx.tv_usec); 
    return 0 ; 
} 

Meine Umgebung: uname -r showes:

3.10.0-123.el7.x86_64 

cat/boot/config-uname -r | grep HZ

Sollte ich etwas in HZ-Konfiguration tun, so dass Nanosleep genau das tun werde ich erwarten ?!

meine CPU Informationen:

Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    24 
On-line CPU(s) list: 0-23 
Thread(s) per core: 2 
Core(s) per socket: 6 
Socket(s):    2 
NUMA node(s):   2 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     63 
Model name:   Intel(R) Xeon(R) CPU E5-2643 v3 @ 3.40GHz 
Stepping:    2 
CPU MHz:    3600.015 
BogoMIPS:    6804.22 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    20480K 
NUMA node0 CPU(s):  0,2,4,6,8,10,12,14,16,18,20,22 
NUMA node1 CPU(s):  1,3,5,7,9,11,13,15,17,19,21,23 

Edit:

#ifdef SYS_gettid 
    pid_t tid = syscall(SYS_gettid); 
    printf("thread1...tid=(%d)\n",tid); 
#else 
    #error "SYS_gettid unavailable on this system" 
#endif 

dies werde ich bekommen tid des Fadens mit hoher Priorität mögen, dann tun chrt -v -r -p 99 tid zu erreichen Sie dieses Ziel, danke für Johan Boule freundliche Hilfe, große schätzen !!!

Edit2:

#ifdef SYS_gettid 
    const char *sched_policy[] = { 
    "SCHED_OTHER", 
    "SCHED_FIFO", 
    "SCHED_RR", 
    "SCHED_BATCH" 
    }; 
    struct sched_param sp = { 
     .sched_priority = 99 
    }; 
    pid_t tid = syscall(SYS_gettid); 
    printf("thread1...tid=(%d)\n",tid); 
    sched_setscheduler(tid, SCHED_RR, &sp); 
    printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(0)]); 
#else 
    #error "SYS_gettid unavailable on this system" 
#endif 

dies tut genau, was ich ohne Hilfe von chrt tun will

+0

g ++ ist ein C++ - Compiler, kein C-Compiler. – Olaf

+4

Was führt Sie zu der Annahme, dass es unter Linux einen 100ns-Timer gibt, oder dass der Overhead eines Systemaufrufs ihn nicht überwältigt? – bmargulies

+0

Dies ist von Entwurf, lesen Sie die Hinweise Abschnitt http://linux.die.net/man/2/nanosleep. Wenn Sie nur sehr kurze Zeit warten müssen, ist es die einzige Option, die CPU-Zyklen zu "brennen". – oleksii

Antwort

2

(Dies ist keine Antwort)

Für das, was wert ist, mit dem moderneren Funktionen führen zum gleichen Ergebnis:

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

int main() 
{ 
    struct timespec startx, endx; 
    clock_gettime(CLOCK_MONOTONIC, &startx); 
    struct timespec req={0}; 
    req.tv_sec=0; 
    req.tv_nsec=100 ; 
    clock_nanosleep(CLOCK_MONOTONIC, 0, &req, NULL); 
    clock_gettime(CLOCK_MONOTONIC, &endx); 
    printf("(%d)(%d)\n",startx.tv_sec,startx.tv_nsec); 
    printf("(%d)(%d)\n",endx.tv_sec,endx.tv_nsec); 
    return 0 ; 
} 

Ausgang:

(296441)(153832940) 
(296441)(153888488) 
+0

@ meine Box zeigt: (15715524) (919434367), (15715524) (919488098), immer noch etwa 55 Mikrosekunden, zu lang. irgendeine Idee, es weniger zu machen? – barfatchen

+1

Das Ausführen des Programms mit 'sudo chrt -v -r 99./A.out' macht es niedriger und fluktuiert mit einer Untergrenze von ungefähr 5 Mikrosekunden. 'chrt --deadline' könnte wahrscheinlich besser machen, wird aber leider nicht auf meinem System erkannt. –

+0

Vielleicht möchten Sie dies lesen: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html –