linux管理程序的鍊錶

2021-08-30 02:16:38 字數 2233 閱讀 2890

linux2.6.11的核心中,為了方便管理linux的程序,主要建了5種linux鍊錶。每個鍊錶節點之間的互聯有兩種方式,一種是hash節點之間的互聯,通過hlist_node的資料結構來實現;另一種就是list_head型別的資料結構來互聯。看linux核心的人對這兩種型別的資料結構肯定是不會陌生的,因為它們在linux核心中無處不在。

1 程序直接的互連

通過任務描述符結構task_struct結構中的tasks成員來實現各個節點之間的互連,它是list_head型別。這個鍊錶是乙個迴圈的雙向鍊錶,開始的時候只有init_task這乙個程序,它是核心的第乙個程序,它的初始化是通過靜態分配記憶體,"手動"(其它的程序初始化都是通過動態分配記憶體初始化的)進行的,每新建乙個程序,就通過set_links巨集將該程序的task_struct結構加入到這條雙向鍊錶中,不過要注意的是如果乙個程序新建乙個執行緒(不包括主線程),也就是輕量級程序,它是不會加入該鍊錶的。通過巨集for_each_process可以從init_task開始遍歷所有的程序。

2 task_running狀態的程序鍊錶

為了能讓排程程式在固定的時間內選出」最佳「可執行的程序,與佇列中可執行的程序數無關,建立了多個可執行程序鍊錶,每個優先順序對應乙個,總共有140個。linux核心定義了乙個prio_array_t型別的結構體來管理這140個鍊錶。每個可執行的程序都在這140個鍊錶中的乙個,通過程序描述符結構中的run_list來實現,它也是乙個list_head型別。enqueue_task是把程序描述符插入到某個可執行鍊錶中,dequeue_task則從某個可執行鍊錶中刪除該程序描述符。task_running狀態的prio_array_t型別的結構體是runqueue結構的arrays[1]成員。

3 程序間的關係

linux程序間的關係有兩種,一種是父程序與子程序間的父子關係,一種是程序同屬乙個父程序的兄弟關係。linux中是通過程序描述符中的children和sibling來實現這種關係的,它們都是list_head型別的。children的next指向的是該程序最新的子程序,prev指向的是該該程序最老的子程序,sibling的next指向的是它父程序中比它更老的子程序,prev指向的是它父程序中比它更新的子程序。最新子程序的slibling.prev指向的是父程序,最老子程序的slibling.next也是指向父程序。這樣通過children和sibling實現了乙個迴圈的雙向鍊錶,該雙向鍊錶以父程序描述符為頭節點。

程序間親屬關係

4 pidhash鍊錶

為了通過pid找到程序的描述符,如果直接遍歷程序間互聯的鍊錶來查詢程序id為pid的程序描述符顯然是低效的,所以為了更為高效的查詢,linux核心使用了4個hash雜湊表來加快查詢,之所以使用4個雜湊表,是為了能根據不同的pid型別來查詢程序描述符,它們分別是程序的pid,執行緒組領頭程序的pid,程序組領頭程序的pid,會話領頭程序的pid。每個型別的雜湊表中是通過巨集pid_hashfn(x)來進行雜湊值的計算的。每個程序都可能同時處於這是個雜湊表中,所以在程序描述符中有乙個型別為pid結構的pids成員,通過它可以將程序加入雜湊表中,pid結構中包含解決雜湊衝突的pid_chain成員,它是hlist_node型別的,還有乙個是將相同pid鏈起來的pid_list,它是list_head型別。

pid雜湊表

5 等待佇列

linux把等待同乙個事件發生或資源的程序都鏈結在一起形成乙個帶頭節點的雙向鍊錶。等待佇列的頭是用型別wait_queue_head_t描述,裡面包含了list_head型別的task_list成員。等待佇列中節點的型別用wait_queue_t描述,該結構裡有task_struct型別的指標task和list_head型別的task_list成員。為什麼不像前面4個佇列中一樣,將list_head型別的task_list成員放到程序的描述符裡來形成鍊錶呢?原因是linux等待佇列太多了,每個事件,每個資源都可以形成乙個等待佇列,乙個程序還可以等待多個事件的發生,所以通過乙個單獨的型別來形成佇列是需要的。linux通過sleep_on函式來將某個程序加入到某個等待佇列中和從等待佇列中刪除。呼叫sleep_on的程序都會主動讓出cpu進入等待狀態,可以通過wake_up來喚醒某個等待狀態的程序。

出處:

linux管理程序的鍊錶

linux2.6.11的核心中,為了方便管理linux的程序,主要建了5種linux鍊錶。每個鍊錶節點之間的互聯有兩種方式,一種是hash節點之間的互聯,通過hlist node的資料結構來實現 另一種就是list head型別的資料結構來互聯。看linux核心的人對這兩種型別的資料結構肯定是不會陌...

Linux程序的管理

1.1 多工 多工作業系統就是能同時併發地互動執行郭哥程序的作業系統。在單處理機器上,這會產生多個程序在同時執行的錯覺。在多處理機上,著會使多個程序在不同機器上真正同時,並行地執行。無論在單處理機還是多處理器機器上,多工作業系統都能使多個程序處於堵塞或者睡眠的狀態,也就是說,實際上並沒有被真正的投入...

Linux程序的管理

程序可以理解為程式執行的乙個例項,它包括可執行程式以及與其相關的系統資源,比如開啟的檔案 掛起的訊號 核心內部資料 處理器狀態 記憶體位址空間及包含全域性變數的資料段等。從核心的角度看,程序也可以稱為任務。換句話就是說 程序是系統未完成的工作並且是正在進行的工作 gnomes system moni...