【问题标题】:Linux userspace and kernel space schedulingLinux用户空间和内核空间调度
【发布时间】:2017-09-25 07:10:34
【问题描述】:

我有一个使用调度策略 SCHED_OTHER (0) 和优先级 120(默认优先级,顶部显示 PR 为 20)运行的用户空间进程。它运行一个无限的 while(1) 循环,没有任何系统调用或等待等。它与特定的 CPU 绑定,比如 1。

在内核空间中,我有一个内核线程,它也是使用默认调度参数(策略:SCHED_NORMAL (0) 和优先级 120)创建的。它调用 wait_event_interruptible() 进入睡眠状态。以 1ms 为周期发生的 irq 线程唤醒内核线程。内核线程未绑定到任何 CPU。

如果内核线程被调度在与用户空间进程相同的 CPU 上,即使唤醒调用完成,它也不会被唤醒。如果内核线程被调度在其他空闲的 CPU 上,它会被唤醒。只有当内核定时器中断发生并且 ksoftirq 线程被调度并且在退出时调度内核线程。因此,内核线程不会像预期的那样在 1ms 内唤醒一次。

我希望内核线程通过抢占用户空间进程来唤醒。那没有发生。有人可以帮我解决这里发生的事情吗?

顺便说一句,如果我将内核线程的调度更改为 SCHED_FIFO 并赋予 RT 优先级,它工作正常。

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    我希望内核线程通过抢占用户空间进程来唤醒。有人可以帮我解决这里发生的事情吗?

    首先,SCHED_OTHERSCHED_NORMAL 的别名。其次,调度程序不区分内核线程和用户空间线程(除非涉及通过 CGroups 进行分层调度)。

    允许休眠线程抢占 CPU 绑定线程的唯一机会是,如果它在 CPU 上花费的时间较短(通过 vruntime 跟踪),但 1 毫秒似乎太小了,无法使这种效果显着,即在 CFS 中计算时间片的基础是 6 毫秒 (sysctl_sched_latency)。

    您可以尝试使用 cfstrace.stp 脚本(需要 SystemTap)来跟踪调度程序状态并尝试了解发生这种情况的原因(它会转储 CFS 的内部状态,包括 vruntime 值)。

    我将内核线程的调度更改为 SCHED_FIFO 并赋予 RT 优先级,它工作正常。

    是的,如果需要“实时”,则需要使用SCHED_FIFOSCHED_DEADLINE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2011-03-02
      • 2018-03-28
      • 2011-09-25
      相关资源
      最近更新 更多