【发布时间】:2015-01-13 13:35:38
【问题描述】:
我在内核模块中使用 kthread_run 创建了一个内核线程。 线程很简单,如下所示。
static int my_thread_func(void * data)
{
int a;
DBG_PRINT("policy:%lu; prio:%d", current->policy, current->prio);
while (!kthread_should_stop())
{
a++;
}
}
但是,我加载完模块后,系统就没有反应了。
所以我想知道这个内核线程的调度策略和优先级是什么。 然后我尝试打印出这个内核线程的调度策略和优先级, 并得到以下输出。
政策:0;优先:120
policy:0 表示 SCHED_NORMAL;
prio:120 这个也不高。
虽然线程没有 SCHED_FIFO 或 SCHED_RR 调度策略,为什么它会占用 cpu?
而且我还发现,如果我在线程的循环体中插入一些休眠代码,系统可以保持响应。
我还发现,当我运行如下实现的用户空间程序时,系统也保持响应。
int main(int argc, char *argv[])
{
int a;
while (1) a++;
return 0;
}
那么谁能告诉我,为什么内核线程会占用 CPU。
【问题讨论】:
-
你的内核线程永远不会产生控制(
wait_event_interruptible和朋友),所以它当然会阻止事件被处理。它也不处理信号。 -
但是内核线程的调度策略是SCHED_NORMAL,而不是SCHED_FIFO或SCHED_RR,所以一旦内核线程用完它的时间片,其他任务就有机会运行。
-
只有当你将控制权让给内核时,你才不会。
-
在我的理解中,内核线程应该被定时器中断所打断。而在定时器中断处理中,内核有机会检查线程的时间片,并调用schedule来选择另一个任务来运行。
标签: linux-kernel