sleep() 函数完成后是不是会导致定时器中断?

Posted

技术标签:

【中文标题】sleep() 函数完成后是不是会导致定时器中断?【英文标题】:Does the sleep() function cause a timer interrupt upon completion?sleep() 函数完成后是否会导致定时器中断? 【发布时间】:2021-12-12 06:28:03 【问题描述】:

睡眠函数系列(sleep()、nanosleep())一旦完成(即完成睡眠)会导致定时器中断吗?如果没有,操作系统如何确切知道它们何时完成?如果是这样,我知道定时器具有高中断优先级。这是否意味着一旦唤醒使用 sleep() 的程序可能会导致在一个 CPU(在多处理器中)上运行的另一个程序被删除以支持最近唤醒的程序?

【问题讨论】:

这将完全是特定于实现的,但我会冒昧地说不,sleep() 不会导致计时器中断 - 那些像往常一样在后台发生而sleep() 函数可以做它的事情。事实上,很可能是这样的中断,直接或间接地导致所述调用返回。 【参考方案1】:

sleep() 函数在完成时会导致定时器中断吗?

也许吧。

为了跟踪时间延迟,有两种常见的实现方式:

a) 定时器 IRQ 以固定频率发生(例如,可能每 1 毫秒)。当 IRQ 发生时,操作系统会检查是否有任何时间延迟过期并处理它们。在这种情况下,精度和开销之间存在折衷(为了获得更好的精度,您需要增加“每秒 IRQ”,这会增加处理所有 IRQ 的开销)。

b) 操作系统重新配置计时器以在最短延迟应在必要时到期时生成 IRQ(当最快延迟被取消、创建更早延迟或最短延迟到期时)。这没有“精度与开销”的折衷,但重新配置计时器硬件的开销更大。这通常称为“tickless”(因为没有常规/固定频率的“tick”)。

请注意,现代 80x86 系统的每个 CPU 都有一个本地 APIC 计时器,支持“在 TSC 截止日期上的 IRQ”。对于“tickless”,这意味着您通常可以获得优于 1 纳秒的精度而无需太多锁(使用“per CPU”结构来跟踪时间延迟);并且重新配置定时器的成本非常小(因为定时器硬件直接内置在 CPU 本身中)。

对于“tickless”(这对于现代系统来说可能更好),当“sleep()”大部分时间到期时,您最终会得到一个计时器 IRQ(除非其他一些延迟在相同/相似的时间到期)。

这是否意味着一旦唤醒使用 sleep() 的程序可能会导致在一个 CPU(在多处理器中)上运行的另一个程序被删除以支持最近唤醒的程序?

最近解除阻塞的任务是否立即抢占取决于:

a) 调度程序设计。对于某些调度程序(例如幼稚的“循环”),它可能永远不会立即发生。

b) 未阻塞任务和当前运行任务的优先级。

c) 优化。任务切换需要开销,因此尽量减少任务切换的数量(例如,如果其他任务切换可能很快发生,则推迟/跳过任务切换)是可行的。还有涉及负载平衡、电源管理、缓存效率、内存(NUMA 等)和其他可能需要考虑的事情的复杂性。

【讨论】:

【参考方案2】:

Linux 手册页注释:

可移植性说明 在某些系统上,可以使用 alarm(2) 和 SIGALRM(POSIX.1 许可)来实现 sleep() 这);混合调用 alarm(2) 和 sleep() 是个坏主意。

【讨论】:

以上是关于sleep() 函数完成后是不是会导致定时器中断?的主要内容,如果未能解决你的问题,请参考以下文章

进入定时器中断函数后,定时器数据还在工作吗?

C语言中的interrupt是怎么回事

定时器的使用和原理浅析,alarm/sleep函数

为啥这无法进入中断

单片机中,有一个定时中断函数,在中断里有很长的循环程序,这里问题来了。

AVR单片机教程——定时器中断