Linux 孤儿进程 (Orphan Process)

在这里插入图片描述


在这里插入图片描述


🎁个人主页:工藤新一¹

🔍系列专栏:C++面向对象(类和对象篇)

🌟心中的天空之城,终会照亮我前方的路

🎉欢迎大家点赞👍评论📝收藏⭐文章


文章目录

  • 孤儿进程
    • 一、核心定义
    • 二、 产生过程与内核的应对机制
    • 三、孤儿进程 vs. 僵尸进程
    • 四、总结与要点

孤儿进程

一、核心定义

孤儿进程是指在父进程执行完毕并终止后,其仍然还在运行的一个或多个子进程。

简单来说,就是一个孩子还在,但它的父母已经不在了。

  • ⽗进程如果提前退出,那么子进程后退出,进⼊“Z”状态后,那该如何处理呢?
  • 父进程先退出,子进程就称之为 “孤儿进程”
  • 孤儿进程被1号 systemd 进程领养

在这里插入图片描述


二、 产生过程与内核的应对机制

孤儿进程的产生是一个自然的过程,但操作系统(内核)有一个非常重要的机制来妥善处理它,以避免资源泄露

  1. 正常情况:一个父进程创建了一个或多个子进程。在理想情况下,父进程应该使用 wait()waitpid() 系统调用来等待其子进程结束,从而回收子进程的退出状态和资源(主要是进程描述符 task_structPCB 中的其他信息)。这样可以避免产生僵尸进程(Zombie Process)。
  2. 异常情况:如果父进程先于其子进程终止了,会发生什么?
    • 这些子进程瞬间就变成了“孤儿”。
    • 内核深知不能对这些孤儿坐视不管。如果没人回收它们,它们终止后会永远变成僵尸,占用系统资源。
    • 为了解决这个问题,内核会强制地将 systemd 进程(PID 1) 设置为这些孤儿进程的新父进程。这个过程称为“重新收养”(re-parenting)。

systemd(init) 进程是什么?
Init 进程是系统启动后由内核创建的第一个用户进程。它非常特殊:

  • 它的 PID 永远是1。
  • 它是所有用户进程的祖先。
  • 它永远不会终止,会一直运行直到系统关闭。
  • 它的一个核心职责就是收养系统中的所有孤儿进程,并负责等待它们结束。

在这里插入图片描述


在这里插入图片描述


问题1:为什么父进程很少被描述为 孤儿/僵尸进程?

因为父进程也有其自己的父进程:bash;父进程随便退出,bash 进程会自动对其回收


问题2:进程变为孤儿进程后,会直接被系统领养,会自动成为后台进程

将进程放到后台(Background) 运行:./cmd &

  • ./cmd:执行当前目录下的一个名为 cmd 的可执行文件
  • &(按位与):一个控制操作符(control operator),它告诉 Shell(如 Bash)不要等待命令 ./cmd 结束,而是立即返回一个提示符,并让 ./cmd 在后台继续运行

此时,我们无法使用 Ctrl + C kill 掉进程(后台进程)

在这里插入图片描述

只能通过远端 kill -9 pid 杀死当前进程


三、孤儿进程 vs. 僵尸进程

这是一个非常重要的区别,经常被一起讨论和比较:

特征孤儿进程 (Orphan Process)僵尸进程 (Zombie Process)
定义活着的进程,但其父进程已死。已终止的进程,但其父进程未回收它。
状态仍然是 TASK_RUNNINGTASK_INTERRUPTIBLE活动状态处于 EXIT_ZOMBIE 状态。已经死了,但在进程表中仍保留一个条目。
危害无害。内核机制(systemd 收养)确保了它终止后会被正常回收。有害。占用内核进程表 slot(资源泄露),如果过多会导致无法创建新进程。
成因父进程先于子进程终止。父进程未调用 wait() 系列函数,且父进程还活着(或者异常崩溃未来得及回收)。
解决方式无需手动解决,由内核自动处理。需要让父进程调用 wait() 来回收,或者终止父进程(此时僵尸会被init回收)。

四、总结与要点

  1. 孤儿进程是活进程:它还在运行,只是父亲没了。
  2. 内核安全网:内核通过让 init 进程(PID 1)自动收养所有孤儿进程来避免问题。这是一个关键的设计,保证了系统的健壮性。
  3. 无害性:孤儿进程本身不是一个问题或 bug,它是一种被系统妥善管理的正常状态。当一个孤儿进程最终终止时,它的养父init进程会自动为它调用 wait(),从而回收其资源,它不会变成僵尸
  4. 与僵尸进程的区别:最关键的区别在于是死是活。孤儿是“活孤儿”,僵尸是“死僵尸”。僵尸进程才是需要开发者警惕和避免的资源泄露问题。

在这里插入图片描述

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

🌈 愿各位心中所想,终有所致!

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

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

相关文章

Linux Tun/Tap 多队列技术

🔥 Linux Tun/Tap 多队列技术 引用:Linux tun/tap 驱动多队列模式(C/C) 📖 引言 Tun/Tap 是 Linux 内核提供的虚拟网络设备,广泛应用于 VPN、虚拟化、网络隧道等领域。传统单队列模式在高吞吐量场景下存…

docker 启动一个clickhouse , docker 创建ck数据库

1. 拉镜像:docker pull clickhouse/clickhouse-server2. 创建容器并且启动命令:docker run -d --name clickhouse-server \-p 8123:8123 -p 9000:9000 \clickhouse/clickhouse-server3. 日志文件的映射,可以自己配置下,目前创建的…

合约服务架构-OOP 方式

文章目录前言🎯 经典的面向对象编程!1. 🏗️ **封装 (Encapsulation)**2. 🧬 **继承 (Inheritance)**3. 🎭 **多态 (Polymorphism)**4. 🎨 **抽象 (Abstraction)**🏛️ 设计模式的应用1. **工厂…

C# 生成器模式(一个投资跟踪程序)

一个投资跟踪程序 我们考虑一个稍微简单一点的例子,在这个例子中,用一个类构造一个用户界面。假设我 们要编写一个程序来跟踪投资的效益。我们有股票、债券和基金等投资项目,对每一种投资项 目都要显示持有量的列表,这样就能够选择…

【DBCExcelConvent】CAN报文解析辅助工具之DBC与Excel互转

前言 CAN总线翻译文件DBC是整车解析过程中非常核心的一部分,因此为了能被各大CAN工具解析,它也有自己的一套编码规则。但并不是无时无刻都有条件打开该文件,对于工程师而言。其实比较直观和通用的大多数还是Excel表格。因此,为了打…

如何将iPhone日历传输到电脑

iPhone日历是i设备上一个非常出色的内置应用程序,可以帮助你创建、查看和管理日程或事件。对于所有iPhone用户来说,在iPhone日历上添加新事件非常容易。然而,当涉及到将日历从iPhone传输到电脑时,许多人可能会感到困惑&#xff0c…

TDengine 3.3.7.0 新增性能基准工具 taosgen

taosgen 工具参考手册 taosgen 是时序数据领域产品的性能基准测试工具,支持数据生成、写入性能测试等功能。taosgen 以“作业”为基础单元,作业是由用户定义,用于完成特定任务的一组操作集合。每个作业包含一个或多个步骤,并可通…

模式组合应用-组合模式

写在前面Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正! 本文为设计模式间的组合使用,涉及代码较多,个人觉得熟能生巧,希望自己能从中学习到新…

在Ubuntu中安装配置MySql Server

1.安装MySql Server在命令行控制台执行安装命令:sudo apt install mysql-server安装完成后,因为没有root用户的密码,所以,登录不了mysql的cli。另外,MySql 8以上,lower-case-table-names默认值0&#xff0c…

Docker 40个自动化管理脚本-1 (20/40)

文章目录1. 自动化容器创建脚本2. 批量启动所有容器3. 批量停止运行中容器#!/bin/bash4. 批量删除停止的容器5. 运行容器并在退出后自动清理6. 自动重启关键容器7. 容器资源监控脚本8. 监控所有容器资源使用9. 检查所有容器日志10. 清理未使用资源脚本11. 删除悬空镜像12. 容器…

Go学习1:常量、变量的命名

golang 安装 | go-zero Documentation 在这个文档里,环境变量系统自动配好了(自定义的一样)不需要修改环境变量。 我下载的是1.25版本的。 目前使用go mod管理项目。 C的产出比太低,而Java和C#哲学又来源于C。 Go语言成功的项目…

2025_WSL2_Ubuntu20.04_C++20_concept 环境配置

需要使用 c20 新特性 concept 泛型约束 记录如何在 wsl2 里面配置环境,如果需要源工程,可以私发 背景:使用 CMakeLists.txt 配置整个工程 从官网 https://gcc.gnu.org/projects/cxx-status.html#cxx20 可以看到 concept 受 g10 支持这里注意虽…

Encoder编码器

Encoder编码器 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out){int ret -1;ret avcodec_send_frame(ctx, frame);if(ret <…

微服务-ruoyi-cloud部署

微服务 阿里 阿里nacos 注册中心&#xff0c;配置中心 spring cloud gateway网关 公共服务 阿里sentinel 面向分布式、多语言异构化服务架构的流量治理组件 阿里seata 是一款开源的分布式事务解决方案 nginx 静态资源服器 反向代理 ruoyi-cloud部署架构 VM配置 网…

Win7能看到Win10打印机但连接不上

解决方案&#xff1a;方法1.修改注册表&#xff08;适用于错误代码0x0000011b&#xff09;修改注册表&#xff08;关键步骤&#xff09;&#xff1a;许多情况下&#xff0c;这是由于Win10的一项隐私设置导致的1。在Win10电脑上&#xff0c;按 Win R&#xff0c;输入 regedit 并…

如何构建灵活、可控、可扩展的多云网络底座

在 AI 和数字化的浪潮中&#xff0c;越来越多的企业不再满足于单一云环境&#xff0c;而是同时使用 多家公有云、自建IDC、甚至边缘节点。这种多云模式虽然灵活&#xff0c;但也带来了一个新的挑战&#xff1a;如何让跨云、跨地的数据流动变得高效、安全、可控&#xff1f;答案…

幂等性设计艺术:在分布式重试风暴中构筑坚不可摧的防线

幂等性设计艺术&#xff1a;在分布式重试风暴中构筑坚不可摧的防线​​2023年某支付平台凌晨故障​​&#xff1a;由于网络抖动导致支付指令重复发送&#xff0c;系统在2分钟内处理了​​17万笔重复交易​​&#xff0c;引发​​4.2亿资金风险​​。事故根本原因&#xff1a;​…

从零开始理解NDT算法的原理及应用

1. 概述 NDT&#xff0c;全称 Normal Distributions Transform&#xff08;正态分布变换&#xff09;&#xff0c;是一种广泛使用的点云配准算法&#xff0c;它的核心思想与ICP截然不同&#xff1a;NDT不直接计算点与点之间的对应关系&#xff0c;而是通过概率模型来描述和匹配…

艾体宝案例 | 数据驱动破局:DOMO 如何重塑宠物零售门店的生存法则

某连锁宠物店店长紧盯着电脑屏幕上的Excel表格&#xff0c;手指机械地在键盘上敲击出“CtrlC/V”的组合键——这是她第17次尝试将三个不同系统的数据拼凑到一起。门店POS机导出的销售记录、会员系统的消费偏好、库存管理的临期预警&#xff0c;这些本应串联起门店运营全貌的关键…

极飞科技AI智慧农业实践:3000亩棉田2人管理+产量提15%,精准灌溉与老农操作门槛引讨论

在新疆尉犁县的棉田里&#xff0c;两架农业无人机正沿着设定航线低空飞行&#xff0c;它们掠过之处&#xff0c;传感器实时传回土壤湿度和作物长势数据——这片3000亩的棉田&#xff0c;如今只需要两名90后新农人通过手机管理&#xff0c;产量却比传统种植模式提高了15%。这不是…