nanosleep之间的差异()()()的Linux下的睡眠
在用户程序中休眠:
睡眠()
Usleep()
Nanosleep()
睡眠()和()nanosleep都唤醒了一段时间的睡眠后,但两者的实现是完全不同的。
Linux没有提供系统调用),睡眠(睡眠()在库函数实现的,它要求报警()来设置报警时间,呼叫sigsuspend()挂过程对信号sigalarm,睡眠()只能精确到秒级。
(nanosleep)是linux的系统调用,这是使用定时器来实现,调用调用进程睡眠,并添加一个定时器队列式timer_list定时器,time_list结构和功能执行包括觉醒后的苏醒时间,通过nanosleep()函数执行加入定时器就醒了当前进程的功能。定期检查排队系统通过一定的机制(时间片检查当前进程通过系统调用等为核心,从核心到用户返回的状态,已经是筋疲力尽,如果是电话安排()函数来调度,该函数将检查定时器队列,另一个缓慢的中断会这个检查返回前),如果时间超过,执行规范指定定时器功能调用的过程。当然,这nanosleep()精度不是很高,可能的损失的系统时间片。
闹钟()也可以通过定时器实现,但其准确度只有秒级。此外,其定时执行功能是发送SIGALRM信号当前进程在指定的时间。
复制代码代码如下所示:
#包括
#包括
#包括
#包括
#包括
#define COUNT 1000
#定义万1000000l
主(空)
{
int i;
结构timespec slptm;
长TDIF;
结构的当前趋势,堵;
slptm.tv_sec = 0;
slptm.tv_nsec = 1000; / / 1000 ns = 1美元
/ /结构sched_param参数;
/ / param.sched_priority = 0;
/ / sched_setscheduler(getpid(),sched_fifo,参数);
如果(gettimeofday(TSTART,null)= = 1){
Fprintf(stderr,未能获得启动时间;
返回1;
}
对于(i = 0;i <计数;i + +){
如果(nanosleep(slptm,null)= = 1){
perror(没有nanosleep );
返回1;
}
}
如果(gettimeofday(倾向、空)= = 1){
Fprintf(stderr,没有结束时间;
返回1;
}
TDIF =万*(tend.tv_sec -堵。tv_sec)+(tend.tv_usec -堵。tv_usec);
printf(nanosleep()时间是%ld美国
返回0;
}
赫兹250hz
时钟中断时间间隔:4毫秒(1000ms / 250)
----------------------------------------
Nanosleep()的时间是4019美元(4.019毫秒)
这表明,nanosleep睡眠定时器取决于时钟中断
赫兹1000hz
时钟中断时间间隔:1毫秒。
----------------------------------------
Nanosleep()的时间是12美元
注:最低睡眠时间为1美元。