网站建设资讯

NEWS

网站建设资讯

linux中nanosleep()和sleep()有什么区别

linux中nanosleep() 和 sleep()有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在田阳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都做网站 网站设计制作按需开发,公司网站建设,企业网站建设,品牌网站设计,成都营销网站建设,外贸营销网站建设,田阳网站建设费用合理。

什么是Linux系统

Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。

用户程序中的睡眠:

    sleep()
    usleep()
    nanosleep()

sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同。
Linux中并没有提供系统调用sleep(),sleep()是在库函数中实现的,它是通过调用alarm()来设定报警时间,调用sigsuspend()将进程挂起在信号SIGALARM上,sleep()只能精确到秒级上。

    nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。

alarm()也是通过定时器实现的,但是其精度只精确到秒级,另外,它设置的定时器执行函数是在指定时间向当前进程发送SIGALRM信号。

代码如下:


#include
#include
#include
#include
#include
#define COUNT 1000
#define MILLION 1000000L

int main(void)
{
   int i;
   struct timespec slptm;
   long   tdif;
   struct timeval tend, tstart;

   slptm.tv_sec = 0;
   slptm.tv_nsec = 1000;      //1000 ns = 1 us

   //struct sched_param param;    
   //param.sched_priority = 0;
   //sched_setscheduler(getpid(), SCHED_FIFO, ¶m);

   if (gettimeofday(&tstart, NULL) == -1) {
       fprintf(stderr, "Failed to get start time\n");
       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 time\n");
       return 1;
   }
   tdif = MILLION * (tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec);
   printf("nanosleep() time is %ld us\n", tdif/COUNT);
   return 0;
}

HZ                                 250HZ
时钟中断的时间间隔:                   4 ms   (1000ms/250)
----------------------------------------
nanosleep() time is 4019 us        (4.019 ms)
说明nanosleep的睡眠定时器依赖于时钟中断

HZ                                 1000HZ
时钟中断的时间间隔:                   1 ms
----------------------------------------
nanosleep() time is 12 us
注: 最小睡眠时间为1 us

关于linux中nanosleep() 和 sleep()有什么区别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。


网站栏目:linux中nanosleep()和sleep()有什么区别
网址分享:http://cdweb.net/article/gohshc.html