linux的核心程序 執行緒

2021-08-30 17:48:43 字數 4797 閱讀 1462

linux啟動後,核心自動執行如下執行緒(程序)核心其實是不區分程序和執行緒的。

idle程序:pid = 0。系統的啟動程序。啟動後負責程序的排程。

init程序:pid = 1。由idle程序建立,首先負責系統的啟動。負責啟動所有其他程序。啟動後變成守護程序,用於監視其他所有程序和使用者程序的啟動。所有使用者程序的父親程序或者父親程序。

kthreadd:pid = 2。這種核心執行緒只有乙個。它是由idle程序啟動的。它的作用是管理排程其它的核心執行緒。所有除了上述兩個外的核心程序的祖先程序或父程序。它在核心初始化的時候被建立,會迴圈執行乙個叫做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。這個執行緒不能關閉。

上面兩個程序的其啟動**如下

//start_kernel函式將在最後呼叫該函式

//呼叫完成後,核心就起來了

//該函式啟動了兩個核心執行緒kernel_init和kthreadd

static noinline void __ref rest_init

(void

)

**鏈結

int

kthreadd

(void

*unused)

spin_unlock

(&kthread_create_lock);}

return

0;

migration:每個處理器核對應乙個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 電源管理等功能的乙個介面。這個執行緒是排程系統的重要組成部分,也不能被關閉。

watchdog每個處理器核對應乙個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功能。

events每個處理器核對應乙個 events核心執行緒。用來處理核心事件很多軟硬體事件(比如斷電,檔案變更)被轉換為events,並分發給對相應事件感興趣的執行緒進行響應。用來處理核心事件的重要執行緒,不能被去掉

kblockd每個處理器核對應乙個 kblockd 核心執行緒。用於管理系統的塊裝置,它會週期地啟用系統內的塊裝置驅動。如果擁有塊裝置,那麼這些執行緒就不能被去掉,要是想去掉,需要在.config中直接將config_block設成n,同時在menuconfig中取消

device drivers —>

block devices

khelper這種核心執行緒只有乙個,主要作用是指定使用者空間的程式路徑和環境變數, 最終執行指定的user space的程式,屬於關鍵執行緒,不能關閉

pdflush這種核心執行緒共有兩個,執行緒名都是pdflush,主要作用是回寫記憶體中的髒頁,**髒頁佔據的空間。由於頁快取記憶體的快取作用,寫操作實際上會被延遲。當頁快取記憶體中的資料比後台儲存的資料更新時,那麼該資料就被稱做髒資料。在記憶體中累積起來的髒頁最終必須被寫回。在以下兩種情況發生時,髒頁被寫回:

1.當空閒記憶體低於乙個特定的閾值時,核心必須將髒頁寫回磁碟,以便釋放記憶體。

2.當髒頁在記憶體中駐留時間超過乙個特定的閾值時,核心必須將超時的髒頁寫回磁碟,以確保髒頁不會無限期地駐留在記憶體中。

對於第乙個目標,pdflush執行緒在系統中的空閒記憶體低於乙個特定的閾值時,將髒頁重新整理回磁碟。該後台回寫例程的目的在於在可用物理 記憶體過低時,釋放髒頁以重新獲得記憶體。特定的記憶體閾值可以通過dirty_background_ratiosysctl系統呼叫設定。當空閒記憶體比閾值:dirty_ background_ratio還低時,核心便會呼叫函式wakeup_bdflush()喚醒乙個pdflush執行緒,隨後pdflush執行緒進一步 呼叫函式background_writeout()開始將髒頁寫回磁碟。函式background_ writeout()需要乙個長整型引數,該引數指定試圖寫回的頁面數目。函式background_writeout()會連續地寫出資料,直到滿足以下兩個條件:

已經有指定的最小數目的頁被寫出到磁碟。

空閒記憶體數已經回公升,超過了閾值dirty_background_ratio。

上述條件確保了pdflush操作可以減輕系統中記憶體不足的壓力。回寫操作不會在達到這兩個條件前停止,除非pdflush寫回了所有的髒頁,沒有剩下的髒頁可再被寫回了。

對於第二個目標,pdflush後台例程會被週期性喚醒(和空閒記憶體是否過低無關),將那些在記憶體中駐留時間過長的髒頁寫出,確保記憶體中不會有長期存在的髒頁。如果系統發生崩潰,由於記憶體處於混亂之中,所以那些在記憶體中還沒來得及寫回磁碟 的髒頁就會丟失,所以週期性同步頁快取記憶體和磁碟非常重要。在系統啟動時,核心初始化乙個定時器,讓它週期地喚醒pdflush執行緒,隨後使其執行函式 wb_kupdate()。該函式將把所有駐留時間超過百分之dirty_expire_centisecs秒的髒頁寫回。然後定時器將再次被初始化為百 分之dirty_expire_ centisecs秒後喚醒pdflush執行緒。總而言之,pdflush執行緒週期地被喚醒並且把超過特定期限的髒頁寫回磁碟。

系統管理員可以在/proc/sys/vm中設定回寫相關的引數,也可以通過sysctl系統呼叫設定它們,cat /proc/sys/vm/dirty_background_ratio

屬於核心的記憶體管理執行緒,這個執行緒也不能被關閉

kswapd0這種核心執行緒只有乙個,主要作用是用來**記憶體。在kswapd中,有2個閥值,pages_hige和pages_low。當空閒記憶體頁的數量低於pages_low的時候,kswapd程序就會掃瞄記憶體並且每次釋放出32個 free pages,直到freepage的數量到達pages_high。具體**記憶體有如下原則:

1. 如果頁未經更改就將該頁放入空閒佇列;

2. 如果頁已經更改並且是可備份回檔案系統的,就理解將記憶體頁的內容寫回磁碟;

3. 如果頁已經更改但是沒有任何磁碟上的備份,就將其寫入swap分割槽。

同樣,屬於核心的記憶體管理執行緒,這個執行緒也不能被關閉

nfsiod這種核心執行緒只有乙個,主要作用是為nfs提供高效的緩衝機制,從而改善nfs檔案系統的效能,如果不需nfs,可以取消這一線程,取消這一線程的方法為menuconfig中取消

file systems —>

network file systems

rpciod每個處理器核對應乙個rpciod核心執行緒,主要作用是作為遠過程呼叫服務的守護程序,用於從客戶端啟動i/o服務,通常啟動nfs服務時要用到它,想要關閉它,需要在.config中把config_sunrpc, config_sunrpc_gss, config_sunrpc_xprt_rdma的值設成n

kpsmoused這種核心執行緒只有乙個,主要作用是支援ps/2介面的滑鼠驅動。如要沒有滑鼠,可以取消,取消方法是menuconfig中取消

devicedrivers —>

input device support

mice

linux核心 程序,輕量級程序,執行緒,執行緒組

本篇文章將介紹本人對以下問題的理解。1 程序 輕量級程序 執行緒 執行緒組之間的關係 2 及它們的標識相關說明 一 程序 輕量級程序 執行緒 執行緒組之間的關係 借助上圖說明 程序p0有四條執行流,即執行緒,主線程t0是它的第乙個執行緒,且與程序p0相關聯,之後衍生出t1 t2 t3三個執行緒,這三...

linux核心 程序棧執行緒棧

程序使用者空間的管理在task struct 的mm struct mm成員中體現,mm中的成員定義了使用者空間的布局情況如圖一。使用者空間的棧起始於stack top,如果設定了pf randomize,則起始點會減少乙個小的隨機量,每個體系結構都必須定義stack top,大多數都設定為task...

執行緒 程序 多執行緒核心概念

執行緒就是獨立的執行路徑 在程式執行時,即使沒有自己建立執行緒,後台也會有多個執行緒,如主線程,gc執行緒 main 稱之為主線程,為系統的入口,用於執行整個程式 在乙個程序中,如果開闢了多個執行緒,執行緒的執行由排程器安排排程,排程器是與作業系統緊密相關的,先後順序是不能人為的干預的。對同乙份資源...