我已經在內核模塊中使用kthread_run創建了一個內核線程。 線程非常簡單,就像波紋管一樣。爲什麼Linux內核線程會佔用cpu
static int my_thread_func(void * data)
{
int a;
DBG_PRINT("policy:%lu; prio:%d", current->policy, current->prio);
while (!kthread_should_stop())
{
a++;
}
}
但是,在我加載模塊後,系統沒有再響應。
所以我想知道這個內核線程的調度策略和優先級是什麼。 然後我試着打印出這個內核線程的調度策略和優先級, 並得到了波紋管輸出。
policy:0; prio: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,所以一旦內核線程耗盡了它的時間片,其他任務就有機會運行。 – sunmingbao
只有當你正在對內核進行控制時,你不是。 –