• 僵尸进程 和 孤儿进程


    僵尸进程 与 孤儿进程

    引言

    僵尸进程和孤儿进程的由来,都要从一个伟大的函数说起:fork()(对,就像github里面的那个fork)

    fork()的作用就是创建一个该进程下的子进程,在其exit 或 exec之前,和他共享代码,以一个父进程的身份,完成以下工作:

    • 分配标识符pid和PCB
    • 让子进程复制父进程的环境
    • 给子进程分配地址空间和资源
    • 复制父进程的地址空间信息

    有了子进程,所以才有了僵尸进程和孤儿进程

    僵尸进程 - 白发人送黑发人

    创建子进程后,如果子进程比父进程早结束,而且父进程迟迟没有结束,那么子进程就会进入一个Z(Zombie)状态 - 僵尸状态

    此时如果父进程不去处理,那么子进程就会一直处于这个状态,它毫无作用,又占了内存

    因为其PCB中还保留了很多关于它的退出信息,所以它的PCB也不会被摧毁

    僵尸进程在Linux中是一种数据结构

    进程在结束时候,资源并不会全部释放,会保留其中的一部分信息(例如:PID信息)

    正常情况下,父进程会把这些僵尸进程回收

    切记:僵尸进程是有害的

    zombie.py
    from multiprocessing import Process
    import time
    import os
    
    
    def task():
        print(os.getpid())
        time.sleep(1)
    
    
    if __name__ == '__main__':
        p1 = Process(target=task, )
        p2 = Process(target=task, )
        p1.start()
        p2.start()
        print('main', os.getpid())
        time.sleep(100)
    
    [root@localhost ~]# python3 zombie.py
    
    [root@localhost ~]# python3 zombie.py
    main 1323
    1324
    1325
    
    [root@localhost ~]# top
    top - 17:11:47 up 6 min,  3 users,  load average: 0.02, 0.09, 0.05
    Tasks: 107 total,   1 running, 104 sleeping,   0 stopped,   2 zombie
    %Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  2027892 total,  1496068 free,   239868 used,   291956 buff/cache
    KiB Swap:        0 total,        0 free,        0 used.  1631940 avail Mem
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
         1 root      20   0  193560   6596   4136 S   0.0  0.3   0:01.28 systemd
         
         
    [root@localhost ~]# ps aux | grep 1324
    root       1324  0.0  0.0      0     0 pts/0    Z+   17:11   0:00 [python3] <defunct>
    root       1328  0.0  0.0 112808   964 pts/1    S+   17:12   0:00 grep --color=auto 1324
    [root@localhost ~]# ps aux | grep 1325
    root       1325  0.0  0.0      0     0 pts/0    Z+   17:11   0:00 [python3] <defunct>
    root       1330  0.0  0.0 112808   964 pts/1    R+   17:12   0:00 grep --color=auto 1325
    

    from multiprocessing import Process
    import time
    import os
    
    
    def task():
        print(os.getpid())
        time.sleep(1)
    
    
    if __name__ == '__main__':
        Process(target=task, ).start()
        Process(target=task, ).start()
        time.sleep(3)
        Process(target=task, ).start()
        Process(target=task, ).start()
        time.sleep(5)
    

    python主进程结束后,会回收子进程

    孤儿进程 - 我生父已

    孤儿进程,顾名思义,子进程还在世的时候父进程却结束了

    那么孤儿进程没了父进程,是不是就被孤立了呢?不会的,我们还需要了解到1号进程——init进程

    它不是第一个进程,但是是用户端的第一个进程

    它在用户机开启时开始工作,在用户机结束时终止

    它有一个功能就是收养这些孤儿,在这些孤儿进程结束时第一时间回收他们的退出信息,保证他们不一直成为僵尸进程

    所以init进程,也被称作为孤儿院

    切记:孤儿进程是无害的

    from multiprocessing import Process
    import time
    import os
    
    
    def task():
        print(os.getpid())
        time.sleep(100)
    
    
    if __name__ == '__main__':
        Process(target=task, ).start()
        Process(target=task, ).start()
        print(os.getpid())
        time.sleep(5)
    
  • 相关阅读:
    proxmox新版本使用了lxc容器,导致以前的vzlist命令无法使用,于是自己写了一个脚本来获取所有半虚拟化主机的信息状态
    Linux 系统优化参数总结
    linux shell 远程执行命令
    wios设置证书登陆
    Eclipse安装tomcat插件
    Centos6.5-dnsmasq安装
    SSL工作原理
    ssh免密码登陆及其原理
    Linux查看后台任务,关闭后台任务
    Mybatis 中常用的java类型与jdbc类型
  • 原文地址:https://www.cnblogs.com/xuexianqi/p/14157047.html
Copyright © 2020-2023  润新知