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

(0)

相关推荐

  • 阿里云Linux下FTP服务器搭配配置

    阿里云服务器是国内目前 最好的一个云服务器了,不过价格方面也比较贵了,下面我们来给各位介绍在阿里云Linux下FTP服务器搭配配置了,大概方法 与linux下搭配ftp服务器区别不大,只是一些小细节了 ...

  • Linux下help、man、info命令区别详解

    --help.man.info三个指令均为Linux下的帮助指令格式,三个指令略有区别. 操作方法 01 help命令用于显示shell内部的帮助信息.help命令只能显示shell内部的命令帮助信息 ...

  • Linux下文件名.文件和mp3名字.pdf的乱码问题

    如果是刚刚从windows转到Linux下的,通常都会因为一些中文的问题而放弃,我就是这样装上,卸载搞过好几次,其实这种心态是永远都学不到东西的,真正的学者都具有一颗大无畏的精神,在他们的字典里是找不 ...

  • linux 中的MYSQL命令汇总 适合学习linux下配置mysql的朋友

    一、总结一下: 1.linux下启动mysql的命令: mysqladmin start /ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql ...

  • Linux下的用户管理总结(含禁止用户和IP登录的方法)

    在Linux中,用户的管理分为组和用户两种。这个Windows下也是这个样子,组是一类用户的统称。组和用户的关系是:多对多的关系。即用户可以存在于多个组中,组中也可以有多个用户。组的权限会被赋予组中的 ...

  • linux下find查找命令用法

    Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  • Linux下如何用GCC编译动态库

    本文主要解决以下几个问题 1 为什么要使用库? 2 库的分类 3 创建自己的库 或许大家对自己初学 Linux时的情形仍记忆尤新吧。如果没有一个能较好的解决依赖关系的包管理器,在Linux下安装软件将 ...

  • Linux下设置可使用netpas网络加速器的方法与步骤介绍

    对于在教育网内的同学来说,最大的痛苦就是教育网不能出国和访问公网速度 慢了(有钱买流量的不用看本文),所以通常有些需求的就必须购买像教育网 直通车之类的加速服务,当然还有另一种选择那就是花钱买专门的V ...

  • Linux下定义Windows常用数据类型

    将一个Windows程序移植到Linux上,发现两个操作系统对很多数据类型的命名方式区别很大,比如Windows下对于无符号数据类型一般用U+x的方式,像UINT、UCHAR、ULONG,而Linux ...