程序管理(1)

2021-09-29 19:38:59 字數 1246 閱讀 9150

程序是處於執行期的程式,程序包括**段,資料段,還有pcb(程序控制塊)

執行緒實在程序中活動的物件,核心排程的物件是執行緒,而不是程序

注意:linux核心通常把程序叫做任務核心把程序的列表存放在任務佇列中(雙向迴圈鍊錶)

鍊錶中的每一項型別都是task_struct(稱為程序描述符),程序描述符包含乙個具體程序的所有資訊

分配程序描述符

看書說實話我還沒怎麼看懂

程序描述符的存放

核心是通過唯一的程序識別符號或pid來標識每個程序

pid是乙個數,標識位pid_t隱含型別,實際上就是乙個int型別(pid最大值預設為32768)

程序狀態

程序描述符中的state描述了程序的當前狀態

五種狀態我先略過了(第二遍再仔細看)

設定當前程序狀態

通過set_task_state(task,state)函式

程序上下文

程序只有通過系統呼叫和異常處理程式介面才能陷入核心執行

對核心的所有訪問必須通過這些介面

程序家族樹

在linux系統中,所有的程序都是pid為1的init程序的後代

核心在系統啟動的最後階段啟動init程序,該程序讀取系統的初始化指令碼並執行其他的相關程式,最終完成系統啟動的整個過程

系統的每個程序必定有乙個父程序,每個程序可以擁有零個或多個子程序

擁有同乙個父程序的所有程序被稱為兄弟

每個task_struct都包含乙個指向其父程序task_struct,叫做parent的指標

還包含乙個稱為children的子程序鍊錶

其他作業系統都提供產生程序的機制,首先在新的位址空間裡建立程序,讀入可執行檔案,最後開始執行

unix則採用了與眾不同的實現方式,將兩個步驟分解到兩個單獨的函式執行

fork() 函式通過拷貝當前程序建立乙個子程序

​ 子程序和父程序的區別

​ 1.pid

​ 2.ppid(父程序的程序號)

​ 3.某些資源和統計量

exec() 函式負責讀取可執行檔案並將其載入位址空間開始執行

寫時拷貝

傳統的fork()系統呼叫直接把所有的資源複製給新建立的程序

linux的fork()使用寫時拷貝

​ 核心此時並不複製整個程序位址空間,而是讓父程序和子程序共享同乙個拷貝

​ 只有在需要寫入時,資料才會被複製,從而使各個程序擁有各自的拷貝

​ fork()的實際開銷就是複製父程序的頁表以及給子程序建立唯一的程序描

1 程序管理

程序描述符獲取 通過thread union,使程序核心態堆疊和thread info緊密結合在一起。檔案include linux sched.h當中,有thread union的定義 union thread union 之所以將thread info結構稱之為小型的程序描述符,是因為在這個結構...

Linux程序管理(1)

程序是執行期間的程式及其它所包含的資源的總稱。程序通過 fork 系統呼叫產生,該系統呼叫通過複製乙個現有程序來建立乙個全新的程序。fork 呼叫一次返回兩次 一次回到父程序 一次回到新建立的子程序。程序描述符及任務結構 核心把程序放在 task list 的雙向迴圈鍊錶中,其中每一項都是乙個 ta...

Linux程序管理1

程序是已啟動的可執行程式的執行中例項。proc目錄下以數字為名的目錄,每乙個目錄代表乙個程序,儲存著程序的屬性資訊。每乙個程序的pid是唯一的,就算程序退出了,其它程序也不會占用其pid。1.1程序的組成部分 已分配記憶體的位址空間 安全屬性,包括所有權憑據和特權 程式 的乙個或多個執行執行緒 程序...