2017-09-25 89 views
3

我有一个用调度策略SCHED_OTHER(0)和优先级为120(默认优先级,顶部显示PR为20)的用户空间进程。它在没有任何系统调用或等待的情况下运行一个无限的while(1)循环。它与特定的CPU相关联,比如说:1.Linux用户空间和内核空间调度

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

在内核线程与用户空间进程在同一CPU上进行调度的情况下,虽然唤醒调用完成,但它不会唤醒。如果内核线程安排在其他免费的CPU上,它会被唤醒。只有当内核定时器中断发生并且ksoftirq线程被调度并且在退出时才调度内核线程。因此,内核线程不会按预期在1ms内唤醒一次。

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

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

回答

0

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

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

允许睡眠者线程抢占CPU绑定线程的唯一机会是,如果它在CPU上花费的时间更少(通过vruntime跟踪),但1ms似乎太小以至于不会使此效果显着计算CFS时间片的基础是6ms(sysctl_sched_latency)。

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

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

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

相关问题