当前位置: 首页 > >

进程之 孤儿进程与僵尸进程

发布时间:

目录:

进程状态
孤儿进程
僵尸进程




一. 进程状态

在探讨这个问题之前,我们先来弄清什么是进程。


进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。通俗点讲,进程是一段程序的执行过程,是个动态概念。

程序运行必须加载在内存中,当有过多的就绪态或阻塞态进程在内存中没有运行,因为内存很小,有可能不足。系统需要把他们移动到内存外磁盘中,称为挂起状态。就绪状态的进程挂起就是挂起就绪状态,阻塞进程挂起就称为阻塞挂起状态。

每个进程的产生都有自己的唯一的ID号(pid),并且附带有一个它父进程的ID号(ppid)。进程死亡时,ID被回收。

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




二. 孤儿进程
子进程死亡需要父进程来处理,那么意味着正常的流程是子进程先死然后父进程在死亡。当父进程比子进程先死亡时,子进程就没有父进程处理,这样的话就会形成孤儿进程。孤儿进程将被分配给一号进程init,init进程将会收养孤儿进程,并由init进程对它们完成状态收集工作。孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它最终是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。


三. 僵尸进程
每一个进程都会有一个pcb,(是进程实体的一部分,它是进程管理和控制最重要的数据结构,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消它也会跟着撤消。)子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程,僵尸进程实际上是一个已经死掉的进程。僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,这个僵尸进程需要它的父进程来为它收尸,如果他的父进程没有处理这个僵尸进程的措施,那么它就一直保持僵尸状态我们可以试想一下,如果有大量的僵尸进程在系统中,必然会消耗大量的系统资源。但是系统资源是有限的,因此当僵尸进程达到一定数目时,系统会缺乏资源而导致奔溃。

所以在实际编程中要避免僵尸进程有两种方法


第一种方法:
直接将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init
就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程,但是父进程是一个服务器程序,如果为了回收其子进程的资源,而杀死服务器程序,会导致整个服务器崩溃,显然这种回收进程的方式是不可取的,但是也有一定的存在意义。
第二种方法:
当子进程终止时,内核就会向它的父进程发送一个SIGCHLD信号,父进程可以选择忽略该信号,也可以提供一个接收到信号以后的处理函数。对于这种信号的系统默认是忽略它。我们也不希望有过多的僵尸进程产生,所以当父进程接收到SIGCHLD信号后就会调用wait 或 waitpid 函数对子进程进行善后处理,释放子进程占用的资源从而避免形成僵尸进程



友情链接: