怎么nanosleep
在 x86 Linux 上实现?
描述指出:
nanosleep()
挂起调用线程的执行,直到至少*req
经过指定的时间,或者传递触发调用线程中处理程序的调用或终止进程的信号。
假设我想睡n
纳秒。
我最初的假设是执行被暂停HLT
。这将暂停,直到下一个“外部中断”。因此,我需要安排一个中断。
- 从现在开始如何安排
n
纳秒中断? - 我的处理器如何知道此时要中断——例如,它会检查每个周期吗?如果它检查每个周期,那么与简单地忙于等待循环相比,这如何减少资源密集程度?
答案1
在Linux中,nanosleep
依赖于高分辨率计时器。这主睡眠循环循环
- 让当前任务进入睡眠状态
- 启动计时器
- 改期
只要没有挂起的信号并且计时器尚未到期(计时器到期时t->task
变为NULL
),则在必要时重新启动(当在计时器到期之前处理信号时)。
高分辨率定时器提供中断。使用诸如 之类的 CPU 指令不会暂停执行HLT
,因为在任务调用nanosleep
休眠时可能还有其他任务等待运行。