Linux 進程的基礎屬性

Linux 系統上所有運行的任務都可以是一個進程,每個用戶任務、每個系統管理,都可以稱之爲進程,Linux 用分時管理的方法使所有的任務共同分享系統資源。

進程的定義:
課本概念:程序的一個執行實例,正在執行的程序。
內核觀點:擔當分配系統資源(CPU時間,內存)的實體。

1. 進程的四要素

  • 有一段程序代碼供該程序運行。
  • 擁有專用的系統堆棧空間。
  • 擁有一個 task_struck 結構來實現進程控制塊(pcb)。
  • 擁有獨立的存儲空間。

2. 進程的關係和分類

Linux 系統中的所有進程都是相互聯繫的。

Linux 內核創建了進程標號爲 0 和進程標號爲 1 的進程,進程標號爲 1 的進程是一個初始化進程 init,Linux 中的所有進程都是由其衍生而來的,在 Shell 下執行程序啓動的進程則是 Shell 進程的子進程,在用戶的啓動進程中可以再啓動自己的子進程,這樣就形成了一棵進程樹,每個進程都是樹中的一個節點,樹的根是初始化進程 init。
在這裏插入圖片描述
進程之間的關係可以用圖中的親屬關係來描述,通常包括以下幾個部分。

  • p_opptr(祖先,original parent): 指向創建進程 P 的進程描述符,如果父進程不存在,則指向進程 init 的描述符。當一個 Shell 用戶啓動一個後臺進程並從 Shell 退出時,後臺進程將變成 init 的子進程。
  • p_ pptr(父進程,parent): 指向進程的父進程,值通常來說和 p_ opptr 一致,也可能不同。
  • p_ cptr (子進程,child): 指向進程年齡最小的子進程的描述符,即進程上一次創建的進程描述符。
  • p_ ysptr(弟進程,younger sibling): 指向在本進程創建之後由父進程創建的進程。
  • p_ osptr(兄進程,older sibling):指向在本進程創建之前由父進程創建的進程。

3. 進程的類型

Linux 操作系統通常包括三種不同類型的進程。

  • 交互進程:由一個 Shell 啓動的進程,既可以在前臺運行,也可以在後臺運行。
  • 批處理進程:和終端沒有聯繫,是一個進程序列。
  • 守護進程:Linux 系統啓動時啓動的進程,並在後臺運行。

4. 進程的狀態

進程在其生存週期內可能處於以下狀態中,這些狀態是互斥的,在 task_struct 結構的狀態域中使用不同關鍵字來定義這些狀態。

  • 可運行狀態(TASK_RUNNING):佔用處理器執行或者準備執行。
  • 可中斷的等待狀態(TASK_INTERRUPTIBLE):進程被掛起或者睡眠,當某些條件變成真的時候退出這種等待狀態,比如:硬件中斷、進程正在等待的系統資源被釋放、傳遞一個信號等,退出等待狀態之後的進程會回到 TASK_RUNNING 狀態。
  • 不可中斷的等待狀態(TASK_ UNINTERRUPTIBLE):和可中斷的等待狀態類似,其差別是當接收到信號時並不能退出這個等待狀態。
  • 暫停狀態(TASK_STOPPING): 進程的執行被暫停,通常來說當進程接收到 SIGSTOP、SIGTTIN 或者 SIGTTOU 信號後,進入暫停狀態。如果一個進程被另外一個進程監控時,任何信號都可以把這個進程置於 TASK_STOPPEN 狀態。
  • 殭屍狀態(TASK_ZOMBIE):進程的執行已經被終止,但是父進程還沒有使用 wait 調用已返回的相應信息,此時內核不能丟棄包含在該進程中的相應數據,因爲父進程還可能需要這些數據。

進程在這幾種狀態之間相互轉化,但對於用戶而言是透明的,這個切換的過程也常常被稱爲進程的調度。

進程是一個隨執行過程不斷變化的實體,進程也包含程序計數器和所有處理器寄存器的值,同時它的堆棧中存儲着(如子程序)參數、返回地址以及變量之類的臨時數據。
當前的執行程序,或者說進程,包含着當前處理器中的活動狀態。在多處理操作系統中,進程具有獨立的權限與職責。如果系統中某個進程崩潰,不會影響到其餘的進程。
每個進程運行在各自的虛擬地址空間中,通過一定的通信機制,它們之間才能發生聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章