首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux中的sleep、usleep、nanosleep、poll和select

在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?...有些是基于alarm实现的,所以不能和alarm同时使用 usleep libc库函数 微秒 - - POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep...替代usleep nanosleep 系统调用 纳秒 是 不确定 即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 clock_nanosleep 系统调用 纳秒 是 不确定 区别于nanosleep...是 是 即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 pselect 系统调用 纳秒 是 是 如被信号中断,则实际睡眠时长会小于参数指定的时长 C/C++常用封装: 1) 基于nanosleep...(&ts, &ts)) && (EINTR == errno)); } 2) 基于nanosleep的微秒级封装 #include void microsleep(uint32_t microseconds

4.9K40

Linux中的sleep、usleep、nanosleep、poll和select

在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?...有些是基于alarm实现的,所以不能和alarm同时使用 usleep libc库函数 微秒 - - POSIX.1-2001已将usleep标注为废弃,POSIX.1-2008已删除usleep,应当使用nanosleep...替代usleep nanosleep 系统调用 纳秒 是 不确定 即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 clock_nanosleep 系统调用 纳秒 是 不确定 区别于nanosleep...系统调用 微秒 是 是 即使被信号中断,也可实现实际睡眠时长不小于参数指定时长 pselect 系统调用 纳秒 是 是 如被信号中断,则实际睡眠时长会小于参数指定的时长 C/C++常用封装: 1) 基于nanosleep...ts = { milliseconds / 1000, (milliseconds % 1000) * 1000000 }; while ((-1 == nanosleep

7K20
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Linux内核之进程睡眠(下)

可以发现sleep主要调用clock_nanosleep系统调用来进行睡眠(也就是说用户态任务睡眠需要调用系统调用陷入内核)。...下面我们来研究下clock_nanosleep的实现(这里集中到睡眠的实现,先忽略掉定时器等诸多的技术细节): kernel/time/posix-timers.c SYSCALL_DEFINE4(clock_nanosleep...//设置超时时要唤醒的任务 ->do_nanosleep //睡眠操作 可以看到,睡眠函数最终调用到hrtimer_nanosleep,它调用了两个主要函数...:__hrtimer_init_sleeper和do_nanosleep,前者主要设置高精度定时器,后者就是真正的睡眠,主要来看下 do_nanosleep: kernel/time/hrtimer.c...来看下freezable_schedule: //include/linux/freezer.h freezable_schedule ->schedule() ->__schedule(false

1.8K20

计算机系统调用的成本到底有多高?

这可以解释为,在Linux上,clock_gettime(CLOCK_REALTIME)和其他一些系统调用是通过高效的vDSO机制实现的。这意味着当它们被调用时,不会发生模式切换。...Nanosleep Nanosleep()系统调用耗时比较。 调用nanosleep()来睡眠0 ns或1 ns似乎也是一个非常便宜的系统调用,甚至是一个空操作。...顺便说一下,50微秒也是Linux上正常调度进程的默认定时器松弛值。定时器松弛机制将定时器的到期时间延长到松弛值,以便对多个定时器进行分组,因为这样可以减少唤醒,从而节省能量。...由于nanosleep()创建了一个定时器,它也会受到这个机制的影响。 因此,其他的nanosleep案例设置了一个最小的定时器松弛值为1ns,这就减少了运行时间,正如预期的那样。...然而,维基百科的链接文章中给出的定义被广泛使用并适用于Linux

51430

x86 Linux 下实现 10us 误差的高精度延时 | 软件开发

由于项目硬件方案是用英特尔的 x86 处理器,熟悉 Linux 硬件的人都知道这个很难实现。...总结下来我大致进行了如下的尝试: 1、sleep方案的确定 尝试过 usleep、nanosleep、clock_nanosleep、cond_timedwait、select 等,最终确定用 clock_nanosleep...而用 clock_nanosleep 的好处就是一方面它可以选择时钟源,其次就是它支持绝对时间唤醒,这样我在每次 do_work 之前都设置一下 clock_nanosleep 下一次唤醒时的绝对时间,...那么 clock_nanosleep 实际执行的时间其实就会减去 do_work 的开销,相当于是闹钟的概念。...解决办法 1、永久修改 可以修改 Linux 的引导参数,修改 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX_DEFAULT 选项,改成下面的内容: intel_idle.max_cstate

59820

深入理解Linux内核之进程睡眠

1开场白 环境: 处理器架构:arm64 内核源码:linux-5.10.50 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 无论是任务处于用户态还是内核态,经常会因为等待某些事件而睡眠...这里给出被致命信号打断/唤醒的代码路径: include/linux/sched.h #define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE...//设置超时时要唤醒的任务 ->do_nanosleep //睡眠操作 可以看到,睡眠函数最终调用到hrtimer_nanosleep,它调用了两个主要函数...:__hrtimer_init_sleeper和do_nanosleep,前者主要设置高精度定时器,后者就是真正的睡眠,主要来看下 do_nanosleep: kernel/time/hrtimer.c...来看下freezable_schedule: //include/linux/freezer.h freezable_schedule ->schedule() ->__schedule(false

2.6K40

Linux内核时钟系统和定时器实现

Linux内核时钟系统和定时器实现 Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式: 系统启动后,会读取时钟源设备(RTC, HPET,PIT…),初始化当前系统时间; 内核会根据...所以说这之前,linux只能支持ms级别的时钟,随着时钟源硬件设备的精度提高和软件高精度计时的需求,有了高精度时钟的内核设计。...Linux 2.6.16 ,内核支持了高精度的时钟,内核采用新的定时器hrtimer,其实现逻辑和Linux 2.6.16 之前定时器逻辑区别: hrtimer采用红黑树进行高精度定时器的管理,而不是时间轮...: nanosleep()glibc的API是直接调用linux内核的nanosleep,内核的nanosleep采用了hrtimer进行实现。...基于此,就出现了多级时间轮,也就是linux2.6.16之前内核所采用的定时器的实现方式。

3.3K30

Usleep timerslack_ns background thread in android

()-->sys_nanosleep()--> hrtimer_nanosleep()--> do_nanosleep()-->hrtimer_start()--> enqueue_hrtimer()...,它能提供纳秒级的延时精度,该用户空间函数对应的内核实现是sys_nanosleep,它的工作交由高精度定时器系统的hrtimer_nanosleep函数实现,最终的大部分工作则由do_nanosleep...hrtimer_nanosleep函数首先在堆栈中创建一个高精度定时器,设置它的到期时间,然后通过do_nanosleep完成最终的延时工作,当前进程在挂起相应的延时时间后,退出do_nanosleep...不过do_nanosleep可能在没有达到所需延时数量时由于其它原因退出,如果出现这种情况,hrtimer_nanosleep的最后部分把剩余的延时时间记入进程的restart_block中,并返回ERESTART_RESTARTBLOCK...; restart->nanosleep.index= t.timer.base->index; restart->nanosleep.rmtp

1.8K20

muduo 4 网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。...(3)、有一个函数gettid()可以得到tid,但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。..., static_cast(getpid()));     pthread_mutex_lock(&mutex);     struct timespec ts = {2, 0};     nanosleep...    pthread_t tid;     pthread_create(&tid, NULL, doit, NULL);     struct timespec ts = {1, 0};     nanosleep...参考: muduo manual.pdf 《linux 多线程服务器编程:使用muduo c++网络库》

1.4K10

muduo网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id由线程库维护,其id空间是各个进程独立的(即不同进程中的线程可能有相同的id)。...Linux中的POSIX线程库实现的线程其实也是一个进程(LWP),只是该进程与主进程(启动线程的进程)共享一些资源而已,比如代码段,数据段等。...(3)、有一个函数gettid()可以得到tid,但glibc并没有实现该函数,只能通过Linux的系统调用syscall来获取。..., static_cast(getpid()));     pthread_mutex_lock(&mutex);     struct timespec ts = {2, 0};     nanosleep...参考: muduo manual.pdf 《linux 多线程服务器编程:使用muduo c++网络库》

1.2K00

Utility之定时

VxWorks里常用的定时/延时机制 taskDelay() sleep()/nanosleep() WatchDog Auxiliary Clock Timestamp taskDelay() 详情见...与taskDelay()的不同是 参数是时间 rmtp不为NULL时 – 用于存储sleep()/nanosleep()因为signal提前返回而剩余的时长 定时为0时(secs=0;rqtp->tv_sec...可以看到,sleep 1秒的话,结果是1秒加1个tick,这样就防止了taskDelay()的那个小于1个tick的误差 nanosleep()也是这样操作的: ?...当系统时钟每个tick是1毫秒时,nanosleep()1个纳秒的话,其实是:向上取整为1毫秒(基数是tick的1毫秒)再加1个tick(1毫秒),即2毫秒。...,但与taskDelay() / sleep() /nanosleep()的区别是:WatchDog定时后的操作是以中断形式执行的,不会受到其它高优先级任务的干扰 Auxiliary Clock 详情见

69150
领券