僵尸 孤儿 守护 进程的理解

僵尸 孤儿 守护 进程(liunx中)

# linux(mac)环境下才强调的两个概念,windows下没有.
基于unix环境(linux,macOS)
为什么会产生僵尸进程??
主进程需要等待子进程结束之后,主进程才结束
主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收.
为什么主进程不在子进程结束后马上对其回收呢?
主进程与子进程是异步关系.主进程无法马上捕获子进程什么时候结束.
如果子进程结束之后马上再内存中释放资源,主进程就没有办法监测子进程的状态了.
unix针对于上面的问题,提供了一个机制.
所有的子进程结束之后,立马会释放掉文件的操作链接,内存的大部分数据,但是会保留一些内容: 进程号,结束时间,运行状态,等待主进程监测,回收.

孤儿进程

父进程由于某种原因结束了,但是你的子进程还在运行中,这样你的这些子进程就成了孤儿进程.你的父进程如果结束了,你的所有的孤儿进程就会被init进程的回收,init就变成了你的父进程,对你进行回收.

僵尸进程

僵尸进程: 所有的子进程结束之后,在被主进程回收之前,都会进入僵尸进程状态  #僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源
僵尸进程有无危害???
如果父进程不对僵尸进程进行回收(wait/waitpid),产生大量的僵尸进程,这样就会占用内存,占用进程pid号.
僵尸进程如何解决???
父进程产生了大量子进程,但是不回收,这样就会形成大量的僵尸进程,解决方式就是直接杀死父进程,将所有的僵尸进程变成孤儿进程进程,由init进行回收.

守护进程

守护进程不可以有子进程 否则抛异常
被守护进程运行完成 同时守护进程 同时完结 不管守护进程还有没有执行完
守护进程先完结就没有守护的意义
#  p.daemon = True  # 将p子进程设置成守护进程,守护主进程,只要主进程结束,子进程无论执行与否,都马上结束.一定要在发起前
# 必须在发起前守护 多用于窗口化
下面验证了守护进程运行完就完了 对被守护的没影响

实列

from multiprocessing import Process
def task():
    print('a')
if __name__ == '__main__':
    p=Process(target=task,args=(()))
    p.daemon=True
    p.start()
    p.join()
    print('11111111111111111111111')
    print(p.is_alive())
    print('主')

相关推荐