linux內核線程分析

(1)kjournald,522 (kjournald Ext3文件系統的日誌管理,通常每個mount_的 Ext3分區會有一個 kjournald看管,各分區的日誌是獨立的)
 
(2)migration:管理多核心(包括HypterThreading衍生的那個不大管用的、大家都不願遷過去的核心)系統之中,線程在各核心的遷移這種內核線程共有32個,從migration/0到migration/31,每個處理器覈對應一個migration內核線程,主要作用是作爲相應CPU核的遷移進程,用來執行進程遷移操作,內核中的函數是migration_thread()。屬於2.6內核的負載平衡系統,該進程在系統啓動時自動加載(每個 cpu 一個),並將自己設爲 SCHED_FIFO 的實時進程,然後檢查 runqueue::migration_queue 中是否有請求等待處理,如果沒有,就在 TASK_INTERRUPTIBLE 中休眠,直至被喚醒後再次檢查。migration_queue僅在set_cpu_allowed() 中添加,當進程(比如通過 APM 關閉某 CPU 時)調用set_cpu_allowed()改變當前可用 cpu,從而使某進程不適於繼續在當前 cpu 上運行時,就會構造一個遷移請求數據結構 migration_req_t,將其植入進程所在 cpu 就緒隊列的migration_queue 中,然後喚醒該就緒隊列的遷移 daemon(記錄在runqueue::migration_thread 屬性中),將該進程遷移到合適的cpu上去在 目前的實現中,目的 cpu 的選擇和負載無關,而是"any_online_cpu(req->task->cpus_allowed)",也就是按 CPU 編號順序的第一個 allowed 的CPU。所以,和 load_balance() 與調度器、負載平衡策略密切相關不同,migration_thread() 應該說僅僅是一個 CPU 綁定以及 CPU 電源管理等功能的一個接口。這個線程是調度系統的重要組成部分,也不能被關閉
 
(3)ksoftirqd/0,3 (內核調度/管理第0個CPU軟中斷的守護進程。硬件中斷處理往往需要關中斷,而這個時間不能太長,否則會丟失新的中斷。所以中斷處理的很大一部分工作移出,轉給任勞任怨的ksoftirqd在中斷之外進行處理。比如一個網絡包,從網卡里面取出這個過程可能需要關中斷,但是TCP/IP協議處理就不必關中斷了。)
 
(4)watchdog:這種內核線程共有32個,從watchdog/0到watchdog/31, 每個處理器覈對應一個watchdog 內核線程,watchdog用於監視系統的運行,在系統出現故障時自動重新啓動系統,包括一個內核 watchdog module 和一個用戶空間的 watchdog 程序。在Linux 內核下, watchdog的基本工作原理是:當watchdog啓動後(即/dev/watchdog設備被打開後),如果在某一設定的時間間隔(1分鐘)內/dev/watchdog沒有被執行寫操作, 硬件watchdog電路或軟件定時器就會重新啓動系統,每次寫操作會導致重新設定定時器。/dev/watchdog是一個主設備號爲10, 從設備號130的字符設備節點。 Linux內核不僅爲各種不同類型的watchdog硬件電路提供了驅動,還提供了一個基於定時器的純軟件watchdog驅動。如果不需要這種故障處理機制,或者有相應的替代方案,可以在menuconfig的Device Drivers --->watchdog Timer Support處取消watchdog功能。
 
(5)events:這種內核線程共有32個,從events/0到events/31, 每個處理器覈對應一個 events 內核線程。用來處理內核事件很多軟硬件事件(比如斷電,文件變更)被轉換爲events,並分發給對相應事件感興趣的線程進行響應。用來處理內核事件的重要線程,不能被去掉
 
 
(6)kthread,7 (父內核線程)
 
(7)kpsmoused:這種內核線程只有一個,主要作用是支持ps/2接口的鼠標驅動
 
(8)aio這種內核線程共有32個,從aio/0到aio/31, 每個處理器覈對應一個 aio 內核線程, 代替用戶進程管理I/O,用以支持用戶態的AIO(異步I/O),不應該被關閉。
 
(9)kblockd:這種內核線程共有32個,從kblockd/0到kblockd/31, 每個處理器覈對應一個 kblockd 內核線程。用於管理系統的塊設備,它會週期地激活系統內的塊設備驅動。如果擁有塊設備,那麼這些線程就不能被去掉,要是想去掉,需要在.config中直接將CONFIG_BLOCK設成n,同時在menuconfig中取消Device Drivers --->Block devices
                                                                      
 
(10)kacpid,11 (內核電源管理)
 
(11)cqueue/0,175 (隊列數據結構)
 
(12)khubd,178 (內核的usb hub)
 
(13)khelper 這種內核線程只有一個,作用是指定用戶空間的程序路徑和環境變量,最終運行指定的user space的程序,屬於關鍵進程,不能關閉
 
(14)kseriod:這種內核線程只有一個,主要作用是管理Serio總線上的設備的各種事件,Serio是一種虛擬總線,是Serial I/O的輸寫,表示串行的輸入輸出設備。對應內核中的serio_thread函數,流程大致是這樣的:調用serio_get_event()從鏈表中取出struct serio_event元素,然後對這個元素的事件類型做不同的時候,處理完了之後,調用serio_remove_duplicate_events()在鏈表中刪除相同請求的event。例如:如果要註冊新的serio設備,它產生的事件類型是SERIO_REGISTER_PORT,然後流程會轉入serio_add_port()。使用Serio總線的主要是標準AT鍵盤、PS/2鼠標、串口鼠標、Sun鍵盤,以及一些遊戲手柄,不過由於I2C依賴於Serio,所以不關閉I2C就無法關閉Serio,menuconfig中Serial I/O的開關位於
 
(15)kthread:這種內核線程只有一個,它的作用是管理調度其它的內核線程。它在內核初始化的時候被創建,會循環運行一個叫做kthreadd的函數,該函數的作用是運行kthread_create_list全局鏈表中維護的kthread。可以調用kthread_create創建一個kthread,它會被加入到kthread_create_list鏈表中,同時kthread_create會weak up kthreadd_task。kthreadd在執行kthread會調用老的接口——kernel_thread運行一個名叫“kthread”的內核線程去運行創建 的kthread,被執行過的kthread會從kthread_create_list鏈表中刪除,並且kthreadd會不斷調用scheduler 讓出CPU。這個線程不能關閉。
 
(16)pdflush:這種內核線程共有兩個,線程名都是pdflush,主要作用是回寫內存中的髒頁,回收髒頁佔據的空間。它們屬於核心的內存管理線程,這個線程也不能被關閉
 
(17)kswapd0:這種內核線程只有一個,主要作用是用來回收內存。在kswapd中,有2個閥值,pages_hige和pages_low
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章