下面是我很久以前在读APUE(《Unix环境高级编程》)对孤儿进程和僵尸进程的理解,为了便于记忆,采用打比方的方式予以解释。 (当然不一定精准,后面我会贴出wikipedia上的专业解释。)

  1. 操作系统OS好比一个公司,公司的CEO就是init进程。
  2. 任何一个子进程都有父进程,就好比任何一个人都有爹。 这里假定子进程为小明,父进程为小明的爸爸。
  3. init进程作为OS公司的CEO,是小明的爷爷(注:小明的爸爸很可能是CEO的第N代后人,N>=1,这里假定N=1)。
  4. 任何一个进程在退出之后都会进入僵死状态,它占有的资源需要交还给操作系统(也就是公司)。
  5. 小明的爷爷跟小明的爸爸有个约定,你要你在,你的儿子你负责,除非你不在了。
  6. 父进程在子进程退出之前退出了,也就是小明还活着,忽然没有爸爸了,于是就成了孤儿(orphan)进程。按照约定,小明(子进程)被小明的爷爷(init进程)收养。
  7. 子进程退出的时候父进程还在,也就是小明没了,小明的爸爸还健在。但是子进程进入僵死状态,父进程什么也不管(没有调用wait获取子进程退出状态)。敢情小明不是小明爸爸亲生的吧,接下来没多久,父进程也退出了,也就是小明的爸爸也挂了。于是子进程(小明)变成了僵尸(zombie)进程。 按照小明爷爷与小明爸爸之间的约定,既然爹都不管,那爷爷也不管,爱谁谁。

附: 维基百科对对孤儿进程和僵尸进程的解释

1. Orphan process
In a Unix-like operating system any orphaned process will be immediately adopted by the special init system process: the kernel sets the parent to init. This operation is called re-parenting and occurs automatically. Even though technically the process has the "init" process as its parent, it is still called an orphan process since the process that originally created it no longer exists.

【译文】在类Unix操作系统中,任何一个丧父的进程都会被一个名字为init的特殊系统进程所领养:操作系统内核会将已丧父的进程的父亲设置为init进程。这一操作被称之为re-parenting,而且自动执行。虽然从技术上讲,丧父的进程有一个父亲(也就是init进程),但是它还是被称为孤儿进程,因为最开始创建它的父进程已经不在了。

2. Zombie process
On Unix and Unix-like computer operating systems, a zombie process or defunct process is a process that has completed execution (via the exit system call) but still has an entry in the process table: it is a process in the "Terminated state". This occurs for child processes, where the entry is still needed to allow the parent process to read its child's exit status: once the exit status is read via the wait system call, the zombie's entry is removed from the process table and it is said to be "reaped". A child process always first becomes a zombie before being removed from the resource table. In most cases, under normal system operation zombies are immediately waited on by their parent and then reaped by the system – processes that stay zombies for a long time are generally an error and cause a resource leak.

The term zombie process derives from the common definition of zombie — an undead person. In the term's metaphor, the child process has "died" but has not yet been "reaped". Also, unlike normal processes, the kill command has no effect on a zombie process.

Zombie processes should not be confused with orphan processes: an orphan process is a process that is still executing, but whose parent has died. These do not remain as zombie processes; instead, (like all orphaned processes) they are adopted by init (process ID 1), which waits on its children. The result is that a process that is both a zombie and an orphan will be reaped automatically.

【译文】在Unix和类Unix操作系统中,一个僵尸进程(zombie或defunct)是一个已经结束运行的进程(通过exit系统调用),但是该进程在进程表中还占有一个进程表项: 处于终止状态。 子进程持有的进程表项包含了其退处状态,需要被父进程读取。一旦父进程(通过wait系统调用)读取到子进程的退出状态,处于僵死状态的进程表条目就会被从进程表中移除,这被称之为"reaped"。一个子进程被从进程表项移除之前,总是首先进入僵死状态。 在大多数情况下,处于僵死状态的进程能很快被他们的父进程读取到其退出状态,然后被系统收割(reap)掉 -- (相反)长时间处于僵死状态的进程通常会产生一个错误从而导致资源泄露。

术语"僵尸进程"源于对zombie的通俗定义--僵死之人。这一术语的隐喻是,子进程已经死了,但是还没有被火化(reaped)。同时,与普通进程不同的时候,kill命令对僵尸进程不起任何作用。(也就是,你无法kill一个僵尸进程。)

僵尸进程常常与孤儿进程相混淆。一个孤儿进程是一个还在运行的进程,但是它的父亲已经死了。孤儿进程不会进入僵死状态(因为还在运行); 相反,所有的孤儿进程都会被init(进程1)收养。 init进程会等待它的所有子进程退出。 如果一个进程既是僵尸进程又是孤儿进程,那么它会被自动收割(reaped)。

转载于:https://www.cnblogs.com/idorax/p/6279664.html

快速理解孤儿进程和僵尸进程相关推荐

  1. 孤儿进程与僵尸进程[总结]

    1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...

  2. java 僵尸进程_孤儿进程与僵尸进程

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  3. linux c之孤儿进程与僵尸进程[总结]

    转载地址:http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这 ...

  4. Linux系统编程(二)孤儿进程和僵尸进程

    Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...

  5. python僵尸进程和孤儿进程_Python Web学习笔记之并发编程的孤儿进程与僵尸进程...

    1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...

  6. vmware-vmx.exe无法结束进程_孤儿进程与僵尸进程产生原理分析,以及终极解决方案案例实现...

    开发中,在io密集型的场景下,我们可以使用多进程(多线程/协成更nber)来提高任务的处理速度.这就需要主进程需要等待所有工作进程执行完毕后才可以去汇总结果后退出. 但如果不规范的编写程序,就可能导致 ...

  7. exit函数 _exit()函数,孤儿进程,僵尸进程

    exit()函数 调用用 atexit() 注册的任何函数.这些函数在进程终止时应运行. 刷新所有打开的流,这样可以确保将缓冲数据写入相关文件. 关闭所有打开的文件描述符. 返回操作系统的控制,表示进 ...

  8. python僵尸进程和孤儿进程_python学习笔记——孤儿进程和僵尸进程

    1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...

  9. 函数wait、waitpid、孤儿进程、僵尸进程

    一.函数wait.waitpid 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着 ...

最新文章

  1. Nature:AI 引导人类直觉,帮助发现数学定理
  2. 跨终端响应式页面设计入门
  3. Leetcode 75. 颜色分类 (每日一题 20210817)
  4. ROS知识: vanilla(香草) CMakeLists.txt 的语法
  5. mysql blob 好处_MySQL中的BLOB类型
  6. 12 个非常有用的 JavaScript 技巧
  7. 安装docker1.10
  8. java 测试磁盘io,详解三种Linux测试磁盘IO性能的方法总结,值得收藏
  9. Python debug —— 逻辑错误(三)
  10. 数字彩色电视摄像机结构
  11. 函数自执行-一元运算符
  12. pybaobabdt 推荐一款超高颜值的模型可视化库
  13. 淘宝优惠券去哪里领?
  14. DYNAMIC DETECTION
  15. bzoj1190梦幻岛宝珠
  16. spring boot 获取配置项值:@Value的使用
  17. 题目:953.验证外星语词典
  18. 使用RSA、MD5对参数生成签名与验签
  19. 14_自定义ItemDecoration实现qq好友列表分组效果
  20. Liunx网络技术管理及进程管理

热门文章

  1. 一元运算符重载 前置和后置++ --(这种一般用成员函数来实现重载)
  2. xhtml html
  3. Uva 11178 Morley定理
  4. 响应在此上下文中不可用
  5. mysql weblogic_weblogic连mysql的问题
  6. ActiveMQ Destination高级特性
  7. (24)Verilog HDL条件语句:case语句
  8. (19)Verilog HDL顺序块:begin-end
  9. np python_python小白之np功能快速查
  10. 14013.petalinux操作GPIO