zombie process / orphan process
父进程通过fork()函数来创建子进程。子进程会copy 当前父进程的状态和运行代码,独立运行,子进程和父进程的的运行和结束是一个异步的过程,fork出来之后运行的先后顺序也取决于系统的调度,不存在绝对的顺序。linux 为了进程退出能被正确回收,会维护一张进程的映射表,当进程结束时,系统会将进程的信息存储起来,等待父进程去处理回收子进程,处于退出状态且父进程没有调用wait()获取状态信息的进程就会陷入Z
状态,理论上所有的进程都会有一个短暂的Z
状态。
-
orphan process:一个父进程退出,而子进程还在运行,这些子进程将成为孤儿进程,被init进程所收养,并由init进程对它们完成状态收集工作。
-
zombie process:进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
如何处理僵尸进程/孤儿进程
- orphan process
理论上孤儿进程不会对系统有影响,init 进程会接管成为父进程,负责进程回收,linux中也会有很多主动的操作来避免子进程被主动回收,比如说nohup
、disown
,都是通过屏蔽信号来使子进程成为orphan process最终被init接收,实现终端关闭但是进程不退出 - zombie process
理论上zombie process是由于父进程不wait(), 可以直接干掉父进程,让init接手来处理
fork()
1 | pid = fork() |