主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解
ID:嵌入式情報局
作者:情報小哥
1進程與程序
01
什么是進程 ??
? ? 什么是進程 ? 進程(process)是具有獨立功能的程序單次運行,是操作系統進行資源分配的基本單位。
02
進程的特點
動態性 : 是程序的一次執行過程,這也是與程序最大的區別。
并發性?: 多個進程在一段時間內可以同時運行。
獨立性 : 各自獨立運行、資源獨立和調度的基本單位。
03
進程與程序??
程序是靜態,而進程為動態。
程序是永久,而進程有生命周期。
程序是指令的有序集合,而進程不僅包括指令還包括進程控制狀態等信息。
一個程序可對應多個進程即多個進程可執行同一個程序;一個進程可以執行一個或幾個程序。
更加通俗的理解 : 程序一般是保留在物理介質(塊設備,如硬盤等)的數據,數據加載到內存以后的執行形態就是進程。
2進程三態
01
三態模型圖??
02
狀態解釋???
執行態(running):進程占有CPU正在執行中。
就緒態(ready)? ? :具備運行條件,等待CPU調度以便運行。
阻塞態(blocked):進程等待或者睡眠都屬于此狀態,進程不具備運行條件,正在等待某個IO事件的完成。
03
轉移過程? ?
? ? 通過上面的狀態模型圖,我們大致可以了解到狀態的轉移只有4種情況,然而如果其中一個狀態能夠達到任意其他兩個狀態應該有6種轉移情況,所以有兩種情況無法轉移:
執行態-->就緒態 : 圖上標識的是時間片用完,這個僅僅對于采用時間片調度算法,而對于其他調度算法可能存在高優先級搶占低優先級,從而使得優先級從執行態變成就緒狀態等等。
就緒態-->執行態 : 之前進程處于就緒狀態, 一旦根據調度算法滿足調度條件便會占用CPU運行,從而變成執行狀態。
執行態-->阻塞態 : 在執行狀態中存在一些請求(IO請求)從而導致當前無法再繼續執行,從而進入等待資源的狀態。
阻塞態-->就緒態?: 進入等待資源的狀態,一旦獲得資源,完成請求就順利進入就緒表,從而等待調度器調度。
以上三態模型的4種狀態轉移就就介紹完了,那么就存在還有兩種狀態轉移是不支持的 :
阻塞態-->執行態?:?由于調度器大部分調度器算法一般都不會從堵塞任務表中挑選任務進行執行,所以該轉換一般不發生。
就緒態-->阻塞態?: 進程都沒有得到執行,不會有任何資源需求,所以該轉換一般也不會發生。
? ? 當然對于Linux系統不僅僅有這三態模型,還有其他更多的狀態,基本上都是在三態模型上的演化!
3五態模型
01
模型示意圖?
02
模型解讀
對于進程五態模型僅僅只是在前面的三態模型上加入了新建態與終止態,所以這里小哥只是講一下新建態和終止態,其他三態與之前的一致。
新建態:
前面說過程序與進程的關系,那么操作系統把程序加載到內存中并且讓其變成運行狀態還需要有特別多控制管理數據的配置和初始化。比如各種物理和邏輯資源,如內存、文件、I/O設備和CPU時間等分配和建立進程控制塊(PCB)表項、建立資源表格(如打開文件表)并分配資源、加載程序并建立地址空間相關的頁表與段表等等。
往往在新建態操作系統過程中就可以根據當前的CPU負荷等等限制進程的數量。
終止態:
該狀態表示進程已結束,首先操作系統會進行一些善后工作,比如回收除進程控制塊之外的其他資源,然后可以讓其他進程從進程控制塊中收集有關信息(如退出代碼用于傳遞給父進程),最后將任務控制塊(PCB)清除,并且把主內存還給操作系統。
4加入掛起與激活
01
模型示意圖??
02
模型解讀? ?
上述模型在五態模型的基礎上加入了掛起和激活狀態,操作系統一個最大的特點就是對硬件資源的最大化利用,同樣對于主內存資源也是通過置換算法達到最大化的虛擬地址空間,特別是主存資源當不能滿足所有進程運行時,就必須掛起某些進程,放到磁盤對換區,暫時不參加調度,以平滑系統負荷等處理。
活躍就緒:存于主存中且可被調度。
靜止就緒:進程被對換到輔存(磁盤等)形成靜止就緒狀態,且不參與調度,系統通過一定的策略,會在恰當的時機把掛起就緒態進程調回主存并轉換為活躍就緒,從而繼續參與系統調度。
活躍阻塞:之前處于執行態,一旦等待事件的產生便進入活躍就緒狀態。
靜止阻塞:是指活躍態進程對換到輔存時的阻塞狀態,一旦等待的事件產生,由于該靜止阻塞態進程具有較高的優先級,并且操作系統已經得知導致它阻塞的事件即將結束,便會進入活躍阻塞。
5Linux進程
01
Linux進程狀態?
? ? 前面小哥跟大家聊了一下操作系統的通用進程三狀態和五狀態模型,同時在五狀態轉移模型中加入了掛起和超時狀態,而實際的操作系統會根據自身特點從而對狀態模型圖進行擴展或者優化,那么今天看一下Linux實際的進程狀態轉移。
02
Linux進程狀態圖
03
狀態與轉移??
1、進程通過系統調用或者中斷即可從用戶態進入內核態,此時Linux通過進程調度算法調度實現多進程的并發執行,所以處于用戶態和內核態的進程一般都統一叫做運行態。
2、就緒態是進程滿足運行條件等待被系統調度進入運行態的狀態,就緒態其實是滿足運行條件的,所以一般也叫運行態。
3、可中斷休眠態又叫淺睡眠態,一般進程調用sleep_interruptible()即可進入該狀態,該狀態主要是等待所需的資源,可以通過接收來自其他進程的信號、wake_up()或者wake_up_interruptible()來進行喚醒,從而進入就緒態。
4、不可中斷休眠態也叫深睡眠態,它與不可中斷休眠態類似,不過其喚醒條件更加嚴苛一點,只能通過使用wake_up()明確指明才能轉為就緒態。
5、進程處于運行態,當收到暫停信號比如SIGSTOP信號等,即會掛起轉為暫停態,且處于暫停態的進程收到SIGCONT信號又可被激活成運行態。
6、僵死態是Linux里面比較有趣的狀態,當主動調用do_exit()以后便會進入該狀態,表示該進程已經停止運行,不過需要等待父進程確認,其任務控制塊還沒有釋放。
? ? 從Linux一個大體的進程狀態轉移圖來看,與前面介紹的狀態模型還是比較相似的。
我是情報小哥,一個嵌入式自學玩家!
長按前往圖中包含的公眾號關注
結束語
? ? 好了,這里是公眾號:“最后一個bug”,一個為大家打造的技術知識提升基地。
推薦好文??點擊藍色字體即可跳轉
?【MCU】把"安卓HAL層思想"引到單片機軟件開發中
?【MCU】可怕,別人把我MCU固件給反匯編了!(逆向)
??【典藏】自制小型GUI界面框架(設計思想篇)
??【典藏】大佬們都在用的結構體進階小技巧
總結
以上是生活随笔為你收集整理的主进程退出后子进程还会存在吗?_【干货】Linux进程模型 全解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整车改头换面 内饰大变样!别克全新君越4
- 下一篇: 《和平精英》开放世界玩法“绿洲世界”今日