Linux中的僵尸进程和孤儿进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux中的僵尸进程和孤儿进程相关的知识,希望对你有一定的参考价值。
在UNIX里,除了进程0(即PID=0的交换进程,Swapper Process)以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。
操作系统内核以进程标识符(Process Identifier,即PID)来识别进程。进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)后,进程0就转为交换进程(有时也被称为空闲进程),而进程1(init进程)就是系统里其他所有进程的祖先。
一、僵尸进程
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();功能:执行外部程序。
孤儿进程与僵尸进程的区别:
僵尸进程会造成资源浪费,孤儿进程则不会!
本文出自 “11628205” 博客,请务必保留此出处http://11638205.blog.51cto.com/11628205/1917161
以上是关于Linux中的僵尸进程和孤儿进程的主要内容,如果未能解决你的问题,请参考以下文章
Linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解
Linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解