Linux核心之程序管理(學習筆記)

2021-07-04 15:24:19 字數 1696 閱讀 2353

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

程的實現方法有三種:1、使用者級執行緒;2、核心級執行緒;3、混合執行緒模型。linux核心中的程序和執行緒都用相同的資料結構task_struct表示;執行緒是特殊的程序,共享同一位址空間、共同合作。

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

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

4、程序的狀態

程序的轉移關係如下圖:

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

5、程序上下文

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

6、當前程序

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

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

union thread_union

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

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

static inline struct task_struct * get_current(void)

static inline struct thread_info * current_thread_info(void)

將當前指標%esp與數值~(thread_size-1) 按位與運算,並將結果給ti。ti 儲存的值恰好是核心態棧中的最低位位址,這裡正是程序描述中成員變數thread_info所在的位置,也即當前程序描述符的成員變數thread_info的位址。

linux後台程序管理學習小記

1.top 在執行命令 後面 代表放在後台 執行 2.top 在按下命令後ctrl z,代表放在後台 暫停 jobs l 選項 l 顯示工作的pid root tj dev jobs 1 stopped top root tj dev jobs l 1 18186 stopped signal to...

linux核心記憶體管理學習筆記

記憶體管理 實體地址出現在cpu外部位址匯流排上的定址物理記憶體的位址訊號 執行緒位址虛擬位址在32位cpu架構下4g位址空間中的位址 邏輯位址彙編中使用的位址 20位的虛擬位址如何存入16位的暫存器中呢 分段方式來實現 邏輯段的起始位址段位址必須是16的倍數,邏輯段的最大容量是64k 實體地址 段...

7 29程序管理學習日記

程序就是執行的程式,程式是二進位制檔案。但是程序並不僅僅是二進位制檔案,因為程序還包含了其他的資源,比如要占用記憶體,訊號,狀態核心資料等。父程序複製自己的位址空間 fork 建立乙個新的 子 程序結構。每個新程序分配乙個,唯一的程序 id pid 滿足跟蹤安全性之需。任何程序都可以建立子程序。所有...