Linux 進程狀態 — 僵尸進程

在這里插入圖片描述


在這里插入圖片描述


🎁個人主頁:工藤新一1

🔍系列專欄:C++面向對象(類和對象篇)

🌟心中的天空之城,終會照亮我前方的路

🎉歡迎大家點贊👍評論📝收藏?文章


文章目錄

  • 進程狀態 — 僵尸進程
    • 一、進程狀態 — Zombies
    • 二、僵尸進程
      • 2.1 什么是僵尸進程?
      • 2.2 為什么會有僵尸進程?
      • 2.3 僵尸進程的危害?
      • 2.4 如何產生一個僵尸進程?
      • 2.5 如何清除僵尸進程?
      • 2.6 如何避免僵尸進程?

進程狀態 — 僵尸進程

一、進程狀態 — Zombies

  • Z (Zombies):進程已經執行完畢并終止了,但其父進程還沒有調用 wait()waitpid() 系統調用來回收它子進程退出狀態信息。此時,這個已經死亡的進程就成為了 “僵尸進程”
  • 重要:僵尸進程已經不占用任何內存或CPU資源,它僅僅在進程表中保留一個入口,記錄其退出狀態,供父進程查詢。如果父進程一直不回收,它就會一直存在 -(僵死進程會以終?狀態保持在進程表中,并且會?直在等待父進程讀取退出狀態代碼)
  • 所以,只要子進程退出,父進程還在運行,但父進程沒有讀取子進程狀態,子進程進入 Z(Zombies) 狀態

二、僵尸進程

2.1 什么是僵尸進程?

故事插入:

在這里插入圖片描述

如上所述,僵尸進程是一個已經終止但尚未被其父進程回收的進程。


2.2 為什么會有僵尸進程?

這是Unix系統進程狀態設計的一部分。設置僵尸狀態是為了維護進程的退出信息,以便父進程能夠查詢子進程是如何死掉的(是正常退出還是被信號殺死?退出碼是多少?)。

只有當父進程讀取了這些信息后,內核才會徹底清除這個僵尸進程。

在這里插入圖片描述


在這里插入圖片描述


1.那些信息:進程退出時,必須要維持進程的基本相關信息(哪些基本信息?),讓父進程得知其退出情況

2.信息存在哪里?當進程退出時,其退出信息是要保存在 task_struct 中(因為代碼、數據已經被釋放了,就只剩下 PCB 了),必須維持PCB(操作系統中的數據結構)。我們可以通過父進程的系統調用獲取到子進程的特殊信息,我們就知道這個進程是因為什么原因而退出的。所以在子進程已經退出之后,父進程沒有獲取子進程的信息之前,這個子進程就是僵尸進程


2.3 僵尸進程的危害?

  • 資源占用:僵尸進程本身不消耗內存和CPU。
  • 主要危害:每個僵尸進程都會在系統的進程表中占用一個槽位(即一個進程ID,PID)。如果系統中存在大量僵尸進程,進程表會被填滿,導致系統無法創建新的進程,從而引發嚴重問題。
  • 內存泄漏問題

2.4 如何產生一個僵尸進程?

一個典型的例子:父進程創建了子進程,但父進程忙于自己的工作,沒有調用 wait() 來等待子進程結束。子進程先于父進程結束,就會變成僵尸。

簡單C代碼示例:

#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>int main () {pid_t child_pid = fork(); // 創建子進程if (child_pid > 0) {// 父進程sleep(60); // 父進程睡眠60秒,而不調用 wait()// 在這60秒內,子進程已經結束,會成為僵尸} else {// 子進程exit(0); // 子進程立即退出}return 0;
}

編譯運行上述程序,在父進程睡眠的60秒內,用 ps aux | grep Z 命令就可以看到狀態為 Z+ 的子進程。

驗證 “Z” 狀態

在這里插入圖片描述

處于僵尸狀態的進程的PCB需一直維護,而PCB本就是一個進程的 task_struct 的對象,這會一直占用內存空間 —— 引發內存泄漏問題!

所以,不是只有 new/malloc 會引起內存泄漏僵尸進程也會引起內存泄漏 —— 解決方法:通過 wait()_pid 的方式等待子進程并獲取子進程退出結果

因此,父進程在未來除了獲取子進程退出信息,還會進入等待模式將子進程的PCB釋放掉 —— 解決內存泄漏問題


2.5 如何清除僵尸進程?

  • 正確方法:讓父進程調用 wait()waitpid() 來回收子進程。
  • 常用方法:如果父進程不回收,最直接的方法就是殺死父進程。父進程被殺后,其所有子進程(包括僵尸進程)會變成“孤兒進程”,被 init 進程(PID=1)收養。init 進程會定期調用 wait(),從而清理這些僵尸進程。
    • 命令:kill <父進程的PID>
  • 警告不要試圖用 kill -9 殺死僵尸進程本身,因為它已經是死掉的進程,信號無法作用在它身上。

2.6 如何避免僵尸進程?

  • 在編寫程序時,父進程應該使用 wait()waitpid() 系統調用來等待子進程結束。
  • 或者,父進程可以捕獲 SIGCHLD 信號(當子進程狀態改變時,內核會向父進程發送此信號),并在信號處理函數中調用 wait()

🌟 各位看官好我是工藤新一1呀~

🌈 愿各位心中所想,終有所致!
在這里插入圖片描述

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

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

相關文章

React 中 key 的作用

React 中 key 的作用是什么&#xff1f; Date: August 31, 2025 Area: 原理key 概念 在 React 中&#xff0c;key 用于識別哪些元素是變化、添加或刪除的。 在列表渲染中&#xff0c;key 尤其重要&#xff0c;因為它能提高渲染性能和確保組件狀態的一致性。key 的作用 1&#x…

wpf之附加屬性

前言 附加屬性是 WPF 中一個非常強大和獨特的概念。簡單來說&#xff0c;它允許一個對象為另一個在其本身類定義中未定義的屬性賦值。 1、定義附加屬性 定義一個Watermark的附加屬性&#xff0c;該屬性的作用是將TextBox的附加屬性改變時&#xff0c;TextBox的字體顏色改成灰…

深入淺出 RabbitMQ-消息可靠性投遞

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】SpringBoot3.X 整合 Mi…

數字化時代,中小企業如何落地數字化轉型

大數據時代&#xff0c;各行各業的行業龍頭和大型集團都已經開始了數據管理&#xff0c;讓數據成為數據資產。但是在我國&#xff0c;中小企業的數量巨大&#xff0c;很多管理者忽視了這一點&#xff0c;今天我們就來聊一聊中小企業的數字化轉型。中小企業需要數字化轉型首先要…

Unity筆記(九)——畫線功能Linerenderer、范圍檢測、射線檢測

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。這里只記錄代碼知識。十一、畫線功能Linerenderer畫線功能Linerenderer是Unity提供的畫線腳本&#xff0c;創建一個空…

刷題記錄(8)string類操作使用

一、僅反轉字母 917. 僅僅反轉字母 - 力扣&#xff08;LeetCode&#xff09; 簡單來說輸入字符串&#xff0c;要求你返回所有僅字母位置反轉后的字符串。 簡單看一個樣例加深理解&#xff1a; 前后互換&#xff0c;我想思路基本很明顯了&#xff0c;雙指針&#xff0c;或者說…

用好AI,從提示詞工程到上下文工程

前言 隨著 AI 大模型的爆發,提示詞工程(prompt engineering ) 一度是用戶應用 AI ,發揮 AI 能力最重要、也最應該掌握的技術。 但現在,在 “提示詞工程”的基礎上,一個更寬泛也更強力的演化概念被提出,也就是本文我們要介紹的 “上下文工程(Context Engineering)” …

計算機Python畢業設計推薦:基于Django+Vue用戶評論挖掘旅游系統

精彩專欄推薦訂閱&#xff1a;在下方主頁&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二、…

? 肆 ? ? 默認安全:安全建設方案 ? a.信息安全基線

&#x1f44d;點「贊」&#x1f4cc;收「藏」&#x1f440;關「注」&#x1f4ac;評「論」 在金融科技深度融合的背景下&#xff0c;信息安全已從單純的技術攻防擴展至架構、合規、流程與創新的系統工程。作為一名從業十多年的老兵&#xff0c;將系統闡述數字銀行安全體系的建設…

如何用AI視頻增強清晰度軟件解決畫質模糊問題

在視頻制作和分享過程中&#xff0c;畫質模糊、細節丟失等問題常常影響觀看體驗。無論是老舊視頻的修復還是低分辨率素材的優化&#xff0c;清晰度提升都成為用戶關注的重點。借助專業的AI技術&#xff0c;這些問題可以得到有效解決。目前市面上存在多種解決方案&#xff0c;能…

Linux92 shell:倒計時,用戶分類

問題 while IFS read -r line;doootweb kk]# tail -6 /etc/passwd user1r4:x:1040:1040::/home/user1r4:/bin/bash useros20:x:1041:1041::/home/useros20:/bin/bash useros21:x:1042:1042::/home/useros21:/bin/bash useros22:x:1043:1043::/home/useros22:/bin/bash useros23…

LinkedList源碼解析

1. 數據結構設計 (1) 節點結構 LinkedList 的核心是雙向鏈表節點 Node&#xff1a; private static class Node<E> {E item; // 存儲的元素Node<E> next; // 后繼節點Node<E> prev; // 前驅節點Node(Node<E> prev, E element, Node<E&g…

語雀批量導出知識庫

使用工具&#xff1a;yuque-dl 參考文檔&#xff1a; GitHub - gxr404/yuque-dl: yuque 語雀知識庫下載 Yuque-DL&#xff1a;一款強大的語雀資源下載工具_語雀文檔怎么下載-CSDN博客

電子電氣架構 --- 當前企業EEA現狀(下)

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

flink中的窗口的介紹

本文重點 無界流會源源不斷的產生數據,有的時候我們需要把無界流進行切分成一段一段的有界數據,把一段內的所有數據看成一個整體進行聚合計算,這是實現無界流轉成有界流的方式之一。 為什么需要窗口 數據是源源不斷產生的,我們可能只關心某個周期內的統計結果。比如電費…

自建es 通過Flink同步mysql數據 Docker Compose

資源es:7.18 kibana:7.18 flink:1.17.2目錄mkdir -p /usr/project/flink/{conf,job,logs} chmod -R 777 /usr/project/flink #資源情況 mysql8.0 Elasticsearch7.18 自建# 目錄結構 /usr/project/flink/ /usr/project/flink/ ├── conf/ │ ├── flink-conf.yaml │ └…

AI瀏覽器和釘釘ONE是不是偽需求?

最近兩則新聞格外引起了我的注意&#xff1a;一是Claude推出了官方瀏覽器插件&#xff0c;二是釘釘發布了釘釘ONE。前者說明AI瀏覽器未必有必要&#xff0c;后者則描繪了一幅“刷刷手機就能完成工作”的未來辦公圖景。這幾天我經常在思考&#xff0c;AI瀏覽器是不是沒有必要&am…

從結構化到多模態:RAG文檔解析工具選型全指南

在RAG系統建設中&#xff0c;文檔解析質量直接決定最終效果上限&#xff0c;選擇合適的解析工具已成為避免"垃圾進&#xff0c;垃圾出"&#xff08;GIGO&#xff09;困境的關鍵決策。一、文檔解析&#xff1a;RAG系統的基石與瓶頸 當前企業知識庫中超過80%的信息存儲…

設計模式:享元模式(Flyweight Pattern)

文章目錄一、享元模式的介紹二、實例分析三、示例代碼一、享元模式的介紹 享元模式&#xff08;Flyweight Pattern&#xff09; 是一種結構型設計模式。通過共享相同對象&#xff0c;減少內存消耗&#xff0c;提高性能。 它摒棄了在每個對象中保存所有數據的方式&#xff0c; 通…

【Go語言入門教程】 Go語言的起源與技術特點:從誕生到現代編程利器(一)

文章目錄前言1. Go語言的起源與發展2. Go語言的核心設計團隊2.1 Ken Thompson&#xff08;肯湯普森&#xff09;2.2 Rob Pike&#xff08;羅布派克&#xff09;2.3 Robert Griesemer&#xff08;羅伯特格瑞澤默&#xff09;設計動機&#xff1a;解決C的痛點3. Go語言的核心特性…