進程狀態:Linux的幕后指揮管理,穿越操作系統進程的靜與動

文章目錄

  • 引言:進程的生命與狀態:動與靜的交響曲
  • 一、操作系統中的進程狀態概述
    • 1.1 經典的進程狀態模型
    • 1.2 進程狀態轉換圖
  • 二、Linux操作系統中的進程狀態
    • 2.1 Linux進程狀態的分類
    • 2.2 各狀態的詳細解釋
  • 2.3 Linux進程狀態表
  • 2.4 使用ps查看進程狀態
  • 三、進程狀態具體分析
    • 🖋?運行 R
    • 🖋?睡眠 S
    • 🖋?休眠 D
    • 🖋?暫停 T
    • 🖋?死亡 X
    • 🖋?僵尸 Z
    • 📖孤兒進程
  • 總結:進程狀態的舞蹈

在這里插入圖片描述

引言:進程的生命與狀態:動與靜的交響曲

每一個進程都擁有自己的生命軌跡,它們在CPU的調度下,按照某種規律從一個狀態轉變到另一個狀態。這些狀態是進程在操作系統內存空間中的各種“存在形式”,是它們生命周期的不同表現,承載著操作系統對每個進程的管理與調度。

在Linux這個龐大而復雜的宇宙中,每個進程如同宇宙中的星辰,承載著數據流動與信息處理的重任。而它們的生命周期,卻不僅僅是簡單的“開始”與“結束”。在這無盡的天際,進程的狀態不斷變化,如同風中的細沙,或穩靜、或急躁、或急促、或安逸。今天,我們將一同探索,深入理解Linux操作系統中進程狀態的神秘面紗。

一、操作系統中的進程狀態概述

操作系統中的進程狀態是進程在生命周期中可能處于的不同狀態。這些狀態幫助操作系統識別進程的運行情況,并在不同狀態間進行合理的資源分配

操作系統中的經典進程狀態包括就緒運行阻塞終止

1.1 經典的進程狀態模型

典型的操作系統中,進程狀態可以分為以下幾種:
在這里插入圖片描述
在這種經典模型中,進程會在不同狀態之間流轉。具體來說:

就緒 -> 運行:CPU調度器分配CPU給就緒狀態的進程。
運行 -> 阻塞:進程等待I/O或其他資源時進入阻塞狀態。
阻塞 -> 就緒:等待的條件滿足后,進程重新進入就緒隊列,等待CPU調度。
運行 -> 終止:進程執行完畢或異常終止,進入終止狀態。

1.2 進程狀態轉換圖

在這里插入圖片描述
該圖展示了一個經典進程狀態的轉換流程。箭頭表示進程狀態轉換的可能路徑。

二、Linux操作系統中的進程狀態

Linux操作系統在經典的進程狀態基礎上進行了一系列擴展,允許內核更細粒度地控制進程,尤其是當系統資源緊張或多任務并發性很高時。Linux內核中的進程狀態可以使用ps命令或讀取/proc文件系統來查看進程的狀態信息。

2.1 Linux進程狀態的分類

在這里插入圖片描述
在進程的task_struct結構體中,state字段用來表示進程的當前狀態。根據內核中的定義,不同狀態的進程會被掛載在不同的等待隊列上,以實現細粒度的調度與控制。

而在我們 Linux 中,新建就緒運行都可以看作 運行 R 這一個狀態,所以比較清晰

在這里插入圖片描述

2.2 各狀態的詳細解釋

  • TASK_RUNNING:進程正在運行或準備運行。它可以被調度器分配到CPU執行。TASK_RUNNING的進程始終是就緒隊列的一部分。

  • TASK_INTERRUPTIBLE:進程處于可中斷等待狀態,等待某一條件滿足。進程在此狀態下可以被信號喚醒。(關于信號的知識我們在后面會講)

  • TASK_UNINTERRUPTIBLE:進程處于不可中斷的等待狀態。這通常用于等待特定資源(例如設備I/O操作完成)。進程在此狀態下不會被信號打斷,即便外部發送信號也不會響應。

  • TASK_STOPPED:進程被暫停,通常是由于接收到SIGSTOP信號或調試器干預,等待繼續或恢復信號。

  • TASK_TRACED:進程被調試工具(如gdb)跟蹤和控制。此狀態下的進程會暫停,直到調試器進一步控制。

  • EXIT_DEAD:進程終止后進入清理階段,等待系統回收資源

  • EXIT_ZOMBIE:進程已結束,系統未回收其資源。僵尸進程會保留在系統中,直到其父進程調用wait()系統調用收集它的退出狀態。

  • TASK_DEAD:表示進程已徹底結束,系統已回收其所有資源。

2.3 Linux進程狀態表

在這里插入圖片描述

2.4 使用ps查看進程狀態

在Linux系統中,可以通過ps命令查看進程的狀態:

ps -aux

在這里插入圖片描述
ps命令會顯示每個進程的詳細信息,其中狀態列標記著每個進程的狀態。狀態的含義如下:

  • R : 運行或就緒狀態
  • S:可終止等待
  • D: 不可終止等待
  • Z: 僵尸進程,等待回收
  • X:終止死亡進程
  • T: 停止狀態

我們也可以通過ps命令查看某個指定的進程的信息:

ps axj | grep 進程名字

三、進程狀態具體分析

🖋?運行 R

首先來看看第一種狀態 R
以我們以往的認知來說,一個程序在運行就表示該 進程 處于 運行 狀態,那么事實真的如此嗎?

先來看看下面這段代碼:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{while(1){cout << "I'm a process, my PID is:" << getpid() << endl;sleep(1);}return 0;
}

當前makefile文件為:

myProcess:test.cppg++ -o myProcess test.cpp.PHONY:catPI
catPI:ps ajx | head -1 && ps ajx | grep myProcess | grep -v grep .PHONY:clean
clean:rm -r myProcess

通過 make catPI 指令調用 Makefile 中提前設定好的指令,查看當前進程信息
在這里插入圖片描述
可以看到當前的進程狀態為 睡眠 S+
注: + 表示當前進程在前臺運行中

進程 難道沒有運行嗎?

運行了,但我們 很難捕捉到 對于 CPU 來說,將這么簡單的一句話輸出到屏幕上是一件很小的事,可能幾毫秒就完成了 而其他大多數時間,進程
都在外設等待隊列中 排隊 當我們將打印語句和睡眠語句屏蔽后,進程 不用在等待隊列中 排隊, CPU 就一直在處理死循環,此時可以觀察到 運行R 狀態

在這里插入圖片描述

🖋?睡眠 S

睡眠 S 的本質就是 進程阻塞表示此時進程因等待某種資源而暫停運行

睡眠 S 又稱為可中斷休眠,當 進程 等待時間過長時,我們可以手動將其關閉,應用卡死后強制關閉也是這個道理

在這里插入圖片描述
還有一種方式終止進程:kill

  • kill -9 PID 終止進程,當進程在后臺運行時(狀態不加 +),我們是無法通過 ctrl+c 終止的,但kill指令可以終止

🖋?休眠 D

還存在一種特殊睡眠狀態 休眠 D休眠 又被稱為不可中斷休眠,顧名思義,休眠 D 狀態下的 進程 是無法終止的,kill 指令和 OS都無能為力,只能默默等待 進程阻塞 結束,拿到資源了,進程 才會停止 休眠 D 狀態

終止 休眠 D 進程的一個方法就是切斷電源,此時進程是結束了,但整個系統也結束了

🖋?暫停 T

我們還可以使 進程 進入 暫停 T 狀態

  • kill -19 PID 暫停進程
  • kill -18 PID 恢復進程

在輸入暫停指令后,進程進進入暫停狀態

在這里插入圖片描述
在這里插入圖片描述
我們可以通過 kill -18 PID 使 進程 恢復運行,恢復后的 進程 在后臺運行

可以看到,恢復后進程繼續執行,并且狀態由T變為S
在這里插入圖片描述
注意: 進程 在后臺運行時,是無法通過 ctrl+c·指令終止的,只能通過 kill -9 PID 終止

在 gdb 中調試代碼時,打斷點實際上就是 使 進程 在指定行暫停運行,此時 進程 處于 追蹤暫停狀態 t

在這里插入圖片描述
在這里插入圖片描述

🖋?死亡 X

當進程被終止后,就處于 死亡 X 狀態

死亡狀態是無法在任務列表中觀察到的,死亡 X 狀態只是一個返回狀態

🖋?僵尸 Z

與死亡狀態相對應的還有一個 僵尸 Z 狀態

  • 通俗來說,僵尸狀態 是給 父進程 準備的
  • 當 子進程 被終止后,會先維持一個 僵尸 狀態,方便 父進程 來讀取到 子進程 的- 退出結果,然后再將 子進程 回收
  • 單純的在 bash 環境下終止 子進程,是觀察不到 僵尸狀態 的,因為 bash 會執行回收機制,將 僵尸 回收
  • 我們可以利用 fork() 函數自己創建 父子進程 關系,觀察到這一現象

代碼示例如下:

#include<iostream>
using namespace std;#include<unistd.h>
#include<sys/types.h>int main()
{pid_t ret = fork();if(ret == 0){while(1){cout << "I'm son process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else if(ret > 0){while(1){cout << "I'm father process, my PID: " << getpid() << " PPID: " << getppid() << endl;sleep(1);}}else{while(1){cout << "Make son process fail!" << endl;sleep(1);}}return 0;
}

此時進程開始執行
在這里插入圖片描述
此時父子進程都處于常規睡眠狀態
在這里插入圖片描述
此時輸入指令 kill -9 PIDkill -9 1007716終止 子進程
再次查看進程狀態:
在這里插入圖片描述
僵尸進程如果不被回收,會導致內存泄漏問題和標識符占用問題

📖孤兒進程

孤兒進程是一種特殊的進程狀態

  • 通過程序創建 父子進程
  • 通過指令終止 父進程,此時 子進程 會被OS領養
  • 子進程 的 父進程 變為 1號進程
  • 子進程 就變成了一個 孤兒進程

同樣執行上述代碼,起初都正常運行
在這里插入圖片描述
現在我們消滅父進程,觀察其執行結果和運行狀態
在這里插入圖片描述
可以看到子進程被1號進程領養
在這里插入圖片描述
假設 子進程 不被 1號進程 領養

  • 子進程 退出時就會無人回收,成為一只游離的僵尸
  • 僵尸進程 有 內存泄漏 的風險
  • 因此 子進程 會被OS領養

總結:進程狀態的舞蹈

Linux操作系統中的進程狀態,不僅僅是抽象的計算機術語,它們是系統中每個進程生命周期的具體體現。正如一場精彩的舞蹈,每個進程都有自己的節奏和步伐,它們或快速躍動,或緩慢舞動,或瞬間消失,而每個轉變都與操作系統對資源的調度和管理息息相關。

通過理解進程狀態與狀態轉變的過程,我們能夠更好地把握Linux系統的脈搏,掌握進程管理與調度的奧秘這不僅是操作系統中的技術問題,更是數字世界中的一場優雅的舞蹈。

本篇關于進程狀態的介紹就暫告段落啦,希望能對大家的學習產生幫助,歡迎各位佬前來支持斧正!!!

在這里插入圖片描述

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

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

相關文章

MOSN(Modular Open Smart Network)-05-MOSN 平滑升級原理解析

前言 大家好&#xff0c;我是老馬。 sofastack 其實出來很久了&#xff0c;第一次應該是在 2022 年左右開始關注&#xff0c;但是一直沒有深入研究。 最近想學習一下 SOFA 對于生態的設計和思考。 sofaboot 系列 SOFAStack-00-sofa 技術棧概覽 MOSN&#xff08;Modular O…

基于深度學習的圖像超分辨率技術研究與實現

一、引言 在數字圖像處理領域&#xff0c;圖像超分辨率技術一直是一個備受關注的熱點話題。隨著人們對圖像質量要求的不斷提高&#xff0c;如何將低分辨率圖像提升到高分辨率&#xff0c;同時保持圖像的細節和清晰度&#xff0c;成為了一個極具挑戰性的問題。傳統的圖像超分辨率…

構建高可用性西門子Camstar服務守護者:異常監控與自愈實踐

在智能制造領域,西門子Camstar作為領先的MES系統承載著關鍵生產業務。但在實際運維中,我們發現其服務常因數據庫負載激增(如SQL阻塞鏈超時)或應用服務器資源耗盡(CPU峰值達90%以上)導致服務不可用。傳統人工干預方式平均故障恢復時間長達47分鐘,這對連續生產場景構成了嚴…

Java Collection API增強功能系列之二 List.of、Set.of、Map.of

Java 9集合工廠方法&#xff1a;用List.of、Set.of、Map.of創建安全不可變集合 Java 9引入了革命性的集合工廠方法List.of、Set.of和Map.of&#xff0c;徹底改變了開發者創建小型不可變集合的方式。這些方法不僅語法簡潔&#xff0c;還在安全性和性能上實現了質的飛躍。本文將…

網絡通信微服務

網絡通信 VPN 服務器分配內網 IP&#xff0c;加密所有流量,以使用外網訪問內網資源 使用了VPN只是第一關&#xff0c;只進入了人家的大廳&#xff0c;只可以訪問公共服務&#xff08;像是只可以在人間公司的大廳里溜達&#xff09;&#xff0c;若想要訪問人家提供的高級服務&a…

arm之s3c2440的I2C的用法

基礎概念 IC&#xff08;Inter-Integrated Circuit&#xff09;又稱I2C&#xff0c;是是IICBus簡稱&#xff0c;所以中文應該叫集成電路總線。 IIC的總線的使用場景&#xff0c;所有掛載在IIC總線上的設備都有兩根信號線&#xff0c;一根是數據線SDA&#xff0c;另一 根是時鐘…

算法 | 蜣螂優化算法原理,引言,公式,算法改進綜述,應用場景及matlab完整代碼

蜣螂優化算法(Dung Beetle Optimizer, DBO)詳解 1. 算法原理 蜣螂優化算法(DBO)是一種基于自然界蜣螂行為的元啟發式優化算法,靈感來源于蜣螂的滾球、繁殖、覓食和偷竊行為。其核心思想是通過模擬蜣螂在復雜環境中的協作與競爭機制,解決全局優化問題。關鍵行為模擬: 滾球…

uniapp開發實戰自定義組件形式實現自定義海報功能

在 UniApp 中實現自定義海報功能,可以通過 Canvas 來繪制海報。Canvas 提供了豐富的繪圖 API,可以精確控制文字、圖片和二維碼的位置。下面是一個完整的示例,展示如何創建一個自定義海報組件。 項目結構 假設你的項目結構如下: project-root/ ├── pages/ │ └──…

dockerfile構建鏡像方式

在 Docker 中&#xff0c;可使用 docker build 命令依據 Dockerfile 構建鏡像。下面為你詳細介紹構建鏡像的具體方式。 基本構建命令 若要構建鏡像&#xff0c;需在包含 Dockerfile 的目錄下執行 docker build 命令。基本語法如下&#xff1a; bash docker build -t <鏡像…

STM32F103_LL庫+寄存器學習筆記10 - DMA傳輸過半+DMA傳輸完成中斷實現DMA串口接收“雙緩沖“

導言 《[[STM32F103_LL庫寄存器學習筆記09 - DMA串口接收與DMA串口發送&#xff0c;串口接收空閑中斷]]》上一章節完成DMA發送與接收。此時&#xff0c;有一個致命的問題可能會導致數據包丟失。原因是USART1接收只開啟了接收空閑中斷(IDLE)&#xff0c;DMA在連續模式下&#xf…

李宏毅機器學習筆記06 | 魚和熊掌可以兼得的機器學習 - 內容接寶可夢

本章提要 深度學習可以在較少參數量的情況下得到比較低的loss&#xff1a; h a l l a r g min ? h ∈ H L ( h , D a l l ) h^{all}arg \min_{h \in H}L(h,D_{all}) hallargminh∈H?L(h,Dall?) 引入 如何權衡模型的復雜程度 Tradeoff of Model Complexity 理論上&#…

java八股文之JVM

1.什么是程序計數器 程序計數器是 JVM 管理線程執行的“定位器”&#xff0c;記錄每個線程當前執行的指令位置&#xff0c;確保程序流程的連續性和線程切換的準確性。線程私有的&#xff0c;每個線程一份&#xff0c;內部保存的字節碼的行號。用于記錄正在執行的字節碼指令的地…

Android設計模式之觀察者模式

一、定義&#xff1a;定義對象間一種一對多的依賴關系&#xff0c;使得每當一個對象改變狀態&#xff0c;則所有依賴于它的對象都會得到通知并被自動更新。 二、核心角色&#xff1a; Subject&#xff1a;抽象主題被觀察的角色&#xff0c;管理觀察者集合&#xff0c;提供注冊…

海康gdb流程

gdb相關 在initrun.sh文件里加入&#xff0c;注意需要在hikauto起來之前 # 設置core dump大小 ulimit -c unlimited if [ $? -eq 0 ];then echo "core dump size set success" else echo -e "\33[31m core dump size set fail\33[0m" fi echo …

springBoot統一響應類型3.3版本

前言&#xff1a; 通過實踐而發現真理&#xff0c;又通過實踐而證實真理和發展真理。從感性認識而能動地發展到理性認識&#xff0c;又從理性認識而能動地指導革命實踐&#xff0c;改造主觀世界和客觀世界。實踐、認識、再實踐、再認識&#xff0c;這種形式&#xff0c;循環往…

【空間變換】歐拉角與四元數

核心 歐拉角描述的是一種變換&#xff0c;只關注變換后的結果&#xff0c;不關注變換過程中的運動 而四元數不僅良好地表示了一種變換&#xff0c;也很好地表示了一種運動過程&#xff0c;又避免了萬向節死鎖Gimbal Lock變換順序&#xff0c;是歐拉角變換的一部分&#xff0c;…

基于Linux下的MyBash命令解釋器

項目介紹&#xff1a;?個?C語?實現的簡單shell&#xff0c;可以接受??輸?的命令并執?操作&#xff0c;?持多管道和重 定向。 mybash---打造自己的命令解釋器 目前我們Linux的系統默認的命令解釋器是bash; 命令解釋器&#xff08;也稱為命令行解釋器或shell&#xff0…

Linux常見使用場景

一、文件查看與內容操作 ?1. cat ?作用&#xff1a;查看文件內容&#xff08;一次性輸出全部內容&#xff09;。?常用選項&#xff1a; -n&#xff1a;顯示行號。-b&#xff1a;僅對非空行顯示行號。 ?示例&#xff1a; cat file.txt # 查看文件內容 cat -n fil…

Ingredient-oriented Multi-Degradation Learning for Image Restoration論文閱讀

摘要&#xff1a;重點在于關聯多個任務本質的聯系。 不同恢復任務的關聯性很重要。 揭示退化現象的內在機理聯系很有意義。 多合一的方法能在單一模型中處理多種退化問題&#xff0c;可擴展性較差。 成分導向范式挖掘不同圖像退化現象背后的物理規律或特征模式。 成分導向退化重…

禪道后臺命令執行漏洞

漏洞簡介 禪道是第一款國產的開源項目管理軟件。它集產品管理、項目管理、質量管理、文檔管理、 組織管理和事務管理于一體&#xff0c;是一款專業的研發項目管理軟件&#xff0c;完整地覆蓋了項目管理的核心流程。 禪道管理思想注重實效&#xff0c;功能完備豐富&#xff0c;…