在进行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
在进行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
On Linux, sleep() is implemented via nanosleep(2)....See the nanosleep(2) man page for a discussion of the clock used....即sleep函数是由操作系统的[nanosleep](http://www.man7.org/linux/man-pages/man2/nanosleep.2.html)函数实现的。...asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp) { struct
Linux下常用的时间类型有4个:time_t,struct timeb, struct timeval,struct timespec,clock_t, struct tm. (1) time_t是一个长整型...二、 延迟函数 主要的延迟函数有:sleep(), usleep(), nanosleep(), select(), pselect(). 1 unsigned int sleep(unsigned int...仅通过函数原型中时间参数类型,可以猜测sleep可以精确到秒级,usleep/select可以精确到微妙级,nanosleep和pselect可 以精确到纳秒级。...而实际实现中,linux上的nanosleep和alarm相同,都是基于内核时钟机制实现,受linux内核时钟实现的影响,并不能达到纳秒级的精 度,man nanosleep也可以看到这个说明,man里给出的精度是...:Linux/i386上是10 ms ,Linux/Alpha上是1ms
可以发现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
在《宋宝华:火焰图:全局视野的Linux性能剖析》一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析。...一个发生在usleep()调用的hrtimer_nanosleep -> do_nanosleep系统调用;一个发生在printf()的时候,进入sys_write系统调用后,tty_write的n_tty_write...这个时候,我们可以进一步查看Linux内核的代码 https://lxr.missinglinkelectronics.com/linux+v4.18/drivers/tty/n_tty.c#L2285...从图上也可以看到,off-cpu的2个主要原因一个是nanosleep,一个是write系统调用进入后n_tty_write里面要拿mutex。
这可以解释为,在Linux上,clock_gettime(CLOCK_REALTIME)和其他一些系统调用是通过高效的vDSO机制实现的。这意味着当它们被调用时,不会发生模式切换。...Nanosleep Nanosleep()系统调用耗时比较。 调用nanosleep()来睡眠0 ns或1 ns似乎也是一个非常便宜的系统调用,甚至是一个空操作。...顺便说一下,50微秒也是Linux上正常调度进程的默认定时器松弛值。定时器松弛机制将定时器的到期时间延长到松弛值,以便对多个定时器进行分组,因为这样可以减少唤醒,从而节省能量。...由于nanosleep()创建了一个定时器,它也会受到这个机制的影响。 因此,其他的nanosleep案例设置了一个最小的定时器松弛值为1ns,这就减少了运行时间,正如预期的那样。...然而,维基百科的链接文章中给出的定义被广泛使用并适用于Linux。
由于项目硬件方案是用英特尔的 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
/libthread_db.so.1". 0x00007f578fb7a9d0 in __GI___nanosleep (requested_time=requested_time@entry=0x7fffd2b41190.../sysdeps/unix/sysv/linux/nanosleep.c:28 28 ...../sysdeps/unix/sysv/linux/nanosleep.c: No such file or directory..../sysdeps/unix/sysv/linux/nanosleep.c:28 2 Thread 0x7f578fa95700 (LWP 17642) "test" __lll_lock_wait...在linux文档http://man7.org/linux/man-pages/man7/signal.7.html中,我们发现了有关signal的这段话 A process-directed signal
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.78%--sys_nanosleep...| | --2.35%--hrtimer_nanosleep...| | --2.17%--do_nanosleep...参考文档: http://www.brendangregg.com/perf.html https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ https...://www.ibm.com/developerworks/cn/linux/l-cn-perf2/
其实Linux内核很早就内置了一个强大的tracing工具:Ftrace,它几乎可以跟踪内核的所有函数,不仅可以用于调试和分析,还可以用于观察学习Linux内核的内部运行。...tracefs 文件系统 用户通过tracefs文件系统使用Ftrace,这很符合一切皆文件的Linux哲学。tracefs文件系统一般挂载在/sys/kernel/tracing目录。...: do_nanosleep <-hrtimer_nanosleep cron-568 [002] .... 45978.504262: __x64_sys_clock_nanosleep <...: do_nanosleep <-hrtimer_nanosleep sleep-9448 [001] .... 45978.885085: __x64_sys_clock_nanosleep <...在Linux的早期,内核维护者就一直想在内核中加入静态 tracepoints,尝试过各种策略。
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之前内核所采用的定时器的实现方式。
()-->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
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++网络库》
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++网络库》
bpftrace 是 Linux 高级追踪工具和语言。...github主页介绍如下: bpftrace 是一种基于 Linux 的eBPF高级跟踪语言,可用于最新的 Linux 内核 (4.x)。...bpftrace 使用 LLVM 作为后端将脚本编译为 BPF 字节码,并利用BCC与 Linux BPF 系统进行交互,以及现有的 Linux 跟踪功能:内核动态跟踪(kprobes)、用户级动态跟踪...官方建议linux内核版本为4.9或以上。...如bpftrace -l ‘*nanosleep’可以列出bpftrace支持的nanosleep函数相关的所有探针。
pthread_join(pid_hello , NULL); pthread_join(pid_world , NULL); return 0; } 线程创建提醒 在GNU/Linux...Loaded symbols for /lib64/libc.so.6 Reading symbols from /lib64/ld-linux-x86-64.so.2......Loaded symbols for /lib64/ld-linux-x86-64.so.2 warning: no loadable sections found in added symbol-file...system-supplied DSO at 0x7ffd145be000 0x00007fb9d69f7a20 in __nanosleep_nocancel () from /lib64/libc.so...= 0 参考 http://blog.csdn.net/lhl_blog/article/details/8888010 https://www.ibm.com/developerworks/cn/linux
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 详情见
各种linux命令,来搞个组合拳啊,查出泄漏的进程。......>) = 0 open("/dev/urandom", O_RDONLY) = 331 read(331, "\2203\263\244", 4) = 4 nanosleep...= 0 open("/dev/urandom", O_RDONLY) = 332 read(332, "\20S\367 ", 4) = 4 nanosleep...= 0 open("/dev/urandom", O_RDONLY) = 333 read(333, "bE\351\267", 4) = 4 nanosleep...又是怎么灵活运用各种linux命令工具的? 对于笔试面试而言,八股文刷题要搞,也要注重实战经验积累,不然一问就歇菜。在实际工作中,各种思路和工具,亦不可或缺。
领取专属 10元无门槛券
手把手带您无忧上云