C語言---多進程

1.進程的定義

標準定義:進程是可併發執行的程序,是在一個數據集合上的運行過程。 
通俗來說,硬盤上的一個可執行文件經常被稱爲程序,在Linux系統中,當一個程序開始執行後,在開始執行到執行完畢退出這段時間裏,它在內存中的部分就被稱作一個進程。

2.進程的分類

進程一般分爲交互進程、批處理進程和守護進程三類。 
守護進程總是活躍的,一般是後臺運行。守護進程一般是由系統在開機時通過腳本自動激活啓動或超級用戶root來啓動的。

3.進程的屬性

進程ID(PID):是唯一的數值,用來區分進程。 
父進程和父進程的ID(PPID)。 
啓動進程的用戶ID(UID)和所歸屬的組(GID)。 
進程狀態:狀態分爲運行R、休眠S、殭屍Z。 
進程執行的優先級。 
進程所連接的終端名。 
進程資源佔用,如佔用資源大小(內存、CPU佔用量)。

4.Linux進程管理

通過進程管理工具實現,如ps(進程監視工具)、kill(終止進程工具,類似還有:killall、pkill、xkill)、grep(查詢進程工具)等。

5.Linux進程的三態

就緒狀態:當進程已分配到除CPU以外所有必要的資源,只要獲得處理器便可立即執行,這時的進程狀態稱爲就緒狀態。 
執行狀態:當進程已獲得處理器,其程序正在處理器上執行,此時的進程狀態稱爲執行狀態。 
阻塞狀態:正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理器而處於阻塞狀態。引起進程阻塞的事件可有多種,如等待I/O完成、申請緩衝區不能滿足、等待信件(信號)等。

6.Linux下程序是如何轉化爲進程的呢?

內核將程序讀入內存,爲程序分配內存空間;內核爲該進程分配進程標識符pid和其他所需資源;內核爲該進程保存PID及相應的狀態信息,把進程放到運行隊列中等待執行.程序轉化爲進程後就可以被操作系統的調度程序調度執行了。

7.Linux進程的組成

Linux中一個進程由三部分組成:代碼段,數據段,堆棧段 
從內存的低地址到高地址依次爲: 
代碼段:二進制機器代碼 
數據段:存儲已被初始化的變量,包括全局變量和已被初始化的靜態變量 
未初始化數據段:存儲未被初始化的靜態變量,又稱BBS 
堆:用於存放程序運行中動態分配的變量 
棧:用於函數調用,保存函數的返回地址,函數的參數,函數內部定義的局部變量

8.可執行程序和內存映像的區別:

1)可執行程序位於硬盤,內存映像位於內存 
2)可執行程序沒有堆棧(程序被加載到內存中才會分配堆棧) 
3)可執行程序中未初始化數據段並不儲存在位於硬盤中的可執行文件中 
4)可執行程序是靜態的,不變的,內存映像動態變化

9.進程創建

1)獲取進程 
系統調用getpid得到進程ID,調用getppid得到父進程(創建調用該函數進程的進程)的ID 
2)啓動進程 
fork()函數用於創建子進程。 
vfork()函數用於建立一個新的進程 
exec系統調用 
system,system函數用於執行shell命令

10.殭屍進程

當子進程先於父進程終止,而父進程又沒有調用wait函數等待子進程結束,子進程進入僵死狀態,並且會一直保持下去除非系統重啓.子進程處於僵死狀態,內核只保存該進程的一些必要信息以備父進程所需.此時子進程始終佔用着資源,同時也減少了系統可以創建的最大進程數;如果子進程先於父進程終止,且父進程調用了wait或waitpid函數,則父進程會等待子進程結束。殭屍進程幾乎放棄所有內存空間,沒有任何可執行代碼,不能被調度,僅在進程列表中保留一個位置,但是過多的殭屍進程會導致系統崩潰。

發佈了38 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章