僵尸进程
僵尸进程产生原因:运行一个程序的时候会产生一个父进程和多个子进程,所有这些子进程都会消耗内核分配的内存和cpu资源,当子进程执行完成后会发送一个Exit信号然后死掉,这个Exit信号需要被父进程读取到,父进程需要随后调用wait命令读取子进程的退出状态--若父进程正确读取了子进程的退出信号,则该子进程会从进程表中删掉;如果父进程未能读取到子进程的退出信号,则尽管该子进程已经完成执行处于死亡的状态,但是该进程仍然不会从进程表中删掉;
僵尸进程是否有害处:
其实僵尸进程并不会做对系统有害的事情,僵尸进程不会使用任何资源也不会影响其他进程,因此存在僵尸进程也不会有什么明显的坏处;但是因为僵尸进程的退出状态以及一些其它的进程信息都会存储在内存中,因此如果僵尸进程数量过多,有时也会存在问题:
linux提供了一种机制来保证父进程能够知道子进程结束的状态信息:在每个子进程退出的时候,内核都会释放所有的资源,如打开的文件、占用的内存等,但是一些信息仍然会保留(进程号PID、退出状态、运行时间等),这些信息直到父进程通过wait来获取时才会释放
这样的问题是:如果父进程不调用wait获取,那么进程号PID、退出状态、运行时间等信息就不会释放;而系统所能使用的PID进程号是有限的,如果大量产生僵尸进程,就无法继续创建新的进程;
孤儿进程
当父进程以及运行完退出,而它的子进程还在运行,这些子进程就会成为孤儿进程;孤儿进程会被init进程收养,因为有init进程循环的wait回收资源,因此孤儿进程没有什么危害;