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

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

有些是基于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...) { struct timespec ts = { microseconds / 1000000, (microseconds % 1000000) * 1000 }; while ((-1 == nanosleep

5K40

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

有些是基于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...{ microseconds / 1000000, (microseconds % 1000000) * 1000 }; while ((-1 == nanosleep

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

    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.9K20

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

    首先我们通过strace工具来看下其调用的系统调用: $ strace sleep 1 ... close(3) = 0 clock_nanosleep...可以发现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

    2.1K20

    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 详情见

    71850

    DAY52:阅读scheduling

    本文备注/经验分享: 本章节主要涉及两点, 一个是新引入的nanosleep, 另外一个则是一个锁的优化版本的实现.从以前的章节中, 大家都知道, 只要NV开始引入的东西, 那么一般都会在后期发挥重要用途...但是没完, NV在括号里面引入了__nanosleep(), 很好的提高了该锁的性能(还记得刚才说的NV春天发布的推介么),这里实际上存在一个忙等和避让的概念....__nanosleep目前被编译为单独的一条指令(nanosleep指令, 同名) 从之前我们曾经说过的7.0+开始放宽SIMT的限制了(还记得我们之前说过SIMT带来的弊端和代价么?...,到今天__nanosleep的提供.从本质上来说, 7.0+的GPU越来越靠拢CPU的核心的执行风格了....(例如某种程度上不再绑定32个线程在一起, 而像CPU那样能自由执行) 所以今天引入了__nanosleep()来支援一些原本CPU上常用的算法也很正常了.

    49110

    linux时间相关结构体和函数整理

    clock_settime(clockid_t ,struct timespec*); 休眠time中指定的时间,如果遇到信号中断而提前返回,则由left_time返回剩余的时间: long clock_nanosleep...二、 延迟函数 主要的延迟函数有:sleep(), usleep(), nanosleep(), select(), pselect(). 1 unsigned int sleep(unsigned int...seconds); 2 void usleep(unsigned long usec); 3 int nanosleep(const struct timespec *req, struct timespec...仅通过函数原型中时间参数类型,可以猜测sleep可以精确到秒级,usleep/select可以精确到微妙级,nanosleep和pselect可 以精确到纳秒级。...而实际实现中,linux上的nanosleep和alarm相同,都是基于内核时钟机制实现,受linux内核时钟实现的影响,并不能达到纳秒级的精 度,man nanosleep也可以看到这个说明,man里给出的精度是

    2.9K50

    深入理解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...do_nanosleep -> do { set_current_state(TASK_INTERRUPTIBLE); //设置可中断的睡眠状态

    2.8K40

    故障分析 | innodb_thread_concurrency 导致数据库异常的问题分析

    三、堆栈与源码分析 综合收集的信息,对连接状态、线程状态和堆栈信息进行关联分析,发现被堵塞的 29 个连接中,有 13 个都被卡在函数 nanosleep 中,比较奇怪。...其堆栈关键信息如下: #0 in nanosleep from /lib64/libpthread.so.0 #1 in srv_conc_enter_innodb #2 in ha_innobase...更关键的,看到了 srv_conc_enter_innodb 函数,并由他调用了 nanosleep,执行了类似“睡眠” 的操作。为此,结合对应版本的源码进行分析。...调用 nanosleep 进行指定时间的 sleep e. 设置事务状态为 “” f....= 0、事务没有 ticket、进入 innodb 的事务大于 innodb_thread_concurrency , 执行逻辑: 根据堆栈信息,受影响的会话都被堵塞在 nanosleep 函数;同时

    31220

    故障分析 | innodb_thread_concurrency 导致数据库异常的问题分析

    三、堆栈与源码分析综合收集的信息,对连接状态、线程状态和堆栈信息进行关联分析,发现被堵塞的 29 个连接中,有 13 个都被卡在函数 nanosleep 中,比较奇怪。...其堆栈关键信息如下:#0 in nanosleep from /lib64/libpthread.so.0#1 in srv_conc_enter_innodb#2 in ha_innobase:...更关键的,看到了 srv_conc_enter_innodb 函数,并由他调用了 nanosleep,执行了类似“睡眠” 的操作。为此,结合对应版本的源码进行分析。...调用 nanosleep 进行指定时间的 sleep e. 设置事务状态为 “” f....= 0、事务没有 ticket、进入 innodb 的事务大于 innodb_thread_concurrency , 执行逻辑: 图片根据堆栈信息,收影响的会话都被堵塞在 nanosleep 函数;同时

    59520
    领券