Linux操作系統從入門到實戰(十九)進程狀態

Linux操作系統從入門到實戰(十九)進程狀態

  • 前言
  • 一、什么是進程狀態
  • 二、狀態本質
  • 三、最核心的3種狀態
    • 1. 就緒狀態
    • 2. 運行狀態
    • 3. 阻塞狀態
  • 四、狀態變化的核心
    • 1/兩種資源如何影響狀態?
  • 五、操作系統怎么管理這些狀態?
  • 六、Linux里結構體與狀態
  • 七、回顧:“父進程”和“子進程”
  • 八、僵尸進程
    • 1. 什么是僵尸進程?
    • 2. 僵尸進程是怎么產生的?
    • 3. 看個例子:30秒的僵尸進程
    • 4. 僵尸進程的危害
  • 九、孤兒進程
    • 1. 什么是孤兒進程?
    • 2. 孤兒進程會變成僵尸嗎?
    • 3. 看個例子


前言

  • 上一篇博客里我們講解了Linux里面怎么查看進程
  • 這篇博客我們開始講解進程狀態與僵尸和孤兒進程

我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482


一、什么是進程狀態

  • 前面我們講過可以把“進程”理解成“正在運行的程序”(比如你打開的微信、瀏覽器,本質上都是一個或多個進程)。

而==“進程狀態”==,就是這個“正在運行的程序”當前的“處境”——它現在是在干活?還是在等東西?還是準備好了就等機會干活?

簡單說:進程狀態就是用來描述“這個進程現在能干啥、接下來要干啥”的標記

二、狀態本質

聽起來好像很復雜,但其實在電腦(操作系統)內部,** 進程狀態就是一個簡單的數字 **

比如:操作系統可能用“0”表示“準備好了”,用“1”表示“正在干活”,用“2”表示“在等東西”。不同的操作系統數字可能不一樣,但核心邏輯都差不多——用數字標記“進程當前的狀態”。

三、最核心的3種狀態

所有操作系統(不管是Windows、Linux還是手機系統),管理進程狀態的邏輯都差不多,最核心的就3種狀態:** 就緒狀態、運行狀態、阻塞狀態 **。

在這里插入圖片描述

我們可以用一個生活例子理解:把“進程”比作“去食堂打飯的同學”,“CPU(電腦的核心)”比作“打飯窗口”。

1. 就緒狀態

比如你到了食堂,發現窗口正在有人打飯,你就站在隊伍里等著——這時候你就是“就緒狀態”。

對應到進程:

  • 進程已經把所有“準備工作”做好了(比如需要的內存、數據都齊了);
  • 就差“CPU(打飯窗口)”有空了,一旦CPU輪到它,它就能立刻開始干活。

2. 運行狀態

當窗口空出來,輪到你打飯了——這時候你就是“運行狀態”。

對應到進程:

  • 進程正在被CPU“處理”,比如正在執行代碼(算數學題、處理文字等);
  • 只要CPU沒“輪到下一個”,它就一直處于這個狀態。

3. 阻塞狀態

假設你打飯時發現沒勺子,得先去旁邊取勺子,這時候你就暫時離開隊伍,等拿到勺子再回來排隊——這時候你就是“阻塞狀態”。

對應到進程:

  • 進程暫時沒法用CPU干活,因為它在等“外設資源”(比如等鍵盤輸入、等硬盤讀寫數據、等網絡傳輸完成);
  • 必須等外設資源準備好了(比如你拿到勺子),它才會重新回到“就緒狀態”(回到隊伍),再等CPU來處理。

四、狀態變化的核心

為什么進程會在這3種狀態之間切換?本質是因為進程在“搶資源”,而資源只有兩種

  1. ** CPU資源 **:就是“打飯窗口”,誰搶到誰就能“運行”;
  2. ** 外設資源 **:就是“勺子、餐盤”這類,比如鍵盤、鼠標、硬盤、網絡等。

1/兩種資源如何影響狀態?

  • 如果你是“計算密集型”任務(比如跑復雜的數學公式、處理大數據):主要搶CPU資源,大部分時間要么在“運行”(用CPU),要么在“就緒”(等CPU)。
  • 如果你是“IO密集型”任務(比如用微信發消息、用瀏覽器下載文件):主要搶外設資源(發消息要等網絡,下載要等硬盤),大部分時間可能在“阻塞”(等外設),偶爾回到“就緒”和“運行”。

五、操作系統怎么管理這些狀態?

操作系統會給每個CPU建一個“調度隊列”(就像食堂的隊伍)

  • 所有“就緒狀態”的進程,都會排在這個隊列里,等著CPU來“叫號”;
  • 一旦CPU“叫到”某個進程,這個進程就從“就緒”變成“運行”;
  • 如果運行中的進程需要等外設(比如等你輸入文字),就會離開隊列,進入“阻塞”;等外設準備好了,再重新回到“就緒隊列”排隊。

六、Linux里結構體與狀態

最后簡單提一下Linux系統里的實現。

在Linux中,每個進程的信息(包括狀態、占用的資源、位置等)都存在一個叫“PCB(進程控制塊)”的結構體里(可以理解成“進程的身份證+檔案”)

  • 結構體就像一個“抽屜”,里面有很多“小格子”(成員),每個格子存不同的信息(比如狀態、內存地址等)。
  • 如果你知道某個“小格子”(比如狀態這個數字)的地址,就能反推出整個“抽屜”(結構體)的起始地址(就像知道抽屜里某本書的位置,就能找到整個抽屜在哪)。
  • 想訪問結構體里的信息(比如狀態),直接用“結構體變量.成員名”就行(比如“進程檔案.狀態”)。

七、回顧:“父進程”和“子進程”

就像現實中父母會生孩子,一個進程(比如你打開的瀏覽器)也能“創建”新的進程(比如瀏覽器新開的標簽頁進程)。我們把“創建者”叫** 父進程 ,“被創建的”叫 子進程 **。

它們的關系就像:父進程“管”子進程,子進程干完活后,要告訴父進程“結果咋樣”(比如“任務完成”或“出錯了”)。

八、僵尸進程

1. 什么是僵尸進程?

簡單說:子進程已經退出(“死了”),但父進程一直沒“問”它“死之前干得咋樣”,這時候子進程就變成了僵尸進程

用生活例子類比:
你(子進程)幫爸媽(父進程)做一件事,做完后你告訴爸媽“我完事了”,但爸媽一直在忙別的,沒理你。這時候你雖然“任務結束”了,但還得等著爸媽回應,就像“僵尸”一樣,沒徹底“消失”。

2. 僵尸進程是怎么產生的?

子進程退出時,會留下一個“退出狀態碼”(比如“0”表示成功,“1”表示失敗),這個碼是給父進程看的。

  • 如果父進程及時用wait()(可以理解成“詢問結果”)讀取了這個碼,子進程就會徹底消失;
  • 但如果父進程沒讀(比如父進程在睡覺、忙別的),子進程就會保持“僵尸狀態(Z狀態)”,留在系統的“進程表”里,等著父進程來“處理”。

3. 看個例子:30秒的僵尸進程

有一段代碼(不用看懂細節,知道邏輯就行):

  • 父進程創建子進程后,自己睡30秒(期間不處理子進程);
  • 子進程創建后,只睡5秒就退出了。

這時候:

  • 子進程5秒后“死了”,留下退出狀態碼;
  • 父進程還在睡覺(30秒),沒讀這個碼;
  • 所以子進程在這25秒(30-5)里,就成了僵尸進程,狀態是Z。

4. 僵尸進程的危害

僵尸進程雖然“死了”,但它的“檔案”(PCB,之前講過的“進程身份證+信息表”)還在系統里存著——因為要保留“退出狀態碼”等信息,等著父進程來取。

問題來了:

  • 一個僵尸進程的PCB占一點內存,看起來不多;
  • 但如果父進程創建了很多子進程,還都不管(不讀狀態碼),就會有一堆僵尸進程的PCB占內存,最后導致“內存泄漏”(內存被白白浪費,用不了)。

九、孤兒進程

1. 什么是孤兒進程?

和僵尸進程相反:** 父進程先退出(“死了”),但子進程還在運行,這時候子進程就成了孤兒進程 **。

生活例子類比:
爸媽(父進程)提前“離開”了,你(子進程)還沒長大(還在運行),這時候你就成了“孤兒”。

2. 孤兒進程會變成僵尸嗎?

不會。因為操作系統有“兜底機制”:
當父進程先死,子進程會被系統的“1號進程”(可以理解成“系統大管家”,比如Linux里的init進程)“領養”。

  • 1號進程會負責“接管”這個孤兒進程,等它退出后,及時讀取它的退出狀態碼;
  • 所以孤兒進程退出后,不會變成僵尸,會被1號進程徹底“清理”掉。

3. 看個例子

一段代碼邏輯:

  • 父進程創建子進程后,自己只睡3秒就退出了;
  • 子進程會睡10秒才退出(比父進程活得久)。

這時候:

  • 父進程3秒后“死了”,子進程還在運行,成了孤兒;
  • 系統的1號進程會“領養”這個孤兒;
  • 10秒后子進程退出,1號進程會及時讀取它的狀態碼,子進程正常消失,不會變僵尸。
類型產生原因結果/危害系統處理方式
僵尸進程子進程先死,父進程沒讀它的退出碼留在進程表,占內存,可能導致內存泄漏父進程用wait()讀取狀態碼即可清除
孤兒進程父進程先死,子進程還在運行不會變僵尸,會被1號進程領養并正常回收1號進程接管,負責后續清理

以上就是這篇博客的全部內容,下一篇我們將繼續探索Linux的更多精彩內容。

我的個人主頁
歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482

非常感謝您的閱讀,喜歡的話記得三連哦

在這里插入圖片描述

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

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

相關文章

容器技術之docker

容器技術之Docker一、什么是Docker二、為什么會出現Docker2.1 環境一致性問題2.2 虛擬化技術的局限性2.3 微服務架構的興起三、重要概念3.1 什么是鏡像3.2 什么是容器3.3 總結:3.4 Docker倉庫四、安裝Docker(Ubuntu系統下)1.卸載老的版本2.更…

數據結構與算法:樹狀數組

前言 太難了…… 一、樹狀數組使用場景 樹狀數組一般用來維護可差分的信息,比如累加和,累乘積等。舉個例子,當整個數組的累加和為sum1,一個區間內的累加和為sum2,那么除了這個區間剩下部分的累加和就是sum1-sum2&am…

“一車一碼一池一充”:GB 17761-2024新國標下電動自行車的安全革命

2025年9月1日,電動自行車行業將迎來一場深刻變革。隨著強制性國家標準GB 17761-2024《電動自行車安全技術規范》的全面實施,我國超3.5億電動自行車用戶的安全出行將獲得全新的技術保障。在這場安全升級中,“一車一碼一池一充”的全鏈條管控機…

QT聊天項目DAY18

1.文件傳輸1.1 客戶端采用分塊傳輸(20MB/塊),以及MD5碼校驗并將讀出的二進制數據采用Base64編碼進行傳輸1.1.0 通信協議1.1.1 UI采用垂直布局,該布局大小為570 * 160,間隔全是0,UI方面不詳細介紹了1.1.2 MainWindow頭文件#ifndef …

centos系統sglang單節點本地部署大模型

前置工作 本地部署大模型的基本概念和前置工作-CSDN博客 模型部署 這里通過docker容器進行部署。我這里是h20*8,部署deepseek-v3-0324,這個配置和模型都比較大,大家根據自己的硬件對應調整 步驟一 我們要通過sglang部署模型,先拉取sglang的docker鏡像,這里下載失敗的…

【dij算法/最短路/分層圖】P4568 [JLOI2011] 飛行路線

題目描述 Alice 和 Bob 現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在 nnn 個城市設有業務,設這些城市分別標記為 000 到 n?1n-1n?1,一共有 mmm 種航線,每種航線連接兩個城市,并且航線有一定…

告別傳統,CVPR三論文用GNN動態圖重塑視覺AI

本文選自gongzhonghao【圖靈學術SCI論文輔導】關注我們,掌握更多頂會頂刊發文資訊今天,為大家推薦一個極具前沿價值與實用潛力的研究方向:圖神經網絡(GNN)。作為深度學習領域的新興力量,圖神經網絡在近年頂…

HTTP/HTTPS代理,支持RSA和SM2算法

在日常工作和學習中,我們經常遇到HTTP和HTTPS的相關問題,要解決這些問題,有時就需要搭建各種實驗環境,重現業務場景,比如: 將HTTP轉為HTTPS。本地只能發送HTTP請求,但是遠程服務器卻只能接收HT…

如何提高AI寫作論文的查重率?推薦七個AI寫作論文工具

隨著AI技術在學術領域的廣泛應用,越來越多的學生和研究人員開始使用AI寫作工具來提高寫作效率,幫助完成畢業論文、科研論文等。然而,AI生成的內容是否會提高論文的查重率?是否能有效避免重復和提高通過率?這些問題成為…

跨平臺、低延遲、可嵌入:實時音視頻技術在 AI 控制系統中的進化之路

引言:面向未來的實時音視頻基座 在萬物互聯與智能化加速落地的時代,實時音視頻技術早已不再只是社交娛樂的附屬功能,而是智慧城市、應急指揮、遠程操控、工業智造、教育培訓、安防監控等系統的“神經中樞”。一條高性能、可控、低延遲的視頻…

Spring WebFlux開發指導

Spring WebFlux是一個響應式的web服務器端應用開發框架,響應式是指,當前端組件的狀態發生變化,則生成事件通知,根據需求可異步或者同步地向服務器端接口發送請求,當服務器端網絡IO組件的狀態發生變化,則生成…

09-docker鏡像手動制作

文章目錄一.手動制作單服務的nginx鏡像1.啟動一個基礎容器,此處我使用的是centos7鏡像。2.修改容器中的軟件源3.安裝nginx服務并啟動nginx服務4.修復nginx的首頁文件5.退出容器6.將退出的容器提交為鏡像7.測試鏡像的可用性二.手動制作多服務的nginx sshd鏡像1.啟用…

Android.mk教程

語法 Android.mk 的必備三行 LOCAL_PATH : $(call my-dir) # Android.mk的目錄,call調用函數include $(CLEAR_VARS) # 除了LOCAL_PATH清除所有LOCAL_XXXinclude $(BUILD_SHARED_LIBRARY) # BUILD_XXX, 指定構建類型 # BUILD_SHARED_LIBRARY → .so動態庫 # BUILD…

稠密檢索:基于神經嵌入的高效語義搜索范式

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 1. 背景與定義 稠密檢索(Dense Retrieval)是一…

AI日報0807 | GPT-5或今晚1點來襲:四大版本全曝光

關注:未來世界2099每日分享:全球最新AI資訊【應用商業技術其他】服務:【學習Q】【資源Q】【學習資料】【行業報告】(無限免費下載)應用 1、訊飛星火代碼畫布震撼上線:動嘴就能開發,工作效率翻倍…

認識爬蟲 —— 正則表達式提取

本質是對字符串的處理,正則表達式描述的是一種字符串匹配的模式。簡而言之,用具備一定特征意義的表達式對字符串進行檢查,將符合條件的子字符串提取出來。導入模塊import re一、單字符匹配match(表達式,匹配對象):匹配…

單鏈表專題---暴力算法美學(1)(有視頻演示)

1.1 移除鏈表元素 題目要求:給你一個鏈表的頭節點head 和一個整數val,請你刪除鏈表中所有滿足Node.val val 的節點,并返回新的頭節點。 思路一:遍歷鏈表,遇到val就刪除,pcur指向val的下一個節點,最后只剩…

機器學習-決策樹(DecisionTree)

0 回歸決策樹展示 import pandas as pd import numpy as np from sklearn.tree import DecisionTreeRegressor from sklearn.metrics import root_mean_squared_error, r2_score from sklearn.model_selection import GridSearchCV,KFold from sklearn.model_selection import…

【Java Web】JDBC 連接 MySQL 實現數據庫 CRUD(增刪改查)詳解

在 Java Web 開發中,與數據庫交互是不可避免的,而 JDBC(Java Database Connectivity) 是 Java 官方提供的標準數據庫連接接口,幾乎所有 Java 項目中都用過它。 本文通過一個完整示例,帶你從零實現 增&#…

HTTP 請求返回狀態碼和具體含義?200、400、403、404、502、503、504等

HTTP 狀態碼是服務器對客戶端請求的響應狀態標識,分為五大類(以第一位數字區分),常用狀態碼如下: 1. 信息類(1xx):請求已接收,繼續處理 100 Continue:服務器已…