zoukankan      html  css  js  c++  java
  • 多任务编程 -- 孤儿进程和僵尸进程

    孤儿进程:

    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. 可以处理所有子进程退出。
  • 相关阅读:
    网络编程
    反射函数与元类
    面向对象进阶
    对象的封装与接口
    对象继承
    面向对象
    包,logging模块与haslib模块
    闭包函数及装饰器
    函数对象、函数的嵌套、名称空间及作用域
    函数简介及函数参数介绍
  • 原文地址:https://www.cnblogs.com/gengyufei/p/12904611.html
Copyright © 2011-2022 走看看