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

Does the sleep() function cause a timer interrupt upon completion?

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

Does the sleep() function cause a timer interrupt upon completion?

也许吧。

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

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

b) OS 重新配置定时器以在必要时最快延迟到期时生成 IRQ(当取消最快延迟、创建更早延迟或最快延迟到期时) .这没有“精度与开销”的折衷,但有更多的开销用于重新配置定时器硬件。这通常称为“无滴答”(因为没有 regular/fixed 频率“滴答”)。

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

对于“tickless”(这对于现代系统来说可能更好),当“sleep()”大部分时间到期时(除非其他延迟在 same/similar 次).

Does this mean a program using sleep() once awoken will likely cause another program running on one of the CPUs (in a multi-processor) to be removed in favor of the recently awoken program?

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

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

b) 未阻塞任务的优先级和当前运行 task/s.

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

Linux 手册页注释:

Portability notes
On some systems, sleep() may be implemented using alarm(2) and SIGALRM (POSIX.1 permits this); mixing calls to alarm(2) and sleep() is a bad idea.