Linux核心之程序管理

2021-08-06 04:28:08 字數 1769 閱讀 1834

linux核心之程序管理

支援執行緒的計算機系統裡面,程序作為資源分配的基本單位而存在,執行緒作為排程的基本單位而存在.執行緒僅擁有必不可少的一些資源,如:一組暫存器,堆疊資訊等等和其他執行緒共享同乙個程序的所有資源.所以,在同乙個程序的執行緒切換時不需要大量的儲存和恢復工作,同時由於共享同乙個儲存空間,不需要更新快表tlb,提高了系統效能.

執行緒是特殊的程序,共享同一位址空間,共同合作.程序與程序描述符是一一對應的關係.用資料結構task_struct來表示,(定義在 /linux/sched.h 中),它包含了程序的詳細資訊,主要有程序識別符號pid,程序占用的記憶體區域,相關檔案的檔案描述符,程序環境,訊號處理,同步處理等.

程序識別符號pid.posix標準中規定乙個多執行緒應用程式中的所有執行緒都必須有相同的pid,在linux核心引入執行緒機制時,採用了執行緒組機制,同一執行緒組中的執行緒有相同的執行緒組號(thread group id),tgid.執行緒組組號放在程序描述符的成員變數tgid中.

程序狀態的轉移關係如下圖:

深度睡眠和淺度睡眠程序得到它需要的資源被喚醒,通過schedule()進入執行態,深度睡眠的程序不能被訊號或者定時中斷喚醒,只有它申請的資源又有效是才能被喚醒.

在程序切換時,需要儲存當前執行程序的執行狀態,這些狀態資訊就是程序上下文.核心設計了乙個更小巧的資料結構struct thread_struct 來儲存核心使用的相關任務狀態段內容,他們在程序描述符的成員變數thread中.

linux2.2核心開始採用巨集定義current來獲取當前程序的描述符.

核心首先將當前程序的位址及需要快速訪問的其他狀態標記記錄在資料結構struct thread_info中,然後將該資料結構儲存到核心態棧棧空間中的最低位址位置.該資料結構在核心態的位置有資料結構union thread_union決定,定義如下:

union thread_union
這裡,核心態棧stack與資料結構thread_info共享同一塊記憶體.由於核心態棧由高位址向地位址方向增長,且核心態棧佔的空間比資料結構thread_info大得多,所以有效的防止他們互相覆蓋和衝突.

根據核心的配置,thread_size既可以是4k位元組(1個頁面)也可以是8k位元組(2個頁面),thread_info是52個位元組長.

下圖是當設為8kb時候的核心堆疊:thread_info在這個記憶體區的開始處,核心堆疊從末端向下增長.程序描述符不是在這個記憶體區中,而分別通過task與thread_info指標使thread_info與程序描述符互聯.所以獲得當前程序描述符的current定義如下:

巨集定義current通過下面的函式獲取

static inline struct task_struct * get_current(void

)static inline struct thread_info * current_thread_info(void

)

根據thread_size大小,分別遮蔽掉核心棧的12-bit lsb(4k)或13-bit lsb(8k),從而獲得核心棧的起始位置.將當前指標%esp與數值~(thread_size-1) 按位與運算,並將結果給ti.ti 儲存的值恰好是核心態棧中的最低位位址,這裡正是程序描述中成員變數thread_info所在的位置,也即當前程序描述符的成員變數thread_info的位址.本文**:

Linux核心程序管理之程序ID

乙個程序實體對應乙個task struct結構體,關於這個結構體後續的文章會有介紹,這裡我們只需要知道通過該結構體我們可以獲得該程序使用的所有資源資訊。程序id顧名思義就是程序的id,乙個程序有四種型別的id,分別是 乙個程序可能包含多個執行緒,組成乙個執行緒組,執行緒組內所有的執行緒的tgid都等...

Linux核心 程序管理

注 對linux系統來說,執行緒只是一種特殊的程序,linux不區分執行緒和程序 程序 處於執行期的程式 包含的資源 一 程序描述符及任務結構 程序存放在任務佇列 task list 的雙向迴圈鍊錶中 鍊錶中每一項型別均為task struct 程序描述符,也可表示為task t 該結構定義在inc...

Linux核心 程序管理

1 程序生命週期 某個程序通過系統呼叫fork,建立乙個用於執行程式的程序。生成此程序的程序稱為父程序,被生成的程序稱為子程序。子程序通過複製父程序的資料得以建立 父程序執行系統呼叫wait,等待子程序結束 子程序通過系統呼叫exec將程式讀取到記憶體並開始執行 當程式執行完畢後,子程序通過系統呼叫...