1. 程式人生 > >linux管理程序的連結串列

linux管理程序的連結串列

  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來喚醒某個等待狀態的程序。

出處:https://www.cnblogs.com/chengxuyuancc/p/3376627.html