【Linux詳解】進程的狀態 | 運行 阻塞 掛起 | 僵尸和孤兒狀態

目錄

? ? ? ??操作系統中

運行狀態

阻塞狀態

進程狀態轉換

?Linux系統中

查看進程狀態

深度睡眠狀態

T 暫停狀態

Z 僵尸狀態

?孤兒狀態

文章手稿


xmind:?

引言

介紹系統中的進程狀態及其管理方式。將通過結合操作系統原理和實際代碼示例,詳細說明進程的各種狀態、轉換過程以及處理方法。

操作系統中

一個進程通常有三種狀態

  • 就緒狀態(Ready):表示進程已經具備運行所需要的一切條件,只需要等待CPU的分配就可以運行。進程處于就緒狀態時,通常會被添加到就緒隊列,等待調度器分配CPU資源
  • 運行狀態(Running):表示進程正在被CPU執行。處于運行狀態的進程正在使用CPU進行計算或其他操作
  • 阻塞狀態(Blocked):表示進程因為某些原因暫時無法繼續執行,需要等待一些特定條件的解除之后才能繼續運行。例如,當進程等待I/O操作完成或者等待某個資源可用時,會轉入阻塞狀態。進程在阻塞狀態時,通常會被移動到阻塞隊列中,等待條件的滿足。

我們下面將對運行,阻塞,和阻塞掛起進行介紹~?

運行狀態

?進程只要在運行隊列中,就叫做?運行態

阻塞狀態

關于進程:

① 一個進程使用資源的時候,可不僅僅是在申請 CPU 資源
② 進程可能會申請其它資源:磁盤、網卡、顯卡,顯示器資源……

如果我們申請 CPU 資源無法暫時無法得到滿足,這就需要排隊的 "運行隊列" 。那么如果我們申請其他慢設備的資源呢?是需要排隊的(task_struct 在進程排隊)。

當訪問某些資源(磁盤,網卡等),如果該資源暫時沒有準備好,或者正在給其他進程提供服務,那么此時:

① 當前進程要從 runqueue 中逐出。
② 將當前進程放入對應設備的描述結構體中的waitqueue 。

進程狀態:看PCB在哪個隊列

內存不足了,操作系統就會把 該進程的代碼和數據置換到磁盤上,進行?進程掛起

進程狀態轉換

進程狀態的轉換可以通過以下示例說明:

#include <stdio.h>
#include <unistd.h>int main() {while (1) {printf("進程[%d]正在運行...\n", getpid());sleep(1); // 模擬阻塞狀態}return 0;
}

通過運行上述代碼并觀察進程狀態,可以理解進程在不同狀態之間的轉換過程。

三種狀態的圖示如下:


?Linux系統中

進程狀態用整數表示,這些整數存儲在進程的task_struct結構體中。常見的進程狀態包括:運行(R)、睡眠(S)、磁盤睡眠(D)、停止(T)、死亡(X)、僵尸(Z)和孤兒進程

進程狀態一覽

狀態代碼狀態名稱描述
R運行(Running)進程正在運行或在運行隊列中等待
S睡眠(Sleeping)進程在等待某事件完成,可被信號喚醒
D磁盤睡眠(Disk Sleep)進程在等待I/O操作完成,不可被信號喚醒
T停止(Stopped)進程被暫停,可通過信號恢復
X死亡(Dead)進程已終止,從進程列表中移除
Z僵尸(Zombie)進程已退出,父進程尚未讀取其狀態
孤兒(Orphan)父進程已退出,被init進程收養

查看進程狀態

使用ps auxps axj命令可以查看系統中進程的狀態。例如:

ps aux
ps axj

這些命令輸出的狀態字段展示了進程當前的狀態。

背后的原因讓人暖心,cpu太快了,print顯示器等待的時間在他看來就是在sleep了

深度睡眠狀態

這個D狀態我們就不模擬了……可能會把我的機子磁盤打滿(害怕.dog)?


T 暫停狀態

比如看視頻,聽音樂,下載,都會有暫停。當你點擊暫停的時候下載對應的代碼就不跑了,此時這個進程你就可以認為是暫停狀態。

再比如說我們調試程序,讓程序打斷點之后讓程序運行起來,程序在打斷點處停住的時候是將進程暫停了,所以你在gdb 調試或在 VS 下調試時你會發現程序會停下來,這就是暫停

是進程掛起的一種。

我們可以先來看一下kill

接下來可以來嘗試一下;

$ kill -19 4026,就會發現

gdb下的暫停狀態,測試一下

$ gdb process  # 進入gdb調試
(gdb) l        # 查看代碼
(gdb) b 9      # 打斷點
q + 回車       # 退出

Z 僵尸狀態

僵尸狀態:當一個 Linux 中的進程退出的時候,一般不會直接進入?X? 狀態(死亡,資源可以立馬被回收),而是進入?Z 狀態。

為什么呢~

進程為?Z 狀態,就是為了維護退出信息,可以讓父進程或者 OS 讀取記錄的,退出信息會寫入 test_struct。

以下是創建僵尸進程的代碼示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main() {pid_t id = fork();if (id < 0) {perror("fork");return 1;} else if (id == 0) { // 子進程printf("子進程[%d]開始運行...\n", getpid());sleep(5);printf("子進程[%d]退出...\n", getpid());exit(0);} else { // 父進程printf("父進程[%d]正在睡眠...\n", getpid());sleep(30); // 父進程延遲回收子進程}return 0;
}

?我們可以寫一個監控腳本來看一下~

while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1; echo "######" ; done

在另一個終端中運行ps命令可以看到子進程進入僵尸狀態。

僵尸進程的危害

僵尸進程雖然不再運行,但它們仍然占用系統資源(如進程控制塊task_struct)。如果父進程不及時回收子進程,會導致系統資源浪費,甚至內存泄漏。

避免僵尸進程

可以通過以下方式:

  1. 父進程及時調用wait()waitpid()回收子進程。
  2. 使用信號處理機制,在子進程退出時通知父進程進行回收。

?孤兒狀態

孤兒進程:父親沒了(bushi

即:父進程先退出了,子的父就變成1 號進程了,相當于被os領養了

測試一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main(void) {pid_t id = fork();if (id == 0) {// childint cnt = 5;while (1) {  // 死循環,孩子進程就不退了printf("我是子進程,我還剩下 %ds\n", cnt--);sleep(1);}printf("我是子進程,我已經變僵尸了,等待被檢測\n");exit(0);}else {// fatherint cnt = 3;while (cnt) {printf("我是父進程,我: %d\n", cnt--);sleep(1);}exit(0);}
}

?監控一下:

 while :; do ps axj | head -1 && ps axj | grep mytest | grep -v grep; sleep 1;echo "######";done

我們可以top看一下1究竟是什么

?

? 疑問:父進程退出,為什么父進程沒有變成僵尸?我們怎么沒有看到父進程 為Z? ?

  • 那是因為父進程的父進程是bash ,它會自動回收它的子進程,也就是這里的父進程。這里之所以沒有看到父進程變成僵尸,是因為被 bash 回收了, z->x 的狀態很快,所以你沒看到
  • 那為什么剛才我自己代碼中的父進程創建的子進程,父進程沒有回收子進程呢?那是因為你的代碼壓根就沒有寫回收,所以你的子進程就沒有回收

那我們怎么暫停呢,ctrl+c 只能干掉前臺進程,

所以孤兒進程就要用到我們的殺進程:kill -9來暫停啦


文章手稿

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35822.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙開發Ability Kit(程序框架服務):【FA模型切換Stage模型指導】 app和deviceConfig的切換

app和deviceConfig的切換 為了便于開發者維護應用級別的屬性配置&#xff0c;Stage模型將config.json中的app和deviceConfig標簽提取到了app.json5中進行配置&#xff0c;并對部分標簽名稱進行了修改&#xff0c;具體差異見下表。 表1 配置文件app標簽差異對比 配置項FA模型…

Excel中的“點選輸入”——次級下拉列表創建

在Excel中&#xff0c;用“數據驗證”功能可以設置下拉列表&#xff0c;二級下拉列表需要設置公式。 (筆記模板由python腳本于2024年06月16日 18:36:37創建&#xff0c;本篇筆記適合經常使用Excel處理數據的coder翻閱) 【學習的細節是歡悅的歷程】 Python 官網&#xff1a;http…

基于 Spring AOP 實現安全檢查

在現代應用程序中&#xff0c;安全性是一個至關重要的方面。通過對系統中的關鍵操作進行安全檢查&#xff0c;可以有效防止未授權的訪問和操作。Spring AOP&#xff08;面向切面編程&#xff09;提供了一種優雅的方式來實現安全檢查&#xff0c;而無需修改業務邏輯代碼。本文將…

后端之路第三站(Mybatis)——入門配置

一、Mybatis是啥&#xff1f; 就是一個用java來操控數據庫的框架語言 之前學的datagrip或者navicat這些軟件里我們操作數據庫&#xff0c;原理是我們編寫完的操作語句發送到服務器傳送到數據庫系統&#xff0c;然后數據庫執行完之后再發送給服務器返回給datagrip或者navicat顯…

【linux/shell案例實戰】shell界面命令快捷鍵

快捷鍵及含義&#xff1a; Ctrl&#xff0b;u剪切光標之前的內容。Ctul&#xff0b;k剪切光標之后的內容。Ctrl&#xff0b;e讓光標移動到命令最前&#xff0c;Ctrl&#xff0b;a讓光標移動到命令最后Ctrl&#xff0b;y 粘貼剛才所刪除的內容。Ctrl&#xff0b;d 刪除光標所在…

GPT-5:AI的博士時代與我們的未來

目錄 引言第一部分&#xff1a;GPT-5技術突破預測1. NLP技術的革新1.1 算法進步對理解力提升的影響1.2 技術突破推動行業發展 2. 行業推動力2.1 教育行業的變革2.2 醫療行業的創新2.3 法律行業的效率提升 第二部分&#xff1a;智能系統與人類的協作1. 輔助決策的角色1.1 決策支…

游戲AI的創造思路-技術基礎-sigmoid函數詳解

在前面的機器學習和深度學習的內容中&#xff0c;大量出現了sigmoid函數&#xff0c;所以本篇為大家介紹下sigmoid函數&#xff0c;希望對大家理解前面的算法和后面的Transformer有所幫助 目錄 3.8. sigmoid函數 3.8.1. 定義 3.8.2. 性質 3.8.3. 應用 3.8.4. 缺點 3.8.5.…

Flutter實現頁面間傳參

帶參跳轉 步驟 在router中配置這個路由需要攜帶的參數,這里的參數是 arguments,注意要用花括號包裹參數名稱 在相應組件中實現帶參構造函數 在state類中可以直接使用${widget.arguments}來訪問到傳遞的參數 在其他頁面中使用Navigator.pushNamed()帶參跳轉

【昇思初學入門】第八天打卡-模型保存與加載

模型保存與加載 學習心得 保存 CheckPoint 格式文件&#xff0c;在模型訓練過程中&#xff0c;可以添加檢查點(CheckPoint)用于保存模型的參數&#xff0c;以便進行推理及再訓練使用。如果想繼續在不同硬件平臺上做推理&#xff0c;可通過網絡和CheckPoint格式文件生成對應的…

C++中常用的標志庫

標準庫 C標準庫是一個強大的工具集&#xff0c;它包含了一組豐富的類和函數&#xff0c;可以幫助開發者進行各種操作&#xff0c;如輸入輸出、字符串操作、數據結構管理、算法實現等。以下是一些常用的C標準庫及其使用方法。 1. 輸入輸出庫 <iostream> 用于標準輸入輸…

2024年最新通信安全員考試題庫

61.架設架空光纜&#xff0c;可使用吊板作業的情況是&#xff08;&#xff09;。 A.在2.2/7規格的電桿與墻壁之間的吊線上&#xff0c;吊線高度5m B.在2.2/7規格的墻壁與墻壁之間的吊線上&#xff0c;吊線高度6m C.在2.2/7規格的電桿與電桿之間的吊線上&#xff0c;吊線高度…

[leetcode]24-game

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:static constexpr int TARGET 24;static constexpr double EPSILON 1e-6;static constexpr int ADD 0, MULTIPLY 1, SUBTRACT 2, DIVIDE 3;bool judgePoint24(vector<int> &nums) {vector&l…

【C++LeetCode】【熱題100】三數之和【中等】-不同效率的題解【6】

題目&#xff1a; 暴力方法&#xff1a; class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;std::unordered_set<std::string> uniqueValues;//保證結果唯一for(int i0;i<n…

工商業儲能柜用的Acrel-2000ES儲能能量管理系統-安科瑞 蔣靜

概述 Acrel-2000ES儲能能量管理系統&#xff0c;專門針對工商業儲能柜、儲能集裝箱研發的一款儲能EMS&#xff0c;具有完善的儲能監控與管理功能,涵蓋了儲能系統設備(PCS、BMS、電表、消防、空調等)的詳細信息&#xff0c;實現了數據采集、數據處理、數據存儲、數據查詢與分析…

PHP米表域名出售管理源碼帶后臺

源碼介紹 html5米表源碼PHP域名銷售程序安裝方法&#xff1a; 本站已測試,各項功能正常,功能易用,不復雜,非常適合個人米表使用 1、所有文件傳至網站目錄 2、瀏覽器執行http://你的訪問網址/install 3、輸入mysql帳號及密碼信息&#xff0c;提交安裝 源碼截圖 源碼下載 …

MySQL程序使用的選項文件

MySQL程序使用的選項文件如下&#xff1a; 顯示幫助消息并退出。 在具有多個網絡接口的計算機上&#xff0c;使用此選項可以選擇用于連接MySQL服務器的接口。 安裝字符集的目錄。 如果可能&#xff0c;壓縮客戶端和服務器之間發送的所有信息。 從MySQL 8.0.18開始&#xff0c;…

GPOPS-II教程(3): 航天器最優控制問題

文章目錄 問題描述GPOPS代碼main functioncontinuous functionendpoint function完整代碼代碼仿真結果 最后 問題描述 例子出自論文 Direct solution of nonlinear optimal control problems using quasilinearization and Chebyshev polynomials&#xff08;DOI&#xff1a;1…

新手選擇代理IP時這幾點誤區一定要避開!

在選擇代理IP時&#xff0c;許多用戶可能會因為對代理IP的認識不足或受到一些誤導&#xff0c;而陷入一些常見的誤區。這些誤區不僅可能導致用戶無法達到預期的效果&#xff0c;還可能帶來一些不必要的風險。下面&#xff0c;IPIDEA代理IP就與大家一同分析在選擇代理IP時需要避…

國企:2024年6月中國鐵路相關招聘信息,6.27截止

中國鐵路濟南局集團有限公司2024年度 招聘普通高校本科及以上學歷畢業生公告(三) 中國鐵路濟南局集團有限公司根據企業發展需要,擬招聘普通高等院校本科及以上學歷畢業生,現將有關事項公告如下: 一、招聘計劃 本次招聘崗位均為生產一線操作技能崗位,具體崗位、專業要求…

【教資優秀作文】

目錄 不沉湎于過去&#xff0c; 向未來進發 轉變思維方式&#xff0c;風景這邊獨好 一英尺的距離 面對逆境&#xff0c;智者生存 機遇與準備 1. 巴西足球名將貝利在足壇初露鋒芒時 &#xff0c;一個記者問他&#xff1a;“你哪一個球踢得最好&#xff1f; ” 他回答說&am…