zoukankan      html  css  js  c++  java
  • linux中 僵尸 孤儿 守护进程的理解

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

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

    孤儿进程

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

    僵尸进程

    1.僵尸进程: 所有的子进程结束之后,在被主进程回收之前,都会进入僵尸进程状态  
    2.僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被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('主')
    
  • 相关阅读:
    4. Qt的容器类
    hdu 4507 数位dp(求和,求平方和)
    MVC3和MVC4中CRUD操作
    SSL 中证书能否够使用IP而不是域名
    TinyXml快速入门(一)
    C++ TinyXml操作(含源码下载)
    Tinyxml 操作XML
    msxml 操作xml
    MFC中全局变量的定义及使用
    VC++中操作XMLWin32实例
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12388468.html
Copyright © 2011-2022 走看看