Linux內核線程的思考與總結


 

1、內核線程,只是一個稱呼,實際上就是一個進程,有自己獨立的TCB,參與內核調度,也參與內核搶占。

     這個進程的特別之處有兩點,第一、該進程沒有前台。第二、永遠在內核態中運行。

 

2、創建內核線程有兩種方法,一種是 kthread_create() ,一種是 kernel_thread() ,兩種有什么區別?使用場景分別是什么?

     http://www.cnblogs.com/sky-heaven/p/5395864.html

 

3、內核線程既然也是進程,那么新創建出來的內核線程,用戶是誰?所屬哪個組?

  

4、內核線程的父進程PPID,有的為0,有的為2,絕大部分是2,是什么含義?

  

  解答:仔細觀察得知,既然PPID是2,那么進程ID為2的內核線程是誰?從上圖可以看到,它是kthreadd線程,該線程啟動后,在這個線程的運行期間,

  會去啟動其他內核線程,代碼如下:

  文件:kthread.c (kernel) 

  內容:

    

  源碼解析:可以看出,kthread_create_list是需要創建內核線程的列表,一定有一個函數供其他模塊調用,往這個列表中增加內容。

  那么,kthreadd本身在哪里啟動的呢?見下面的rest_init函數實現。

   

 

    

5、既然每個內核線程都是一個進程,進程的地址空間是互相隔離的,為何說所有的內核線程共享同一個地址空間?

   同樣的問題,在Linux用戶態編程中,線程也是通過進程控制塊的方式管理的,他們如何實現共享地址空間的呢?

   (待補充)

6、kernel_thread()的關鍵是調用在內核中實現的 do_fork(),核心本質上還是一個進程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM