(一)引入
- 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。
- 子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。
- 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。
(二)僵尸进程(有害)
(1)什么是僵尸进程
- 僵尸进程是指完成了自己的任务,但父进程没有正确地释放它所占用的系统资源
- 导致它仍然存在于进程列表中
- 但已经停止了运行。
- 这些僵尸进程会占据一定的系统内存,并在一定程度上影响系统的性能。
- 僵尸进程
- 就是对于子进程来说,子进程死亡的时候,这部分资源并未被释放掉
- 这种现象对于死亡的子进程来说就是僵尸进程
示例:
- 当子进程开设后,该进程死后不会立刻释放占用的进程号
- 因为要让父进程能够查看到开设的子进程的一些基本信息
- 占用的 PID 号,运行时间等
- 因为要让父进程能够查看到开设的子进程的一些基本信息
- 所有的进程都会步入僵尸进程
- 父进程不死并且在无限制的创建子进程并且子进程也不结束
- 如何回收子进程占用的 PID 号
- 父进程等待子进程运行结束
- 父进程调用 join 方法
"""僵尸进程"""
# 导入模块
from multiprocessing import Process
import time
def test():
print(f"子进程开始")
time.sleep(3)
print(f"子进程结束")
if __name__ == '__main__':
p=Process(target=test)
p.start()
print("结束!!")
"""
僵尸进程
主进程已经结束
但是对于子进程来说
子进程死亡的时候,子进程的这部分资源还未被释放
对于死亡的子进程来说 就是僵尸进程
"""
# 结束!!
# 子进程开始
# 子进程结束
(三)孤儿进程
(1)什么是孤儿进程
-
孤儿进程则是指
父进程在子进程终止之前就已经退出了
-
导致子进程失去了与父进程通信的能力。
-
这些孤儿进程将被
init进程
接管 -
init进程
会等待它的状态信息并释放它的系统资源。 -
孤儿进程
- 就是说,父进程在子进程终止之前就已经停止了
- 留下了的子进程失去了与父进程的通信能力
- 这些孤儿进程被init进程接管
- init进程会等待它的状态信息并释放它的系统资源
示例
- 子进程存活,父进程意外死亡
- 没有父进程来帮助回收 PID 号
- 解决办法
- 操作系统会开设一个儿童福利院(
init 进程
)专门管理孤儿进程回收相关资源
- 操作系统会开设一个儿童福利院(
(四)僵尸进程与孤儿进程的比较
- 僵尸进程的危害大于孤儿进程
- 僵尸进程会占用大部分的资源,并且这部分资源没人来处理
- 孤儿进程虽然父进程没了,但是会有init进程将这部分资源释放处理掉