返回顶部

多任务编程 -- 孤儿进程和僵尸进程

孤儿进程:

  1. 孤儿进程:父进程先于子进程退出,此时子进程称为孤儿进程;
  2. 特点:
    1. 孤儿进程会被系统进程收养,此时,系统进程就会称为孤儿进程新的父进程,孤儿进程退出,该进程会自动处理;

僵尸进程:

  1. 僵尸进程:子进程先于父进程退出,但父进程又没有处理子进程的退出状态,此时子进程就会称为僵尸进程。
  2. 特点:
    1. 僵尸进程虽然结束,但是会存留部分PCB在内存中,大量的僵尸进程,会浪费系统的内存资源。

避免僵尸进程的方法:

创建二级子进程处理僵尸:

  1. 父进程创建子进程,等待回收子进程;
  2. 子进程创建【二级子进程】,然后退出;
  3. 二级子进程成为【孤儿进程】,和原来的父进程一同执行事件,PS:此时,二级子进程归【系统进程】管理。
  4. 代码示例:
    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()

    运行结果:

    写代码
    写代码
    侧代码
    写代码
    侧代码

     

通过【信号】处理子进程退出:

  1. 原理:
    1. 子进程退出时,会发送信号给父进程;
    2. 如果父进程忽略进程信号,则系统就会自动处理子进程退出。
  2. 方法:
    1. 使用【signal模块】在父进程创建子进程前,写如下语句:
      import signal
      
      signal.signal(signal.SIGCHLD, signal.SIG_IGN)

       

  3. 特点:
    1. 非阻塞,不会影响父进程运行;
    2. 可以处理所有子进程退出。
posted @ 2020-05-17 11:55  Be-myself  阅读(252)  评论(0编辑  收藏  举报
levels of contents 点击查看具体代码内容