2
實際上我並不瞭解的其中一個概念是'kernel porocess'或內核線程。搜索在網絡,以及SOO類似的問題,我發現以下幾點:What is a Kernel thread?那裏得到的答案是:對「內核進程」的懷疑
內核線程僅在內核模式下運行的內核任務
據我所知進入'內核模式'的進程必須發出系統調用。所以我不明白這些線程如何在這種模式下始終運行。有人能幫助我理解這是如何工作的嗎?
實際上我並不瞭解的其中一個概念是'kernel porocess'或內核線程。搜索在網絡,以及SOO類似的問題,我發現以下幾點:What is a Kernel thread?那裏得到的答案是:對「內核進程」的懷疑
內核線程僅在內核模式下運行的內核任務
據我所知進入'內核模式'的進程必須發出系統調用。所以我不明白這些線程如何在這種模式下始終運行。有人能幫助我理解這是如何工作的嗎?
內核線程是隻能由另一個內核線程創建的線程(已經在「內核模式」中 - 也許某些驅動程序可能會產生它們來對它們進行一些清理或監視),所以沒有用戶線程開始(並用syscall切換上下文),這些線程在內核地址空間內啓動,所以它們不需要任何額外的內核模式。
創建的內核線程以普通優先級和調度程序的容量作爲用戶線程運行。從kthread_create_on_node
(http://lxr.free-electrons.com/source/kernel/kthread.c#L269):
310 task = create->result;
311 if (!IS_ERR(task)) {
312 static const struct sched_param param = { .sched_priority = 0 };
313 va_list args;
314
315 va_start(args, namefmt);
316 vsnprintf(task->comm, sizeof(task->comm), namefmt, args);
317 va_end(args);
318 /*
319 * root may have changed our (kthreadd's) priority or CPU mask.
320 * The kernel thread should not inherit these properties.
321 */
322 sched_setscheduler_nocheck(task, SCHED_NORMAL, ¶m);
323 set_cpus_allowed_ptr(task, cpu_all_mask);
324 }
好的,謝謝。這些被視爲正常的線程在時間表,優雅,優先等方面? ..或者因爲他們通常以更高的優先級運行? – redobot
我認爲他們在調度程序中的處理方式基本相同,但我仍需要確認。 –
查看我的編輯@redobot –