Skip to contentSkip to conversation

What is the precision of usleep ?

DISCUSSION Marcus Ramos 2 participants 3 messages Apr 20, 2001 – Apr 23, 2001

lore
Share & tools
lore
#0 lore raw

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.

#1 lore raw
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

#2 lore raw
In reply to Marcus Ramos
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