多任务编程 -- 孤儿进程和僵尸进程
孤儿进程:
- 孤儿进程:父进程先于子进程退出,此时子进程称为孤儿进程;
- 特点:
- 孤儿进程会被系统进程收养,此时,系统进程就会称为孤儿进程新的父进程,孤儿进程退出,该进程会自动处理;
僵尸进程:
- 僵尸进程:子进程先于父进程退出,但父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
- 特点:
- 僵尸进程虽然结束,但是会存留部分PCB在内存中,大量的僵尸进程,会浪费系统的内存资源。
避免僵尸进程的方法:
创建二级子进程处理僵尸:
- 父进程创建子进程,等待回收子进程;
- 子进程创建【二级子进程】,然后退出;
- 二级子进程成为【孤儿进程】,和原来的父进程一同执行事件,PS:此时,二级子进程归【系统进程】管理。
- 代码示例:
from time import sleep import os def f1(): for i in range(3): sleep(2) print("写代码") def f2(): for i in range(2): sleep(4) print("侧代码") pid = os.fork() # 一级子进程 if pid == 0: p = os.fork() # 二级子进程 if p == 0: f1() # 一级子进程 else: os._exit(0) # 一级子进程退出 # 父进程 else: os.wait() # 等待一级子进程退出 f2()
运行结果:
写代码 写代码 侧代码 写代码 侧代码
通过【信号】处理子进程退出:
- 原理:
- 子进程退出时,会发送信号给父进程;
- 如果父进程忽略进程信号,则系统就会自动处理子进程退出。
- 方法:
- 使用【signal模块】在父进程创建子进程前,写如下语句:
import signal signal.signal(signal.SIGCHLD, signal.SIG_IGN)
- 使用【signal模块】在父进程创建子进程前,写如下语句:
- 特点:
- 非阻塞,不会影响父进程运行;
- 可以处理所有子进程退出。