程序是處於執行期的程式,程序包括**段,資料段,還有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程序的組成部分 已分配記憶體的位址空間 安全屬性,包括所有權憑據和特權 程式 的乙個或多個執行執行緒 程序...