殭屍程序 和 孤兒程序
阿新 • • 發佈:2020-12-18
殭屍程序 與 孤兒程序
引言
殭屍程序和孤兒程序的由來,都要從一個偉大的函式說起: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)