What is the precision of usleep ?
Hello,
I am using usleep in an application under RH7 kernel 2.4.2. However, when I bring its argument down to 20 miliseconds (20.000 microseconds) or less, this seems to be ignored by the function (or the machine's hw timer), which behaves as if 20 ms where its lowest acceptable value. How can I measure the precision of usleep in my box ? I am currently using an Dell GX110 PIII 866 MHz.
Thanks in advance.
Marcus.
Quoted 10 lines · Marcus Ramos
Hello,
I am using usleep in an application under RH7 kernel 2.4.2. However, when I bring its argument down to 20 miliseconds (20.000 microseconds) or less, this seems to be ignored by the function (or the machine's hw timer), which behaves as if 20 ms where its lowest acceptable value. How can I measure the precision of usleep in my box ? I am currently using an Dell GX110 PIII 866 MHz.
Quoted 2 lines
Thanks in advance.
Marcus.
Well, first, your issue is resolution, not precision. Current resolution on most all timers is 1/HZ. So this should get a min. nanosleep of 10 ms.
So, could someone explain this line from sys_nanosleep() ( kernel/timer.c):
expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
It seems to me this should just be:
expire = timespec_to_jiffies(&t)
timespec_to_jiffies(&t) seems to do all the needed resolution round up and such. Since || is logical, this seems to always add 1, except if the requested value is 0. The net result is you always get 1 extra jiffie (unless you ask for zero, in which case you get a timer that will expire next tick (thru the wonders of add_timer).
George
Quoted 19 lines · george anzinger
Quoted 10 lines · Marcus Ramos
Hello,
I am using usleep in an application under RH7 kernel 2.4.2. However, when I bring its argument down to 20 miliseconds (20.000 microseconds) or less, this seems to be ignored by the function (or the machine's hw timer), which behaves as if 20 ms where its lowest acceptable value. How can I measure the precision of usleep in my box ? I am currently using an Dell GX110 PIII 866 MHz.
Quoted 2 lines
Thanks in advance.
Marcus.Well, first, your issue is resolution, not precision. Current resolution on most all timers is 1/HZ. So this should get a min. nanosleep of 10 ms.
Quoted 9 lines
So, could someone explain this line from
sys_nanosleep()(kernel/timer.c):expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);It seems to me this should just be:
expire =
timespec_to_jiffies(&t)
Oh darn! Must NOT do posts at 4AM!
The standard says nanosleep MUST wait at LEAST the requested time. Since we are dealing with a 1/HZ time resolution (tick) the actual time waited MUST fall between 10 and 20 ms. Depending on if your code is synced to the system clock or not you may see times closer to one end of this range. If you are not synced to the clock the average wait should be about 15 ms. (Note, locking to the clock in some way is relatively hard to get away from. After all this is the same clock that is used for time slicing.)
George