僵尸进程和孤儿进程是与进程终止相关的两种不同状态。
僵尸进程(Zombie Process)
僵尸进程是指一个子进程已经执行完毕并退出,但其父进程还没有读取该子进程的退出状态信息(即通过调用 wait()
或 waitpid()
系统调用获取子进程的终止状态)。在这种情况下,子进程的进程表项仍然保留在系统中,虽然子进程已经终止,但它的进程号(PID)和退出状态信息还占用着系统资源,这种进程称为僵尸进程。
关键点:
- 僵尸进程并不占用系统的CPU和内存资源,只占用一个进程号和一些内核数据结构。
- 僵尸进程会在父进程读取其退出状态后被完全清理掉。
- 如果父进程在子进程终止后不及时调用
wait()
函数处理其退出状态,可能会导致系统中的僵尸进程过多,耗尽系统的进程号资源。
孤儿进程(Orphan Process)
孤儿进程是指一个父进程终止了,但它的子进程还在继续运行。这种情况下,这些子进程将变为孤儿进程。为了防止这些孤儿进程无人管理,操作系统会将它们的父进程重新指定为 init
进程(PID为1的进程,在现代系统中可能是 systemd
进程)。init
进程会自动接管这些孤儿进程,并在它们终止时清理它们的资源。
关键点:
- 孤儿进程会被系统的
init
进程接管,确保它们的资源能够被正确回收。 - 孤儿进程继续运行,不会对系统产生负面影响,系统会妥善管理它们。
区别总结
- 僵尸进程 是子进程已经终止但父进程还未回收其资源的情况。
- 孤儿进程 是父进程终止而子进程仍在运行的情况,系统会自动将其父进程更改为
init
。