Linux程序管理分析

2021-09-25 01:12:07 字數 1814 閱讀 2057

本文分析的內容包括:

程序的概念和一般特性,為什麼重要

程序和執行緒之間的關係

linux如何存放和表示程序(用task_struct和thread_info)

如何建立程序(通過fork(),最終是clone())

怎麼把新的執行映像裝到位址空間(通過exec()系統呼叫)

怎麼表示程序的層次關係

父程序怎麼收集後代的資訊(通過wait()系統呼叫)

程序如何消失(強制呼叫或者主動呼叫exit())

程式本身並不是程序,程序是執行的程式,和其他的一些資源。比如開啟的檔案,掛起的訊號還有核心的資料。

程序的建立:

在linux系統當中,建立程序是通過fork()系統呼叫,fork()通過複製乙個已有的程序來建立乙個新的程序 。

呼叫fork()的程序是父程序,被建立的程序是子程序。

fork()系統呼叫從核心返回兩次,一次是返回父程序,另一次返回到子程序。

unix的實現方式比較特別,把建立的步驟分解到兩個函式中來執行:乙個是fork()函式,另乙個是exec()函式。

1)fork()函式拷貝當前程序來建立乙個新的子程序,子程序的父程序的區別就是:程序好pid,父程序好ppid還有其他一些資源。

傳統的fork()系統呼叫直接把所有的資源複製給新的程序,這樣效率比較低,因為可能拷貝的資料,新的程序並不需要,這樣就做了無用功,浪費系統資源。

linux的fork()做了優化,它使用寫時拷貝(copy-on-write),核心不會直接複製整個程序位址空間,而是讓父程序和子程序共享同乙份拷貝。只有在需要寫入的時候,資料才會被複製,每個程序才擁有自己的乙份拷貝。在此之前,資料以唯讀的方式共享。

這樣優化之後的fork()系統呼叫,它的實際開銷就是複製父程序的頁表,還有給子程序建立唯一的程序描述符。一般情況下,建立乙個程序之後會馬上執行乙個可執行檔案,這樣的優化就可以避免拷貝大量不會被使用的資料。

2)exec()函式負責把可執行檔案載入到位址空間,然後開始執行。

執行緒機制可以讓一組執行緒共享記憶體位址,共享其他的資源比如開啟的檔案,可以在多核處理器上並行處理任務。

linux實現執行緒的機制比較獨特。從核心的角度來說,沒有執行緒這個專門的概念。linux把所有的執行緒都看成程序來實現,核心沒有準備專門的的排程演算法來處理執行緒。

每乙個執行緒都有自己的tack_struct,在核心裡看起來就像乙個普通的程序一樣,只不過有些執行緒之間會共享一些資源,比如共享位址空間。

比如有乙個包含四個執行緒的程序,在linux當中只是建立四個程序,分配四個普通的task_struct結構,建立四個程序的時候指定他們共享的資源就可以了。

核心把程序的列表放入任務佇列當中,任務佇列是乙個雙向迴圈鍊錶,鍊錶當中的每一項都是乙個程序描述符,是task_struct結構。

程序描述符包含的資訊有:開啟的檔案,程序的位址空間,程序的狀態,掛起的訊號,還有其他一些資訊。

核心通過程序的標識pid來識別不同的程序,每乙個程序的pid存放在自己的程序描述符當中。

在核心當中,訪問乙個程序需要先獲得他的task_struct的位址。

程序描述符當中有state域表示程序的狀態。 系統中的程序一共有5個狀態。

1)task_running:包括兩種細分的狀態:

2)task_interruptible:程序被阻塞,等待某個條件,如果條件滿足就變成可執行狀態

3)task_uninterruptible:就算收到訊號也不會被喚醒,這個狀態用的很少

4)task_stopped:程序呼叫do_exit函式可以進入終止狀態。

5)task_traced:表示程序被其他程序跟蹤

《linux核心設計與實現》robert love(著) 陳莉君 康華 翻譯

LINUX程序管理

1.程序是什麼?乙個程序就是出於執行期的程式,包括 可執行程式 段 開啟的檔案,掛起的訊號,核心內部資料,處理器狀態,位址空間,乙個或多個執行執行緒,當然還包括用來存放全域性變數的資料段,等等.2.什麼是執行緒?它和程序的關係是什麼樣的?執行緒在linux中具體是怎麼樣實現的?是在程序中活動的物件,...

linux程序管理

程序的監控 使用ps aux 檢視當前所有程序。可以使用top檢視當前程序自動更新列表,在top中m 按記憶體大小排列,p 按cpu佔用率排列 終止和管理程序 程序之間通過訊號來進行通訊 top和kill都用於向程序傳送訊號。kill l顯示訊號編號表。kill 9 pid kill pid 向pi...

Linux 程序管理

1.linux程序管理工具,包括ps pgrep top kill killall pkill 等 常用 ps aux 或lax輸出的解釋 user 程序的屬主 pid 程序的id ppid 父程序 cpu 程序占用的cpu百分比 mem 占用記憶體的百分比 ni 程序的nice值,數值大,表示較少...