Linux 的僵尸(zombie)進程


點擊「閱讀原文」查看良許原創(chuàng)精品視頻。
鏈接:https://coolshell.cn/articles/656.html

可能很少有人意識到,在一個進程調(diào)用了exit之后,該進程 并非馬上就消失掉,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu)。
在Linux進程的5種狀態(tài)中,僵尸進程是非常特殊的一種,它已經(jīng)放棄了幾乎所 有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態(tài)等信息供其他進程收集,除此之外,僵尸進程不再占有 任何內(nèi)存空間。
僵尸進程的來由,要追溯到Unix,Unix的設(shè)計者們設(shè)計這個東西并非是因為閑來無事想裝裝酷什么的。上面說到,僵尸進程中保存著很多對程序員和系統(tǒng)管理員非常重要的信息,首先,這個進程是怎么死亡的?是正常退出呢,還是出現(xiàn)了錯誤,還是被其它進程強迫退出的?也就是說,這個程序的退出碼是什么?其次,這個進程占用的總系統(tǒng)CPU時間和總用戶CPU時間分別是多少?發(fā)生頁錯誤的數(shù)目和收到信號的數(shù)目。這些信息都被存儲在僵尸進程中,試想如果沒有僵尸進程,進程執(zhí)行多長我們并不知道,一旦其退出,所有與之相關(guān)的信息都立刻都從系統(tǒng)中清除,而如果此時父進程或系統(tǒng)管理員需要用到,就只好干瞪眼了。
所以,進程退出后,系統(tǒng)會把該進程的狀態(tài)變成Zombie,然后給上一定的時間等著父進程來收集其退出信息,因為可能父進程正忙于別的事情來不及收集,所以,使用Zombie狀態(tài)表示進程退出了,正在等待父進程收集信息中。
Zombie進程不可以用kill命令清除,因為進程已退出,如果需要清除這樣的進程,那么需要清除其父進程,或是等很長的時間后被內(nèi)核清除。因為Zombie的進程還占著個進程ID號呢,這樣的進程如果很多的話,不利于系統(tǒng)的進程調(diào)度。
下面,讓我們來看看一個示例:
#include#includemain() {pid_t pid;pid=fork();if(pid<0) {printf("error occurred!\n");}else if(pid==0){exit(0);}else{sleep(60);wait(NULL);}}
編譯這個程序:
$ cc zombie.c -o zombie后臺運行程序,以使我們能夠執(zhí)行下一條命令
$ ./zombie &[1] 1217
列一下系統(tǒng)內(nèi)的進程
$ ps -ax...?...1137???pts/0???S???0:00???-bash1217???pts/0???S???0:00???./zombie1218???pts/0???Z???0:00???[zombie]1578 pts/0 R 0:00 ps -ax
其中的”Z”就是僵尸進程的標志,它表示1218號進程現(xiàn)在就是一個僵尸進程。
收集Zombie進程的信息,并終結(jié)這些僵尸進程,需要我們在父進程中使用waitpid調(diào)用和wait調(diào)用。這兩者的作用都是收集僵尸進程留下的信息,同時使這個進程徹底消失。
-?END -良許個人微信
添加良許個人微信即送3套程序員必讀資料
→ 精選技術(shù)資料共享
→ 高手如云交流社群
推薦閱讀:
再來一個吊打百度網(wǎng)盤的開源神器,還是99年妹子開發(fā)的
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲?。?!
