【學習筆記】2. 各類不一樣的進程

0. 同系列索引

  1. 進程與進程組
  2. 各類不一樣的進程
  3. 一個進程的演變

1. 進程組

具體的介紹,請參考 進程和進程組的概念php

clipboard.png

好比 ngixn php-fpm 終止了主進程,關聯的子進程就都關閉了html

2. 前臺進程 和 後臺進程

2.1 兩者的區別

前臺進程,就是運行在終端當前窗口的進程組nginx

clipboard.png

clipboard.png

2.2 進程的先後臺切換

clipboard.png

2.3 查看後臺進程

clipboard.png

後臺命令放到前臺segmentfault

clipboard.png

3. 守護進程

3.1 什麼是守護進程

clipboard.png

文字的描述或許有點抽象,咱們來看下一個服務器中的守護進程服務器

3.2 守護進程

clipboard.png

從上圖能夠看出 咱們平常的php-fpm服務,一直在後臺運行守護,等待分配運行。
以及咱們的swoole服務。swoole

還有咱們的內核服務,一直在守護者操做系統的正常運行。php-fpm

clipboard.png

PS : -1 就是沒有和任何終端創建關聯,通常是守護進程。 系統服務進程通常名稱都會包含d

3.3 守護進程的應用

clipboard.png

關於對比,守護進程和後臺進程的區別學習

  1. 守護進程已經徹底脫離終端的控制
  2. 後臺進程沒有徹底脫離,他的一些輸出信息會輸出到終端
  3. 關閉終端時,後臺進程會隨之終止,而守護進程會繼續進行。 好比nginx,或者系統進程
  4. 守護進程沒有獨立的會話,文件描述符,工做目錄。然後臺進程是繼承父進程的

3.4 守護進程的啓動

clipboard.png

這些通常在系統開機的時候啓動spa

4. 僵死進程

4.1 父進程和子進程的關聯

在介紹僵死進程以前,咱們再從新描述下父進程和子進程之間的關聯。
父進程---(fork)----子進程:執行任務
父進程---(wait)----子進程:釋放資源操作系統

歸納而言:

  • 父進程使用fork建立子進程,在調度器調度下調度運行不一樣的子進程
  • 子進程運行結束後退出(父進程wait以前),內核會自動釋放相關的資源

    • 釋放佔用的內存,打開的文件
    • 仍然保留必定的信息:進程ID,退出狀態,運行時間。(子進程獨享的一些狀態)
  • 父進程調用 wait 獲取子進程的退出狀態,釋放最後的資源。

因此若是子進程退出,可是父進程沒有調用wait,子進程的進程ID 等特殊資源不會被當即釋放,這些就變成了僵死進程。

4.2 僵死進程

僵死進程 : 子進程 exit 退出。父進程沒有調用 wait 獲取子進程狀態,那麼子進程的相關資源仍然保存在系統中

僵死進程會佔用PID等資源,若是系統中存在大量的僵死進程,會影響fork子進程。

PS :想一想一下,同時運行多個腳本,子進程退出,可是沒有釋放PID,進程資源優先。新來的任務就沒法fork出新的子進程ID
固然,系統會作一個清理的工做。

4.3 一個demo

clipboard.png

5. 孤兒進程

5.1 什麼是孤兒進程

孤兒:通俗易懂,沒有父親就是孤兒。
一樣的孤兒進程,就是找不到父進程的子進程。

若是子進程在執行過程當中,父進程先行退出,子進程就會託管給了init進程,那麼該子進程就是一個孤兒進程。

5.2 一個孤兒進程的demo

clipboard.png

經過休眠時間控制,在子進程執行期間,父進程提早退出

查看一下輸出結果

clipboard.png

5.3 分析一下託管父進程

上圖中咱們能夠看到,在父進程退出時,子進程會新找一個父親當作父進程。 這個父進程的PID: 是 1637:upstart進程

clipboard.png

咱們再深刻研究一下

clipboard.png

發現不少進程託管在 upstart進程 上

不一樣的系統,接管的父進程不同,是有具體的0號進程演變有關。

下面看下在虛擬終端頁面和控制檯頁面的接管父進程

虛擬終端

clipboard.png

圖形界面:

clipboard.png

具體爲何這種差別,須要從 1號進程 的產出具體說明。

6. 0號進程和1號進程

6.1 一切的起源:0號進程

clipboard.png

關於1號進程和2號進程,後續再慢慢解釋

clipboard.png

從上圖能夠知道,0號進程是一切的開始,他伴隨着開機啓動,他是惟一一個不是由fork產生的進程。

在內核啓動的過程當中,會經過 start_kernel 依次初始化 內核的各類模型,組件,進程等。

下圖:是 start_kernel 主要工做概覽

clipboard.png

clipboard.png

初始化完 0號進程 idle 以後 start_kernel 裏面會完成不少初始化工做。其中最後一步包括 :rest_init

rest_init 會調用 init_task
init_task 調用 kernel_thread
kernel_thread 會建立 init 進程 和 ktheadd 內核線程

init_task : 最終會演變成 0號進程 idle

6.2 從0到1

關於用戶進程的建立,請參考 一個進程的演變

100. 致敬

若有不詳,請參考王老師的精彩講解
學習過程當中,得到了極大的知足感,把以前的一些東西串聯了起來。十分感謝 王利濤老師在此表示感謝。PS:本文中全部的資源和圖片均來自視頻中

相關文章
相關標籤/搜索