Linux基础之僵尸进程与孤儿进程

news/2024/9/22 19:57:24/

目录

一、僵尸进程

1.1 什么是僵尸进程

1.2 为什么要有僵尸状态

1.3 观察我们的僵尸状态

1.4 关于僵尸进程的小Tip

二、孤儿进程

2.1 什么是孤儿进程


一、僵尸进程

1.1 什么是僵尸进程

       在上一篇文章中,我们有提到过进程的死亡状态的概念,而我们的进程在其真正死亡之前还会有一个状态,叫做僵尸状态。

这里再给大家具体介绍一下什么是僵尸状态:

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

1.2 为什么要有僵尸状态

       首先问一个问题,为什么我们要创建一个进程呢??
       一定是因为我们要完成某种任务。那我们又怎么知道,我们的进程把任务完成的怎么样呢?
      那么就一定需要我们的进程在退出时,返回一些信息,去表明自己把任务完成得怎么样。所以在当一个进程退出时,其退出信息会由我们的OS写入到我们程序对应的PCB中,这个时候可以允许我们的进程的代码和数据空间被释放,但是不能允许进程的PCB被立即释放,进程退出了,但是还没有被父进程或者我们的OS所读取,那么我们的OS就必须维护这个PCB,而在我们的PCB在被释放之前就会一直处于我们的Z状态。

1.3 观察我们的僵尸状态

先写这样一段代码:

然后我们来观察一下子进程的状态。

这里可以很清楚的观察到,当我们的子进程结束后,由于我的父进程还在跑,也没对子进程进行回收,可以看到我们的子进程处在Z+的状态,这也印证了我们所说。

1.4 关于僵尸进程的小Tip

       如果我们的进程进入到了我们的Z状态,但是我们的父进程由于某些原因一直没有去回收它,这个时候如果我们没有及时的去回收我们的它,就会导致其在内存中一直占据着一段空间,造成我们的内存泄漏。

二、孤儿进程

2.1 什么是孤儿进程

       当一个子进程还没有退出,没有被父进程回收。而我们的父进程就已经先退出了,这样的子进程我们称之为孤儿进程。

       那孤儿进程我们就不管了吗,肯定不可能,因为如果我们不去管理我们的孤儿进程,由于其没有父亲去给它“收尸”,使得其一直在我们的内存上占据着一定的空间,造成我们的内存泄漏,这种现象越积越多的话,最后很可能会导致我们的操作系统崩溃。
       所以,当一个进程成为孤儿进程时,OS就会给其找一个“干爹”,去回收它的资源。这里给大家看一下孤儿进程,同样先编写一段代码:

       可以看到这段代码,父进程在子进程还没结束的时候就已经退出且回收,然我们观察一下其父进程会变成什么。

       可以看到,当我们的父进程没了之后,我们的子进程从一个前台进程变成了一个后台进程,同样其父进程的PID变成了 1,那么这个1是谁呢,其实就是我们的操作系统,这也说明了,这个找的“干爹”其实就是OS它自己。


http://www.ppmy.cn/news/1462035.html

相关文章

鸿蒙开发接口Ability框架:【ApplicationContext】

ApplicationContext ApplicationContext模块提供开发者应用级别的的上下文的能力,包括提供注册及取消注册应用内组件生命周期的监听接口。 说明: 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-shizhen-skin/harmony-os/blob/master/README.m…

二次开发接口验证

二次开发接口验证通常涉及到几个关键步骤,以确保安全、有效且高效的数据交互。 这包括但不限于API密钥验证、请求参数验证、用户身份验证以及响应数据验证。 以下是一些基本的验证措施: 1. API密钥验证: 开发者需要从服务提供商那里获取一…

Spring中拦截器的使用

在Spring框架中,拦截器(interceptor)是一种用于拦截请求的组件,可以在请求处理的前后进行一些额外的处理。拦截器可以用于实现日志记录、权限验证、参数校验等功能。 在Spring中,拦截器是通过实现HandlerInterceptor接…

跨平台移动应用开发指南:打造跨越iOS和Android的移动应用

跨平台移动应用开发已经成为许多开发者的首选,因为它可以节省时间、成本和精力,同时使得应用能够覆盖更广泛的用户群体。本指南将介绍跨平台移动应用开发的基本概念、流行的跨平台框架以及一些最佳实践,帮助您快速入门并打造出高质量的跨平台…

springcloud+nocos从零开始

首先是去nacos官网下载最新的包&#xff1a;Nacos 快速开始 | Nacos win下启动命令&#xff1a;startup.cmd -m standalone 这样就可以访问你的nacos 了。 添加一个配置&#xff0c;记住你的 DataId,和Group名字。 创建一个pom项目&#xff0c;引入springCloud <?xml ve…

[muduo网络库]——使用muduo库搭建Echo服务器(剖析muduo网络库核心部分、设计思想)

在此之前&#xff0c;我们对于muduo库的每一类几乎都进行了逐行的分析&#xff0c;但是一个网络库的每个模块之间总是有千丝万缕的关系&#xff0c;所以可能有的地方还是有分析的不到位&#xff0c;所以从这一篇开始&#xff0c;我们从muduo的简单使用----搭建一个Echo服务器&a…

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…

Leetcode—2244. 完成所有任务需要的最少轮数【中等】

2024每日刷题&#xff08;136&#xff09; Leetcode—2244. 完成所有任务需要的最少轮数 实现代码 class Solution { public:int minimumRounds(vector<int>& tasks) {unordered_map<int, int> map;for(int task: tasks) {map[task];}int ans 0;// freq 1 …