在 Linux 内核开发中,选择正确的延迟函数至关重要,因为错误的函数可能导致系统性能下降、甚至引发系统崩溃。在 Linux 中,最关键的区分点在于是否可以“睡眠”。
在原子上下文中,是不允许休眠的。所以如果你在中断处理程序(ISR)、自旋锁(Spinlock)内部,必须使用忙等待(Busy-waiting)函数。这些函数通过消耗 CPU 循环来计时,不会让出 CPU。
[点击放大]
在进程上下文中,是允许休眠的。所以如果在普通的内核线程、驱动的 read/write 函数中,且没有持有锁,应优先使用睡眠延迟。这样 CPU 可以去执行其他任务。
[点击放大]
usleep_range(unsigned long min, unsigned long max)
[点击放大]