1. 程式人生 > 實用技巧 >殭屍程序 和 孤兒程序

殭屍程序 和 孤兒程序

殭屍程序 與 孤兒程序

引言

殭屍程序和孤兒程序的由來,都要從一個偉大的函式說起: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)