進程的概念
進程是一個具有獨立功能的程式關於某個資料集合的一次可以並發執行的運行活動,是處於活動狀態的電腦程式。進程作為構成系統的基本細胞,不僅是系統內部獨立啟動並執行實體,而且是獨立競爭資源的基底實體。
-------------------------------------------------------------------------------------------------
進程的屬性
進程的定義:一個進程是一個程式的一次執行的過程;程式是靜態,它是一些儲存在磁碟上的可執行檔代碼和資料集合;進程是一個動態概念,它是Linux系統的基本的調度單位;一個進程由如下元素組成:
程式讀取的上下文,它表示程式讀取執行的狀態。
程式當前執行的目錄。
程式服務的檔案和目錄。
程式訪問的許可權。
記憶體和其他分配給進程的系統資源。
Linux進程中最知名的屬性就是它的進程號(Process Idenity Number,PID)和它的父進程號(Parent Process ID,PPID)。
PID、PPID都是非零正整數。一個PID唯一地標識一個進程。
一個進程建立新進程稱為建立了子進程(Child Process)。相反地,建立子進程的進程稱為父進程。
所有進程追溯其祖先最終都會落到進程號為1的進程身上,這個進程叫做init進程,是核心自舉後第一個啟動的進程。
pstree命令
Linux提供了一條pstree命令,允許使用者查看系統內正在啟動並執行各個進程之間的繼承關係。直接在命令列中輸入pstree即可,程式會以樹狀結構方式列出系統中正在啟動並執行各進程之間的繼承關係。
-----------------------------------------------------------------------------
進程的結構
Linux中一個進程在記憶體裡有三部分資料,就是“資料區段”、“堆棧段”和“程式碼片段”。
程式碼片段是存放了程式碼的資料,假如機器中有數個進程運行相同的一個程式,那麼它們就可以使用同一個程式碼片段。
而資料區段則存放程式的全域變數、常數及動態資料分配的資料空間。
堆棧段存放的就是子程式的返回地址、子程式的參數及程式的局部變數。堆棧段包含在進程式控制制塊PCB(Process Control Block)中。PCB處於進程核心堆棧的底部,不需要額外分配空間。
-----------------------------------------------------------------------------
進程狀態
使用者狀態:進程在使用者狀態下啟動並執行狀態。
核心狀態:進程在核心狀態下啟動並執行狀態。
記憶體中就緒:進程沒有執行,但處於就緒狀態,只要核心調度它,就可以執行。
記憶體中睡眠:進程正在睡眠並且進程儲存在記憶體中,沒有被交換到SWAP裝置。
就緒且換出:進程處於就緒狀態,但是必須把它換入記憶體,核心才能再次調度它運行。
睡眠且換出:進程正在睡眠,且被換出記憶體。
被搶先:進程從核心狀態返回使用者狀態時,核心搶先於它做了環境切換,調度了另一個進程。原先這個進程就處於被搶先狀態。
建立狀態:進程剛被建立。該進程存在,但既不是就緒狀態,也不是睡眠狀態。這個狀態是除了進程0以外的所有進程的最初狀態。
僵死狀態(zombie):進程調用exit結束,進程不再存在,但在進程表項中仍有記錄,該記錄可由父進程收集。