【发布时间】: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