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

转载 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进程会重新加载其他进程。

相关文章推荐

区别之守护进程 孤儿进程 僵尸进程

僵尸进程是 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。 孤儿进程...

僵尸进程与孤儿进程

zombie进程(僵尸进程):任何一个进程,当其运行结束(exit)之后,其使用的所有资源和内存空间都会释放,以供其他进程使用;但其在OS内核的process table中仍旧保留一条记录,包含该进程...
  • gnuhpc
  • gnuhpc
  • 2012年01月08日 20:03
  • 4251

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

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

孤儿进程与僵尸进程

早就了解孤儿进程与僵尸进程,但仅仅是停留在一知半解的程度,总结一下。概念  首先我们知道在Linux中,进程都是由父进程创建的,一般情况下子进程退出后需要父进程来清理子进程退出后留下的“垃圾”,父进程...

5种服务器网络编程模型讲解

本文介绍几种服务器网络编程模型。废话不多说,直接正题。 1.同步阻塞迭代模型 同步阻塞迭代模型是最简单的一种IO模型。 其核心代码如下: 12345678bind(srvfd);listen(sr...
  • xxb2008
  • xxb2008
  • 2014年12月29日 10:21
  • 682

嵌入式面试题——ARM面试题(二)

填空题 1.ARM微处理器在较新的体系结构中支持两种指令集:______、______。 答案:ARM指令集、Thumb指令集   2.ARM处理器有9种基本寻址方式,分别是:______、_____...
  • sum_TW
  • sum_TW
  • 2017年03月01日 14:02
  • 553

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

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

孤儿进程及僵尸进程

文章转自  http://www.cnblogs.com/Anker/p/3271773.html 1、前言   之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一...

孤儿进程和僵尸进程

一、定义:什么是孤儿进程和僵尸进程僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行...

Linux——僵尸进程&孤儿进程

在谈及僵尸以及孤儿进程前,我们首先需要知道一件事:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:进程—僵尸进程与孤儿进程
举报原因:
原因补充:

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