聊聊僵尸进程

news2024/11/16 22:00:35

文章目录

  • 1. 前言
    • 1.1 什么是僵尸进程
    • 1.2 为什么需要关注僵尸进程
  • 2. 僵尸进程的产生
    • 2.2 为什么会产生僵尸进程
    • 2.3 举个栗子
  • 3. 僵尸进程的影响
    • 3.1 僵尸进程为何会占用系统资源
    • 3.2 操作系统如何知道哪个资源需要被释放
    • 3.3 什么是进程表
    • 3.4 什么是PCB
  • 5. 如何处理僵尸进程
    • 4.1 识别僵尸进程
      • 第一种方法
      • 第二种方法
    • 4.3 清理僵尸进程
      • 1. 找到僵尸进程的父进程ID(PPID)
      • 2. 向父进程发送`SIGCHLD`信号
  • 6. 实例分析
  • 7. 参考文档

1. 前言

1.1 什么是僵尸进程

僵尸进程,也被称为"defunct process" 我们在看国外的一些博客的时候会发现僵尸进程又称为 Zombie Processes
它是一种已经终止但是仍然在进程表中存在的进程。这种情况通常发生在父进程还没有来得及读取子进程的退出状态,而子进程已经结束,这样子进程虽然已经结束,但是在操作系统中仍然保留了相关记录。
《Processes in a Zombie (Z) or Defunct State》
《How to Clean a Linux Zombie Process》

1.2 为什么需要关注僵尸进程

僵尸进程可能会导致一些问题。首先,它们占用了系统资源。虽然僵尸进程自身已经不再运行,但是它在进程表中的记录仍然会占用系统资源,如果有大量的僵尸进程,可能会消耗掉所有的进程表空间,导致无法创建新的进程。其次,僵尸进程可能会影响到其他进程的运行,特别是那些需要读取进程状态或者和已经终止的进程进行交互的进程。因此,对于僵尸进程,我们需要及时处理,避免它们引起更大的问题。

2. 僵尸进程的产生

2.2 为什么会产生僵尸进程

在操作系统中,僵尸进程是指原本已经结束运行并退出的进程,但是它在系统的进程表中仍然保留有记录。这种情况通常有以下几种可能:

  1. 父进程没有调用wait()或waitpid()来获取子进程的结束状态。当子进程结束运行后,系统会向父进程发送一个SIGCHLD信号。如果父进程没有处理这个信号或者没有正确地获取子进程的结束状态,那么子进程就会变成僵尸进程。

  2. 父进程在子进程结束之前就已经结束了。这种情况下,子进程会被init进程接管,init进程会定期调用wait()来回收这些僵尸进程。

  3. 父进程由于某种原因没有接收到SIGCHLD信号,例如父进程正在执行一个长时间的任务或者被阻塞了。这种情况下,子进程的结束状态就无法被父进程获取,导致子进程成为僵尸进程。

通俗的说,僵尸进程主要是由父进程没有正确处理子进程的结束状态造成的。虽然僵尸进程自身不会消耗除了进程表之外的其他资源,但是如果有大量的僵尸进程存在,那么进程表的空间就会被耗尽,新的进程将无法创建,对系统性能会有影响。

2.3 举个栗子

在这里插入图片描述

举例来说,假设有一个父进程P,它创建了一个子进程C。现在子进程C执行了一些任务后完成了。这时,内核发送一个SIGCHLD信号给父进程P,通知它子进程C已经完成了任务。

如果父进程P在创建子进程C时已经编程执行wait()系统调用,那么父进程P会接收到SIGCHLD信号后,执行wait()系统调用,读取子进程C的状态和退出码,并同时清除子进程C在进程表中的记录。

但是,如果父进程P在创建子进程C时没有编程执行wait()系统调用,那么它就无法读取子进程C的状态和退出码,也无法清除子进程C在进程表中的记录。这就导致子进程C虽然已经完成了任务,但是它的僵尸状态还是留在进程表中,显示为一个僵尸进程。

另外,如果父进程P在接收到SIGCHLD信号时,由于某种原因(比如过载等)无法处理该信号,那么这也会导致子进程C变成一个僵尸进程。

这些僵尸进程会占用系统资源,虽然它们不再执行任何任务,但是它们在进程表中的记录仍然存在。这可能会导致系统资源的浪费,甚至在极端情况下,可能因为进程表已满而无法再创建新的进程。

3. 僵尸进程的影响

3.1 僵尸进程为何会占用系统资源

每个进程结束时,都会产生一个退出状态,这个状态需要被它的父进程来回收。在父进程回收这个状态之前,系统会保留一部分信息(比如进程ID、进程状态和退出码等),这样父进程就可以知道其子进程结束的详细情况。这部分信息是存放在系统内存中的,因此结束的进程直到被其父进程回收之前都会占用一些内存资源。

这就是为何僵尸进程会占用系统资源的底层原理。僵尸进程就是已经结束,但是其父进程还未回收其状态的进程,因此它们还会占用一部分系统资源。

在Linux系统中,如果父进程没有回收子进程的状态,内核会把这个任务交给init进程(进程ID为1的进程)来完成。这就是为什么在系统中看到的大部分僵尸进程其父进程ID都是1的原因。

在多任务环境下,如果僵尸进程过多,理论情况下可能会导致进程表已满,从而无法创建新的进程,影响到其他任务的正常进行。看清楚是理论情况下,其实在进程表沾满之前其他资源肯定已经耗尽了已经不可能分配进程了。此外,僵尸进程还可能导致系统响应时间变慢,因为系统需要花费更多的时间来处理并不需要的进程,这对于需要快速响应的系统来说是非常不利的。同时,僵尸进程占用的内存资源也可能导致其他需要更多内存的任务无法得到足够的内存资源,从而影响其性能。

3.2 操作系统如何知道哪个资源需要被释放

这就不得不说 操作系统两个相关的概念 进程表和PCB
进程表是操作系统中管理进程的数据结构之一。它是一个存储所有进程信息的表格,每个进程在表格中都有一个对应的表项。而操作系统通过进程控制块(Process Control Block, PCB)来记录和管理系统中的各个进程。

每个进程有自己的PCB,它包含了这个进程的所有重要信息,如进程状态、程序计数器、CPU寄存器和堆栈指针、优先级、内存分配状况、资源状态、I/O状态等信息。

当一个进程结束的时候,操作系统会根据该进程的PCB中记录的信息,来知道需要释放哪些资源,例如内存资源、I/O设备等。

操作系统还会通过一些内部的数据结构来记录资源的使用情况,例如内存管理子系统会用位图或者链表来记录内存的分配情况,文件系统会用索引节点(inode)来记录文件的分配情况等。这些都可以帮助操作系统了解哪些资源正在被使用,哪些资源已经空闲,从而在需要的时候正确地释放或者分配资源。

3.3 什么是进程表

进程表是操作系统内核内部的一种数据结构,用于跟踪和管理系统中的所有进程。每当创建一个新的进程时,操作系统就会在进程表中为其分配一个新的条目。
在这里插入图片描述

进程表中的每个条目通常包含以下信息

信息类别详细描述
进程ID(PID)每个进程的唯一标识符
状态进程的当前状态(如运行、就绪、阻塞等)
优先级进程的调度优先级
所有者创建该进程的用户或者进程的用户ID
进程计数器记录了进程下一条要执行的指令的地址
CPU寄存器保存了进程上下文切换时的CPU寄存器状态
内存管理信息记录了进程的内存布局以及进程使用的虚拟内存和物理内存等信息
文件描述符表记录了进程打开的所有文件和网络套接字
执行环境如环境变量等

进程表对于操作系统来说极为重要,是实现多任务和进程隔离等核心功能的关键。进程表的主要作用是帮助操作系统管理和调度进程。具体来说,它有以下几个作用:

  1. 进程调度:操作系统根据进程表中的信息(如进程状态、优先级等)来决定下一个要运行的进程。

  2. 进程管理:操作系统通过进程表来跟踪每一个进程的状态,如运行、就绪、阻塞等。

  3. 上下文切换:当CPU从一个进程切换到另一个进程时,操作系统会保存当前进程的状态到进程表,并从进程表中恢复新的进程的状态。

  4. 内存管理:操作系统根据进程表中的信息来管理进程的内存分配,包括虚拟内存和物理内存。

  5. 文件系统管理:操作系统通过进程表中的文件描述符表来跟踪每个进程所打开的文件和网络套接字。

  6. 资源管理:操作系统使用进程表来管理和跟踪进程所需的其他系统资源,如I/O设备、信号量、消息队列等。

3.4 什么是PCB

PCB,全称为Process Control Block,中文名为进程控制块。它是操作系统中一个非常重要的数据结构,用于保存和描述一个进程的基本信息和运行状态。
通俗的说,PCB就是操作系统对进程的一种抽象,它包含了操作系统管理和控制进程所需要的所有信息。
在这里插入图片描述

PCB的主要作用如下

  1. 进程调度:在多道程序设计中,操作系统需要进行进程的调度和切换,PCB中保存的进程状态和调度信息(例如进程优先级)可以帮助操作系统做出决策。

  2. 进程同步和通信:PCB中保存了进程的同步和通信机制(比如信号量等),帮助实现进程间的协调运行。

  3. 进程管理:通过PCB,操作系统可以对进程进行管理和控制,如创建、终止进程,修改进程的状态等。

  4. 资源管理:PCB中保存了进程的资源使用情况(比如CPU时间、内存空间等),可以帮助操作系统进行资源的分配和回收。

5. 如何处理僵尸进程

4.1 识别僵尸进程

识别僵尸进程的方法是使用ps命令。在查看僵尸进程时,只需要关注STAT列的值是否为Z

第一种方法

  1. 查看所有进程的状态:
$ ps aux

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  16444  2580 ?        Ss   Jan21   0:02 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jan21   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jan21   0:01 [ksoftirqd/0]
...
user     32345  0.0  0.1  34364  2928 pts/1    Z    01:30   0:00 [myprocess] <defunct>
...

在上面的输出中,STAT列的值为Z的进程(如PID为32345的进程)就是僵尸进程。

第二种方法

  1. 也可以使用以下命令直接列出所有僵尸进程:
$ ps aux | grep -w Z

输出示例:

user     32345  0.0  0.1  34364  2928 pts/1    Z    01:30   0:00 [myprocess] <defunct>

这条命令会过滤出所有STAT列值为Z的进程。

4.3 清理僵尸进程

要清理僵尸进程,需要向其父进程发送SIGCHLD信号以通知它回收子进程。通常情况下,父进程会在子进程结束时自动回收它。但在某些情况下,父进程可能没有正确地回收子进程,导致子进程成为僵尸进程。下面是清理僵尸进程的方法:

1. 找到僵尸进程的父进程ID(PPID)

$ ps -el | grep -w Z

输出

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 Z  1000 32345  1001  0  80   0 -     0 exit   pts/1    00:00:00 myprocess <defunct>

2. 向父进程发送SIGCHLD信号

$ kill -s SIGCHLD 1001

这将通知进程1001回收其子进程。

  1. 如果向父进程发送SIGCHLD信号后,僵尸进程仍未被清理,那么可以尝试杀死父进程。这样,僵尸进程将被init进程(PID为1)接管并自动清理。
    $ kill -s SIGTERM 1001
    

6. 实例分析

《How to Clean a Linux Zombie Process》 https://www.baeldung.com/linux/clean-zombie-process

7. 参考文档

https://www.geeksforgeeks.org/process-table-and-process-control-block-pcb/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法设计与分析】— —实现活动安排问题的贪心算法。

&#x1f383;欢迎大家前去观看我的算法设计与分析专栏&#xff1a; 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助&#xff01; &#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java…

现场大屏互动游戏微信上墙“摇一摇”全攻略

随着科技的发展&#xff0c;现场活动越来越依赖数字互动来提升参与度和气氛。其中&#xff0c;现场大屏互动游戏微信上墙“摇一摇”是一种非常受欢迎的方式&#xff0c;它能有效地提升现场观众的参与度和活跃度。本文将为您提供从准备到实施的全程攻略&#xff0c;帮助您轻松掌…

打印字节流和字符流

打印字节流和字符流 printStream/ printWriter的构造器和方法都是一样的 package printfile;import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.nio.charset.Charset;public class Prin…

如何使用potplayer在公网访问群晖webdav?

把potplayer变成netflix需要几步&#xff1f; ​ 国内流媒体平台的内容让人一言难尽&#xff0c;就算是购买了国外的优秀作品&#xff0c;也总是在关键剧情上删删减减&#xff0c;就算是充了会员&#xff0c;效果如何&#xff1f; 广大网友不得不选择自己找资源下到本地&#x…

戏剧影视设计制作虚拟仿真培训课件提升学生的参与感

说起影视制作&#xff0c;知名的影视制片人寥寥无几&#xff0c;大多数人还在依靠摄影机拍摄实景或搭建实体场景来不断精进场景布局和导演效果&#xff0c;成本高、投入人员多且周期长&#xff0c;随着VR虚拟现实技术的不断发展&#xff0c;利用VR模拟仿真技术进行影视制作实操…

【FreeRTOS】【STM32】01从零开始的freertos之旅 浏览源码下的文件夹

基于野火以及正点原子 在打开正点原子的资料pdf时&#xff0c;我遇到了pdf无法复制粘贴的问题&#xff0c;这里有个pdf解锁文字复制功能的网址&#xff0c;mark一下。超级pdf 参考资料《STM32F429FreeRTOS开发手册_V1.2》 官方资料 FreeRTOS 的源码和相应的官方书籍均可从官…

【AI】深度学习——人工智能、深度学习与神经网络

文章目录 0.1 如何开发一个AI系统0.2 表示学习(特征处理)0.2.1 传统特征学习特征选择过滤式包裹式 L 1 L_1 L1​ 正则化 特征抽取监督的特征学习无监督的特征学习 特征工程作用 0.2.2 语义鸿沟0.2.3 表示方式关联 0.2.4 表示学习对比 0.3 深度学习0.3.1 表示学习与深度学习0.3.…

vue2踩坑之项目:Swiper轮播图使用

首先安装swiper插件 npm i swiper5 安装出现错误&#xff1a;npm ERR npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: vue/eslint-config-standard6.1.0 npm ERR! Found: eslint-plugin-vue8.7.1 npm ERR! node_modules/esl…

数据结构与算法(七):搜索算法

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 二分查找 二分查找&#xff08;binary search&#xff09;是一种基于分治策略的高效搜索算法。它利用数据的有序性&#xff0c;每轮减少一半搜索范围&#xff0c;直至找到目标元素或搜索区间为空为止 给定一个长度为 n 的…

WebDAV之π-Disk派盘 + 咕咚云图

咕咚云图是一款强大的图床传图软件,它能够让您高效地对手机中的各种图片进行github传输,多个平台快速编码上传,支持远程删除不需要的图片,传输过程安全稳定,让您可以很好的进行玩机或者其他操作。 可帮你上传手机图片到图床上,并生成 markdown 链接,支持七牛云、阿里云…

SRM系统快速便捷退货的解决方案

一、SRM系统简介&#xff1a; SRM系统是一种基于互联网技术的供应链管理解决方案&#xff0c;旨在加强供应商与采购商之间的合作关系&#xff0c;优化供应链的效率和可靠性。它提供了一系列功能模块&#xff0c;包括采购管理、供应商管理、订单管理、物流管理等。其中&#xf…

平衡小车调车保姆式教程

前言 &#xff08;1&#xff09;硬件选型注意点&#xff1a;电机转速、轮子大小 &#xff08;2&#xff09;车模硬件结构注意点&#xff1a;车模整体的重量要分布均匀&#xff0c;利于平衡 &#xff08;3&#xff09;硬件主要模块&#xff1a;陀螺仪、编码器电机、显示屏、驱动…

ElasticSearch搜索引擎:数据的写入流程

一、ElasticSearch 写数据的总体流程&#xff1a; &#xff08;1&#xff09;ES 客户端选择一个节点 node 发送请求过去&#xff0c;这个节点就是协调节点 coordinating node &#xff08;2&#xff09;协调节点对 document 进行路由&#xff0c;通过 hash 算法计算出数据应该…

设计模式 - 结构型模式考点篇:适配器模式(类适配器、对象适配器、接口适配器)

目录 一、适配器模式 一句话概括结构式模式 1.1、适配器模式概述 1.2、案例 1.2.1、类适配器模式实现案例 1.2.2、对象适配器 1.2.3、接口适配器 1.3、优缺点&#xff08;对象适配器模式&#xff09; 1.4、应用场景 一、适配器模式 一句话概括结构式模式 教你将类和对…

剑指offer——JZ68 二叉搜索树的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q&#xff0c;最近公共祖先LCA(T,p,q)表示一个节点x&#…

头戴式耳机哪个牌子音质好?Y2K的福音!Umelody轻律 U1头戴式耳机分享

作为一款国产头戴式蓝牙耳机&#xff0c;Umelody轻律 U1绝对是性价比之选&#xff0c;可以说是Y2K的福音&#xff0c;复古味十足的设计&#xff0c;快捷方便的蓝牙连接和多功能实用的操作方式&#xff0c;最关键的还是价格低&#xff0c;300元的价格不到就可以拿下。 创始团队…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是&#xff1a;部署在去中心化区块链上的一个合约或者一组指令&#xff0c;当这个合约或者这组指令被部署以后&#xff0c;它就不能被改变了&#xff0c;并会自动执行&#xff0c;每个人都可以看到合约里面的条款。更深层次的理解就是&#xff1a;这些代码会…

vue实现自定义滚动条

vue实现自定义滚动条 具体效果如下&#xff0c;这边我用的rem单位&#xff0c;比例是1:40&#xff0c; 先写下页面布局&#xff0c;把原生的滚动条给隐藏掉&#xff0c;给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…

基于spso算法的航线规划

matlab2020a GitHub - duongpm/SPSO: Spherical Vector-based Particle Swarm Optimization

智能集成式电力电容器在山东某环保材料制造厂中的应用-安科瑞黄安南

摘要 分析智能集成式电力电容的工作原理及功能&#xff0c;结合山东环保材料制造厂配电现状&#xff0c;选择经济可靠的方案&#xff0c;智能电容过零投切与低功耗&#xff0c;解决了继电器投切产生涌流的问题&#xff1b;接线简单&#xff0c;扩容方便&#xff0c;解决无功补…