Sleep () and Nanosleep () are awakened after a process sleeps for a period of time, but the two implementations are completely different
Sleep in user programs:
Sleep ()
Usleep ()
Nanosleep ()
Sleep () and Nanosleep () are awakened after a process sleeps for a period of time, but the two implementations are completely different.
The system call sleep () is not provided in Linux, which is implemented in the library function by calling alarm () to set the alarm time, calling Sigsuspend () to suspend the process on the signal sigalarm, and sleep () can only be accurate to the second level.
Nanosleep () is a system call in Linux, which is implemented using a timer, which causes the calling process to sleep and adds a timer_list timer to the timer queue, which includes the wake time and the functions that are executed after the wake up, time_list structure. The execution function of the timer added by Nanosleep () only completes the function of waking the current process. System through a certain mechanism to check these queues periodically (for example, through system calls into the core, before returning user state from the core, to check whether the current process of the time slice has been exhausted, if it is called schedule () function rescheduling, the function will check the timer queue, This check is also done before the slow interrupt is returned, and the function that is specified by the timer executes the wake-up call process if the timed time is exceeded. Of course, because the system time slice may be lost, so the nanosleep () precision is not very high.
Alarm () is also implemented by a timer, but its precision is only accurate to the second level, in addition, it sets the timer execution function is to send the SIGALRM signal to the current process at a specified time.
Copy Code code as follows:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sched.h>
#define COUNT 1000
#define million 1000000l</p> <p>int main (void)
{
int i;
struct Timespec slptm;
long tdif;
struct timeval tend, tstart;</p> <p> slptm.tv_sec = 0;
slptm.tv_nsec = 1000; 1000 ns = 1 us</p> <p>//struct sched_param param;
//param.sched_priority = 0;
//sched_setscheduler (Getpid (), Sched_fifo, &param);</p> <p> if (Gettimeofday (&tstart, NULL) = =-1) {
fprintf (stderr, "Failed to get Start timen");
return 1;
}
for (i = 0; i < COUNT; i++) {
if (Nanosleep (&SLPTM, NULL) = = 1) {
perror ("Failed to Nanosleep");
return 1;
}
}
if (Gettimeofday (&tend, NULL) = = 1) {
fprintf (stderr, "Failed to get End Timen");
return 1;
}
TDIF = million * (tend.tv_sec-tstart.tv_sec) + (TEND.TV_USEC-TSTART.TV_USEC);
printf ("Nanosleep () time is%ld USN", Tdif/count);
return 0;
}
HZ 250HZ
Clock Interrupt Time interval: 4 ms (1000MS/250)
----------------------------------------
Nanosleep () is 4019 us (4.019 ms)
Indicates that the Nanosleep sleep timer relies on clock interrupts
hz 1000HZ
time interval for clock interrupts: 1 Ms
----------------------------------------
Nanosleep () is a US
Note: Minimum sleep time of 1 US