小知识: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

#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
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:PHP time_nanosleep() 函数使用介绍

2023-6-6 3:20:35

建站知识

小知识:LINUX vim替换字符串指令

2023-6-6 3:37:02

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索