孤儿进程
孤儿进程:当一个父进程由于正常完成工作而退出或由于其他情况被终止,它的一个或多个子进程却还在运行,那么那些子进程将成为孤儿进程。
我们可以这样理解:一个父亲他走的很安详,但是他的众多子孙后代还没走,于是乎他们就成了孤儿。
But …
但是我们的操作系统为避免孤儿进程退出时无法释放所占用的资源而僵死,进程号为1的init进程将会接受并处理这些孤儿进程,这一过程也被称为“收养” re-parenting
僵尸进程
僵尸进程:子进程在退出之后,他的父进程没有去等待( wait()或waitpid() )它,然后它就成了僵尸进程 Zombie / defunct
我们也可以这样理解:一个孩子的魂没有了,但是他的父亲并没有去安葬它,久而久之,它就成了一个僵尸(惊悚不)。
但是呢 . . .
UNIX提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。
这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号,退出状态,运行时间等),所以只要我们父进程找到子进程,使用wait()或waitpid()去解决这个问题,这些通过task_struct(PCB)保存的信息就能被释放掉。
危害
孤儿:每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害
僵尸:上面提到的task_struct(PCB)保存的信息,万一父进程一直没有去调用wait()或waitpid()解决问题的话,那么我们的PCB就会一直去维护这些信息,同时进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。 很伤…