POSIX nanosleep 在 x86 Linux 上是如何实现的?

POSIX nanosleep 在 x86 Linux 上是如何实现的?

怎么nanosleep在 x86 Linux 上实现?

描述指出:

nanosleep()挂起调用线程的执行,直到至少*req经过指定的时间,或者传递触发调用线程中处理程序的调用或终止进程的信号。

假设我想睡n纳秒。

我最初的假设是执行被暂停HLT。这将暂停,直到下一个“外部中断”。因此,我需要安排一个中断。

  • 从现在开始如何安排n纳秒中断?
  • 我的处理器如何知道此时要中断——例如,它会检查每个周期吗?如果它检查每个周期,那么与简单地忙于等待循环相比,这如何减少资源密集程度?

答案1

在Linux中,nanosleep 依赖于高分辨率计时器。这主睡眠循环循环

  • 让当前任务进入睡眠状态
  • 启动计时器
  • 改期

只要没有挂起的信号并且计时器尚未到期(计时器到期时t->task变为NULL),则在必要时重新启动(当在计时器到期之前处理信号时)。

高分辨率定时器提供中断。使用诸如 之类的 CPU 指令不会暂停执行HLT,因为在任务调用nanosleep休眠时可能还有其他任务等待运行。

相关内容