本文分析的內容包括:
程序的概念和一般特性,為什麼重要
程序和執行緒之間的關係
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值,數值大,表示較少...