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
g ++ ist ein C++ - Compiler, kein C-Compiler. – Olaf
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
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