【发布时间】:2012-12-08 23:57:52
【问题描述】:
乍一看,我的问题可能看起来有点琐碎。请耐心等待并完整阅读。
我在我的 Linux 内核模块中发现了一个繁忙的循环。因此,其他进程(例如 sshd)在很长一段时间内(例如 20 秒)都没有获得 CPU 时间。这是可以理解的,因为我的机器只有一个 CPU,并且繁忙的循环没有机会安排其他进程。
只是为了进行实验,我在繁忙循环的每次迭代之后都添加了 schedule()。即使这会使 CPU 保持忙碌,它仍然应该让其他进程在我调用 schedule() 时运行。但是,这似乎并没有发生。我的用户级进程仍然长时间挂起(20 秒)。
在这种情况下,内核线程得到了nice值-5,用户级线程得到了nice值0。即使用户级线程的优先级较低,我认为20秒太长了,无法获得CPU。
有人能解释一下为什么会这样吗?
注意:我知道如何完全删除繁忙的循环。但是,我想在这里了解内核的行为。内核版本为 2.6.18,内核抢占已禁用。
【问题讨论】:
-
你在进入循环之前设置了状态
set_current_state(TASK_INTERRUPTIBLE);吗? -
没有。我没有那样做。我希望任务处于 TASK_RUNNING 状态,所以我不需要在外部唤醒它。希望调度程序稍后将其唤醒,因为它已经在运行 Q。
-
你的内核模块在哪里循环?它是在中断服务例程中还是在您创建的内核线程中?
-
它在内核线程中,而不是在中断上下文中。
-
对我来说,您似乎试图放弃 CPU 来执行其他任务,同时仍然持有自旋锁。无论如何,我认为你应该向我们展示你的循环结构(你在哪里持有锁,你在哪里释放它,调度调用在哪里等等)。你的问题对我来说很有趣,我也渴望看到答案!
标签: linux linux-kernel operating-system kernel kernel-module