父進程和子進程

来源:http://www.cnblogs.com/wuguiyunwei/archive/2017/06/21/7058056.html
-Advertisement-
Play Games

父進程 在電腦領域,父進程(英語:Parent Process)指已創建一個或多個子進程的進程。 UNIX 在UNIX里,除了進程0(即PID=0的交換進程,Swapper Process)以外的所有進程都是由其他進程使用系統調用fork創建的,這裡調用fork創建新進程的進程即為父進程,而相對應 ...


父進程

在電腦領域,父進程(英語: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仍是最便捷的方式。

 

我們的公共號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • update、delete的條件寫錯甚至沒有寫,導致數據操作錯誤,需要恢復被誤操作的行記錄。這種情形,其實時有發生,可以選擇用備份文件+binlog來恢復到測試環境,然後再做數據修複,但是這樣其實需要耗費一定的時間跟資源。 其實,如果binlog format為row,binlog文件中是會詳細記錄 ...
  • package com.asin.hdp.inverted; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.a... ...
  • OVER(PARTITION BY)函數介紹 開窗函數 Oracle從8.1.6開始提供分析函數,分析函數用於計算基於組的某種聚合值,它和聚合函數的不同之處是:對於每個組返回多行,而聚合函數對於每個組只返回一行。 開窗函數指定了分析函數工作的數據視窗大小,這個數據視窗大小可能會隨著行的變化而變化,舉 ...
  • 故障描述,重啟伺服器後,發現該重啟節點未成功加入到Windows群集中,導致該節點上的Alwayson服務也受影響處於“正在解析”狀態,嘗試重啟cluster服務,發現無效,查看windows日誌,發現以下錯誤: 發現以上錯誤均不是重點,重點是: 嘗試更新域控策略,也會有類似錯誤提示: 仔細對比了當 ...
  • 第一步:第一次打開MyEclipse,先從網上下載相應的驅動。(我的是mysql-connector-java-5.0.5-bin,視情況而定); 第二部:先打開MyEclipse Database Explorer透視圖,選擇MyEclipse菜單欄的Window/Open Perspective ...
  • ...
  • 1.mysql數據存儲結構 1.1由“資料庫”——》“表”——》“數據”組成 1.2管理資料庫需要使用SQL(結構化查詢語言) SQL語言分為: 1 數據查詢語言DQL 按照指定的組合、條件表達式或排序檢索已存在的資料庫中數據,不改變資料庫中數據。 命令:SELECT…FROM…WHERE… 2 數 ...
  • 系統環境:Win10 64位 MySQL版本:mysql-5.7.18-winX64 部署的步驟就是按照網上說的: 1:修改環境變數path,增加值D:\Program Files\MySQL\MySQL Server 5.7\bin 2:複製了一個舊版本mysql安裝目錄下的my.ini(網上說這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...