必威电竞|足球世界杯竞猜平台

父進程
來源:互聯網

計算機科學中,父進程是指已經創建了一個或多個子進程的進程。

UNIX

在UNIX操作系統中,除了進程0(即PID=0的交換進程,Swapper Process)之外的所有進程都是通過系統調用fork創建的。在這個過程中,調用fork創建新進程的進程被稱為父進程,而它創建出來的進程則稱為子進程。因此,除了進程0外,每個進程都有且僅有一個父進程,但一個進程可能擁有多個子進程。操作系統內核使用進程標識符(Process Identifier,即PID)來唯一標識每個進程。進程0是系統啟動時創建的一個特殊進程,在其調用fork創建出一個子進程(即PID=1的進程1,又稱init)之后,進程0轉變為交換進程(有時也稱為空閑進程)。而進程1(init進程)成為了系統中所有其他進程的祖先。

進程生命周期

當一個子進程結束運行時,它的退出狀態(返回值)會報告給操作系統,系統隨后向父進程發送SIGCHLD信號,通知子進程已被結束。此時,子進程的進程控制塊(PCB)仍然保留在內存中。通常情況下,父進程接收到SIGCHLD信號后,會使用wait系統調用來獲取子進程的退出狀態,接著內核便可以從內存中釋放已完成的子進程的PCB。如果父進程未執行此操作,則子進程的PCB將繼續保留在內存中,形成所謂的僵尸進程。孤兒進程指的是在其父進程結束后繼續運行的子進程。在類unix系統中,這些孤兒進程通常會被init進程“收養”,從而成為init的子進程。為了避免產生僵尸進程,實踐中常采用的方法包括:

- 將父進程對SIGCHLD信號的處理函數設置為SIG_IGN(忽略信號)。

- 通過fork兩次并殺死一級子進程,使二級子進程成為孤兒進程,進而被init“收養”并清理。

Linux

在Linux內核中,進程和POSIX線程之間存在著細微的差異,這使得父進程的概念與UNIX有所不同。在Linux中,存在兩種類型的父進程:形式父進程和實際父進程。對于一個子進程而言,其父進程是在子進程結束時接收SIGCHLD信號的進程,而實際父進程則是多線程環境中真正創建該子進程的進程。對于普通的非線程進程,父進程與實際父進程是相同的實體。然而,對于以進程形態存在的POSIX線程,父進程和實際父進程可能會不同。

參考資料 >

什么是子進程和父進程.什么是子進程和父進程.2024-11-27

進程控制(2): 進程操作.博客園.2024-11-27

概述.概述.2024-11-27

生活家百科家居網