进程—僵尸进程与孤儿进程

转载 2016年06月01日 20:44:41

原博客地址:http://blog.csdn.net/l953972252/article/details/51399576

在探讨这个问题之前,我们先来弄清什么是进程。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。 ——360百科

通俗点讲,进程是一段程序的执行过程,是个动态概念。

一,状态分类
进程在之前分为3个状态:
1. 运行状态(Running):正在CPU中运行的进程。
2. 就绪状态(Ready):已获得除了处理器外的所需资源,随时准备着运行的进程。
3. 阻塞状态(Blocked) 因为缺少除了CPU外的其他资源,无法满足运行条件的进程。

后来人们发现3个状态无法满足需求,特意加了就绪挂起状态,和阻塞挂起状态。
程序运行必须加载在内存中,当有过多的就绪阻塞进程在内存中没有运行(占着茅坑不拉屎),内存很小,可能不足。系统需要把他们移动到内存外磁盘中,称为挂起状态。就绪状态的进程挂起就是挂起就绪状态,阻塞进程挂起就称为阻塞挂起状态。

每个进程的产生都有自己的唯一的ID号,并且附带有一个它父进程的PID号。进程死亡时,ID被回收。一个系统一般只能同时运行几百的进程。

进程间靠优先级获得CPU资源,时间片段轮换来更新优先级,以保证不会一个进程占据CPU时间过长。每个进程都得到轮换运行,就好像是系统在同时运行好多进程。

二,僵尸进程
 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

值得注意的是:
所有的进程都会有成为僵尸进程的过程,每个进程在终结时都会将自己进程的信息发给父进程,等待父进程来处理,这个等待阶段就是僵尸进程。不同的是,一般的父进程会很快将已经死亡的子进程处理掉,但是父进程没有收到信息,或者陷入死循环不能处理时,这个僵尸进程就永远的挂在系统中,无法处理了。僵尸进程占用一个进程ID号,但没办法释放,这无疑对系统是种危害。

三,孤儿进程
  孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。

但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。

四,僵尸进程的处理
得出结论,孤儿进程不会占资源,僵尸进程会占用资源危害系统。我们应当避免僵尸进程的出现。
解决办法如下:
1)通过信号机制
  子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。调用wait()或者waitpid(),让父进程阻塞等待僵尸进程的出现,处理完在继续运行父进程。
2)杀死父进程
当父进程陷入死循环等无法处理僵尸进程时,强制杀死父进程,那么它的子进程,即僵尸进程会变成孤儿进程,由系统来回收。
3)重启系统
当系统重启时,所有进程在系统关闭时被停止,包括僵尸进程,开启时init进程会重新加载其他进程。

孤儿进程与僵尸进程的理解

题目: 下面有关孤儿进程和僵尸进程的描述,说法错误的是? 正确答案: D   你的答案: C (错误) 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。 僵尸进...
  • u012496940
  • u012496940
  • 2015年09月21日 16:00
  • 434

僵尸进程和孤儿进程

一,基本概念 我们知道在linux/unix 中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程,子进程的结束和父进程的运行是一个异步过程,即父进程永远不知道子进程什么时候结束,当一个...
  • qq_36532097
  • qq_36532097
  • 2017年05月18日 20:21
  • 513

zombie僵尸进程、孤儿进程和守护进程

以前一直对僵尸进程和孤儿进程都没怎么理解,真是罪过,最近在看liunx编程设计(第四版),看到了他们的概念,所以对它们做个总结!加深印象。 基本概念: 我们知道在unix...
  • gogoky
  • gogoky
  • 2016年05月07日 22:17
  • 3549

Linux 下 popen 函数引起的僵尸进程 defunct 以及解决办法

在使用 popen 函数的时候,如果不注意的话,可能会引起僵尸进程 defunct 的存在,虽然该进程不占用内存和 CPU,但是会在进程任务管理树上占用一个宝贵的节点。这样就造成了进程名额的资源浪费,...
  • Sky_qing
  • Sky_qing
  • 2014年03月27日 16:36
  • 9103

Linux的僵尸进程产生原因及解决方法

来源:http://www.blogdaren.com/post-882.html 1. 产生原因:     在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait ...
  • gb4215287
  • gb4215287
  • 2016年07月08日 00:02
  • 3013

进程—僵尸进程与孤儿进程

在探讨这个问题之前,我们先来弄清什么是进程。 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的...
  • l953972252
  • l953972252
  • 2016年05月13日 23:20
  • 288

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

孤儿进程与僵尸进程[总结] 1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题...
  • lafeedfh
  • lafeedfh
  • 2014年07月26日 09:47
  • 417

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

1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没...
  • shixin_0125
  • shixin_0125
  • 2018年01月01日 02:05
  • 29

孤儿进程和僵尸进程[详解]

一、定义:什么是孤儿进程和僵尸进程    僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。    孤儿进程:一个父进程退出,而它的一个...
  • arhaiyun
  • arhaiyun
  • 2013年10月08日 01:06
  • 483

僵尸进程与孤儿进程

僵尸与孤儿进程
  • Yyingc
  • Yyingc
  • 2017年12月23日 19:40
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程—僵尸进程与孤儿进程
举报原因:
原因补充:

(最多只允许输入30个字)