千家信息网

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

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,linux中nanosleep() 和 sleep()有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是Linux系统L
千家信息网最后更新 2025年12月02日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()有什么区别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

时间 定时器 系统 函数 进程 睡眠 检查 时钟 用户 问题 队列 精确 操作系统 信号 是在 更多 核心 程序 精度 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 阿里云服务器买哪个 电信网络安全部门要会哪些 关于网络安全周的特色活动 怎么让数据库表增加一行 物流方面软件开发 访谈 db2查看服务器资源情况 克服选择恐惧症的软件开发 手机版网易mc生存服务器推荐 siemens网络安全模块功能 华为 服务器远程管理 雕塑设计软件开发 软件开发模式调试模式生产模式 数据库立即执行定时清除任务 云服务器隐私安全吗 什么条件可以学软件开发 香港同城生鲜配送软件开发 应用软件如何访问数据库 网络安全技术成熟度曲线报告 软件开发项目监理初验 果果喵服务器 江西信息软件开发销售价格 软件开发定律实例 我的世界服务器不能连接红叉 服务器如何挂盘 信息网络安全管理风险措施 浪潮服务器带外管理口配置 观网络安全视频观后感 scum换服务器之后旧的服务器 qt线程影响串口读取数据库 网络服务器注册表在哪里
0