• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    linux下nanosleep() & sleep()的区别

    用户程序中的睡眠:

        sleep()
        usleep()
        nanosleep()

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

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

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


    复制代码
    代码如下:

    #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 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

    上一篇:PHP time_nanosleep() 函数使用介绍
    下一篇:查看ubuntu系统资源占用命令大全
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    linux下nanosleep() & sleep()的区别 linux,下,nanosleep,amp,sleep,