目錄
父進程
UNIX" >UNIX
殭屍行程與孤兒程序" >殭屍行程與孤兒程序
Linux" >Linux
子程序
產生" >產生
與父進程的關係" >與父進程的關係
「孤兒行程」與「殭屍行程」" >「孤兒行程」與「殭屍行程」
解決與預防" >解決與預防
首頁 運維 linux運維 什麼是父進程和子進程

什麼是父進程和子進程

Jun 22, 2017 pm 03:41 PM
行程

父進程

在電腦領域,父進程(英文:Parent Process)指已建立一個或多個子進程的進程。

UNIX


#在UNIX裡,除了程式0(即PID =0的交換進程,Swapper Process)以外的所有進程都是由其他進程使用系統呼叫fork創建的,這裡調用fork創建新進程的進程即為父進程,而相對應的為其創建出的進程則為子進程,因而除了進程0以外的進程都只有一個父進程,但一個進程可以有多個子進程。

作業系統核心以行程識別碼(Process Identifier,即PID)來識別行程。進程0是系統引導時創建的一個特殊進程,在其呼叫fork創建出一個子進程(即PID=1的進程1,又稱init)後,進程0就轉為交換進程(有時也稱為空閒進程),而進程1(init進程)就是系統裡其他所有進程的祖先。

殭屍行程與孤兒程序


當一個子程序結束運作(一般是呼叫exit、執行階段發生致命錯誤或當收到終止訊號所導致)時,子進程的退出狀態(回傳值)會回報給作業系統,系統則以SIGCHLD訊號將子進程被結束的事件告知父進程,此時子進程的進程控制區塊(PCB )仍駐留在記憶體中。一般來說,收到SIGCHLD後,父行程會使用wait系統呼叫以取得子行程的退出狀態,然後核心就可以從記憶體中釋放已結束的子行程的PCB;而如若父行程沒有這麼做的話,子行程的PCB就會一直駐留在記憶體中,也就是成為殭屍行程。

孤兒進程則是指父進程結束後仍在執行的子進程。在類UNIX系統中,孤兒進程一般會被init進程所“收養”,成為init的子進程。

為避免產生殭屍進程,實際應用中一般採取的方式為:

  1. #將父程式中對SIGCHLD訊號的處理函數設為SIG_IGN(忽略訊號) ;

  2. fork兩次並殺死一級子進程,令二級子進程成為孤兒進程而被init所「收養」、清理。

Linux

在Linux核心中,行程和POSIX執行緒有著相當微小的差別,父行程的定義也與UNIX不盡相同。 Linux有兩種父進程,分別稱為(形式)父進程與實際父進程,對於一個子進程來說,其父進程是在子進程結束時收取SIGCHLD訊號的進程,而實際父進程則在多執行緒環境裡實際創建該子程序的進程。對於普通進程來說,父進程與實際父進程是同一個進程,但對於一個以進程形式存在的POSIX線程,父進程和實際父進程可能是不一樣的。

 

子程序


在電腦領域中,子程序為由另一個程序(對應稱為父程序)所創建的進程。子進程繼承了父進程的大部分屬性,例如檔案描述符。

產生


#在Unix中,子程序通常會為系統呼叫fork的產物。在此情況下,子進程一開始就是父進程的副本,而在這之後,根據具體需要,子進程可以藉助exec呼叫來鍊式載入另一程序。

與父進程的關係


#一個行程可能下屬多個子進程,但最多只能有1個父行程,而若某一行程沒有父行程,則可知該行程很可能由核心直接產生。在Unix與類別Unix系統中,進程ID為1的進程(即init進程)是在系統引導階段由核心直接建立的,且不會在系統運行過程中終止執行(可參考Linux啟動流程) ;而對於其他無父進程的進程,則可能是為在使用者空間完成各種後台任務而執行的。

當某一子程序結束、中斷或恢復執行時,核心會發送SIGCHLD訊號給其父程序。在預設情況下,父進程會以SIG_IGN函數忽略之。

「孤兒行程」與「殭屍行程」


#在對應的父行程結束執行後,行程就會變成孤兒行程,但之後會立即由init進程「收養」為其子進程。

某一子程序終止執行後,若其父進程未提前呼叫wait,則內核會持續保留子程序的退出狀態等信息,以使父進程可以 wait獲取之。而因為在這種情況下,子程序雖已終止,但仍在消耗系統資源,所以亦稱殭屍進程。 wait常於SIGCHLD訊號的處理函數中呼叫。

解決與預防

在POSIX.1-2001標準規定中,父程序可將SIGCHLD的處理函數設為SIG_IGN(也為預設設定),或為SIGCHLD設定SA_NOCLDWAIT標記,以使核心可以自動回收已終止的子程序的資源。自Linux 2.6與FreeBSD 5.0起,兩種核心皆支援了這兩種方式。但是,在忽略SIGCHLD訊號的問題上,由於System V與BSD由來已久的差異,若要回收派生出的子程序的資源,呼叫wait仍是最便捷的方式。

以上是什麼是父進程和子進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解釋一下explorer.exe進程是什麼 解釋一下explorer.exe進程是什麼 Feb 18, 2024 pm 12:11 PM

explorer.exe是什麼進程在我們使用Windows作業系統的時候,常常會聽到一個名詞"explorer.exe".那麼,你是否好奇這個進程到底是什麼?在本文中,我們將詳細解釋explorer.exe是什麼進程以及其功能和作用。首先,explorer.exe是Windows作業系統的關鍵流程,它負責管理和控制Windows資源管理器(Window

com surrogate是什麼進程 com surrogate是什麼進程 Sep 14, 2022 pm 02:56 PM

「com surrogate」是「C:\Windows\System32\dllhost.exe」的進程;出現該進程通常是「COM+」元件停止運作,這個進程佔用高甚至直接未回應,這是由於電腦在載入檔案圖示的時候出現問題,導致電腦變的卡頓,可以在電腦屬性設定中解決卡頓問題。

請問ccsvchst.exe是哪一種進程? 請問ccsvchst.exe是哪一種進程? Feb 19, 2024 pm 11:33 PM

ccsvchst.exe是一種常見的進程文件,它是SymantecEndpointProtection(SEP)軟體的一部分,而SEP則是一款由著名的網路安全公司Symantec開發的終端保護解決方案。作為該軟體的一部分,ccsvchst.exe負責管理和監控SEP的相關進程。首先,我們來了解SymantecEndpointProtection(

如何正確殺死Linux中的殭屍行程 如何正確殺死Linux中的殭屍行程 Feb 19, 2024 am 10:40 AM

在Linux系統中,殭屍行程是已經終止但仍保留在系統中的特殊流程。雖然殭屍行程不會消耗太多資源,但如果數量太多,可能會導致系統資源耗盡。本文將介紹如何正確清除殭屍進程,以確保系統的正常運作。 1Linux殭屍行程子程序完成任務後,如果父行程沒有及時檢查狀態,子行程將成為殭屍行程。子進程在等待父進程確認,完成後系統才會回收。否則,殭屍行程會繼續懸掛在系統中。若要檢查系統中是否有殭屍進程,可透過執行命令top來查看所有正在執行的進程及可能存在的殭屍進程。 ‘top’指令的結果從上圖可以看到Linux中進

Linux進程優先權調整方法詳解 Linux進程優先權調整方法詳解 Mar 15, 2024 am 08:39 AM

Linux程序優先級調整方法詳解在Linux系統中,進程的優先順序決定了其在系統中的執行順序和資源分配。合理調整進程的優先順序可以提高系統的效能和效率。本文將詳細介紹Linux中如何調整進程的優先級,並提供具體的程式碼範例。一、進程優先權概述在Linux系統中,每個行程都有一個與之相關聯的優先權。優先權的範圍一般是-20到19,其中-20表示最高優先權,19表

如何在 Windows 11 中停止工作管理員進程更新並更方便地終止任務 如何在 Windows 11 中停止工作管理員進程更新並更方便地終止任務 Aug 20, 2023 am 11:05 AM

如何在Windows11和Windows10中暫停工作管理員進程更新按CTRL+視窗鍵+刪除開啟工作管理員。預設情況下,任務管理器將開啟「進程」視窗。正如您在此處看到的,所有應用程式都在無休止地移動,當您想要選擇它們時,可能很難將它們指向下方。因此,按CTRL並按住它,這將暫停任務管理器。您仍然可以選擇應用程序,甚至可以向下捲動,但您必須始終按住CTRL按鈕。

為什麼Linux中的行程會處於休眠狀態? 為什麼Linux中的行程會處於休眠狀態? Mar 20, 2024 pm 02:09 PM

為什麼Linux中的行程會處於休眠狀態?在Linux作業系統中,進程可能會處於休眠狀態,這是由於多種不同的原因和條件造成的。當進程處於休眠狀態時,表示該進程暫時被掛起,無法繼續執行,直到滿足某種條件後才能被喚醒繼續執行。接下來將詳細介紹在Linux中進程進入休眠狀態的幾種常見情況,並透過具體的程式碼範例加以說明。等待I/O完成:當進程發起一個I/O操作(例如讀取

Linux系統無PHP進程的偵測方法 Linux系統無PHP進程的偵測方法 Mar 16, 2024 am 11:42 AM

《Linux系統無PHP進程的檢測方法,需要具體程式碼範例》在使用Linux系統進行Web開發時,經常會依賴PHP進程來處理動態頁面和邏輯,而有時候我們可能需要監測伺服器上是否有PHP進程。本文將介紹一種偵測Linux系統中是否存在PHP進程的方法,並給出具體的程式碼範例。為什麼需要偵測PHP進程在Web開發中,PHP進程扮演著至關重要的角色,它負責解析執行P

See all articles