sleep()、nanosleep()系列函数执行结束是否会触发定时器中断?
睡眠函数
sleep()/nanosleep()的唤醒触发与抢占逻辑解答 休眠结束是否会触发定时器中断?
会,但不会专门为单个睡眠进程生成专属的定时器中断。
主流操作系统的定时器是全局共享的硬件资源:当你调用睡眠函数时,内核只会把你进程的唤醒时间添加到系统的定时事件队列中,硬件定时器只会被设置为队列中最早到期的时间点,到点后触发的是全局定时器中断,所有到期的定时事件(包括多个进程的睡眠唤醒、内核定时任务等)都会在这次中断处理中批量处理。
操作系统如何精准识别休眠结束的时机?
内核有一套成熟的定时事件管理机制保证精度:
- 调用
sleep()/nanosleep()时,内核会先将当前进程标记为休眠状态,再把包含进程ID、唤醒时间戳的定时节点插入到系统的定时队列中(Linux下低精度事件用时间轮管理,高精度事件用红黑树结构的高精度定时器HRtimer管理)。 - 每次定时器中断触发后,内核会遍历定时队列,取出所有唤醒时间小于等于当前时间的节点,把对应的休眠进程全部移动到CPU的运行队列中。
- 针对
nanosleep()这类要求高精度的调用,内核会直接启用高精度定时器模式,到期触发的中断响应延迟可以控制在微秒级,几乎不会出现时间偏差。
被唤醒的进程是否会抢占多处理器系统中其他CPU上正在运行的程序?
不一定,是否抢占完全由调度器的策略决定:
- 定时器中断本身确实会优先打断当前CPU上运行的普通进程,但中断处理阶段只会完成「把休眠进程加回运行队列」的操作,不会直接执行进程切换。
- 只有当被唤醒的进程优先级,高于某一个CPU上当前正在运行的进程优先级时,调度器才会向对应CPU发送处理器间中断(IPI),触发该CPU的调度流程,抢占低优先级进程的运行资源。
- 如果系统存在空闲CPU,或者被唤醒的进程优先级不高于当前所有正在运行的进程,就不会触发抢占:要么直接放到空闲CPU运行,要么等待运行队列中现有进程调度点出现后再依次执行。
- 对于普通优先级的CFS调度进程,就算被唤醒,也不会强行抢占同优先级的正在运行的进程,只会等当前进程的时间片耗尽或者主动让出CPU时再参与调度。
内容的提问来源于stack exchange,提问作者ballsmahoney
相关产品推荐
相关产品推荐

