Linux中的僵尸进程和孤儿进程

  1. 云栖社区>
  2. 博客>
  3. 正文

Linux中的僵尸进程和孤儿进程

技术小甜 2017-11-17 15:54:00 浏览842
展开阅读全文

UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。
 
       操作系统内核以进程标识符(Process Identifier,即PID)来识别进程。进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)后,进程0就转为交换进程(有时也被称为空闲进程),而进程1init进程)就是系统里其他所有进程的祖先。

 

一、僵尸进程

1、什么是僵尸进程?
        当一个子进程结束运行(一般是调用exit、运行时发生致命错误或收到终止信号所导致)时,子进程的退出状态(返回值)会回报给操作系统,系统则以SIGCHLD信号将子进程被结束的事件告知父进程,此时子进程的进程控制块(PCB)仍驻留在内存中。一般来说,收到SIGCHLD后,父进程会使用wait系统调用以取得子进程的退出状态,然后内核就可以从内存中释放已结束的子进程的PCB;而如若父进程没有这么做的话,子进程的PCB就会一直驻留在内存中,也即成为僵尸进程。

 

2、僵尸进程的危害
        由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束那么不会因为父进程太忙来不及wait子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢不会.因为UNIX提供了一种机制可以保证 只要父进程想知道子进程结束时的状态信息就可以得到这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process), 直到父进程通过wait / waitpid来取时才释放但这样就导致了问题,如果你进程不调用wait / waitpid的话那么保留的那段信息就不会释放,其进程号就会一定被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程此即为僵尸进程的危害应当避免。

 

3、僵尸进程的清理

        为避免产生僵尸进程,实际应用中一般采取的方式是:
        1)将父进程中对SIGCHLD信号的处理函数设为SIG_IGN(忽略信号); 
        2) fork两次并杀死一级子进程,令二级子进程成为孤儿进程而被init收养、清理。

 

二、 孤儿进程

1、什么是孤儿进程?

       孤儿进程则是指父进程结束后仍在运行的子进程。在类UNIX系统中,孤儿进程一般会被init进程所收养,成为init的子进程。

 

2、孤儿进程的危害

       孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

 

三、Linux中的进程基本状态:

     1、执行(R)状态:CPU正在执行,即进程正在占用CPU

     2、就绪(W)状态:进程已经具备的执行的一切条件,正在等待分配CPU的处理时间片。
     3、停止(S)状态:进程不能使用CPU
 
四、三个函数: 
fork();功能:创建一个新的进程。(fork()<0[出错]fork()==0[子进程]fork()>0[父进程]
wait();功能:真正结束进程(收尸)。
exec();功能:执行外部程序。
 
孤儿进程与僵尸进程的区别:
     僵尸进程会造成资源浪费,孤儿进程则不会!













本文转自信自己belive51CTO博客,原文链接http://blog.51cto.com/11638205/1917161: ,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论