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

sleep()和nanosleep()都是使进程睡眠一段时间后被唤醒,但是二者的实现完全不同

 

用户程序中的睡眠:

    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 timen");
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 timen");
return 1;
}
tdif = MILLION * (tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec);
printf("nanosleep() time is %ld usn", 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

时间: 2024-09-14 22:24:43

linux下nanosleep() & sleep()的区别的相关文章

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

  阿里云服务器是国内目前 最好的一个云服务器了,不过价格方面也比较贵了,下面我们来给各位介绍在阿里云Linux下FTP服务器搭配配置了,大概方法 与linux下搭配ftp服务器区别不大,只是一些小细节了. 一.aliyun Linux(Redhat)安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:update_source.zip.这里需要注意的是,目前文件无法传输,所以想要运行 update_source.sh 只能用文本打开,复制粘贴到阿里云服务器系统运

linux-Windows和Linux下程序的区别

问题描述 Windows和Linux下程序的区别 Windows和Linux下程序的区别Windows和Linux下程序的区别Windows和Linux下程序的区别Windows和Linux下程序的区别 解决方案 Windows主要针对x86,而Linux就丰富多了.不同的平台首先CPU指令都不一样.假设都是x86的,那么首先可执行文件的装配形式就不一样,windows是pe,linux是lef然后使用的api也不同. 解决方案二: windows下的应用程序在运行时要.net framewor

Windows下与Linux下编写socket程序的区别

[Windows: 头文件的区别] #include<winsock.h>#include<winsock2.h> [Windows: 初始化的区别] WSADATA wsaData;WSAStartup(0x202,&wsaData); [Windows: 声明Socket]  SOCKET类型 [Windows: Socket关闭] closesocket() [Windows: Socket操作错误返回值]  SOCKET_ERROR [Windows: 设置sock

socket在windows下和linux下的区别

原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h  2)初始化 windows下需要用WSAStartup WSADATA wsaData;         err = WSAStartup(0x202,&wsaData); if ( err != 0 ) { return 0; } else if ( LOBYTE( wsaData.wVersio

linux下.a/.so/.la目标库区别

在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件的区别. 一.格式说明 linux下编译,常会遇到后缀为:.o .so .a .la .ko等格式文件,尽管linux并不以扩展名作为识别文件格式的唯一依据,但规范约定还是有的,如下: .o 是目标对象文件,相当于windows中的.obj文件 .a 为静态库,可以是一个或多个.o合在一起,用于静态

linux驱动-linux下写驱动控制gpio时的两种方法区别

问题描述 linux下写驱动控制gpio时的两种方法区别 linux下写驱动控制gpio时,见过两种方法: 用request_mem_region函数和ioremap等得到控制寄存器的地址,然后用iowrite32函数控制该gpio 用gpio_request 和 gpio_set_value函数来控制gpio引脚 请问:这两种方法有什么区别,分别适用什么场合? 解决方案 http://blog.csdn.net/mirkerson/article/details/8464290http://b

Linux下vi编辑器的命令模式和编辑模式有什么区别?

问题描述 Linux下vi编辑器的命令模式和编辑模式有什么区别? 解决方案 编辑模式下可以输入和删除文本,与 windows 的常规编辑器的行为一样.命令模式下,可以方便地进行文本操作(包括批量的文本操作).比如说,删除命令d.dw 可以删除从当前光标开始的一个单词, dd 可以删除当前光标所在的行.解决方案二:基础问题还是先去学习学习

docker和传统Linux下多用户多任务,有什么区别?

问题描述 A:docker和传统Linux下多用户多任务,有什么区别?该问题来自CSDNDocker技术交流群(303806405),由版主xinshubiao整理.更多0 解决方案 解决方案二:B:docker,取虚拟化所长,去虚拟化所短.C:主要是在互相隔离的情况下尽最大可能地节省系统资源吧(或者说共享公共资源).A:多用户多任务不是也好像是尽可能节省系统资源吗?C:可迁移性A:就这点区别么?该解答来自CSDNDocker技术交流群(303806405),由版主xinshubiao整理,由于

Linux集群和自动化维1.4.4 Linux下CPU使用率与机器负载的关系与区别

1.4.4 Linux下CPU使用率与机器负载的关系与区别  笔者的线上竞标业务机器,在业务最繁忙的一段周期内,发现Nginx单机并发活动的连接数超过了2.6万,机器负载(基本上不到4,Nagios监控系统并没有发送报警邮件和短信)和Nginx+Lua服务都是正常的,网卡流量并没有打满,但流量就是怎么也打不进去.经过深入观察,发现这段时期内每台机器的CPU利用率都已经很高了,基本都维持在99%-100%左右,这种情况应该是CPU资源耗尽了,导致不能再继续提供服务,所以这里有必要研究下CPU负载和