Linux 的殭屍(zombie)進程

來源:互聯網
上載者:User

 

可能很少有人意識到,在一個進程調用了exit之後,該進程 並非馬上就消失掉,而是留下一個稱為殭屍進程(Zombie)的資料結構。在Linux進程的5種狀態中,殭屍進程是非常特殊的一種,它已經放棄了幾乎所 有記憶體空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等資訊供其他進程收集,除此之外,殭屍進程不再佔有 任何記憶體空間。

 

    殭屍進程的來由,要追溯到Unix,Unix的設計者們設計這個東西並非是因為閑來無事想裝裝酷什麼的。上面說到,殭屍進程中儲存著很多對程式員和系統管理員非常重要的資訊,首先,這個進程是怎麼死亡的?是正常退出呢,還是出現了錯誤,還是被其它進程強迫退出的?也就是說,這個程式的退出碼是什嗎?其次,這個進程佔用的總系統CPU時間和總使用者CPU時間分別是多少?發生頁錯誤的數目和收到訊號的數目。這些資訊都被儲存在殭屍進程中,試想如果沒有殭屍進程,進程執行多長我們並不知道,一旦其退出,所有與之相關的資訊都立刻都從系統中清除,而如果此時父進程或系統管理員需要用到,就只好乾瞪眼了。

 

 

 

     所以,進程退出後,系統會把該進程的狀態變成Zombie,然後給上一定的時間等著父進程來收集其退出資訊,因為可能父進程正忙於別的事情來不及收集,所以,使用Zombie狀態表示進程退出了,正在等待父進程收集資訊中。

 

    Zombie進程不可以用kill命令清楚,因為進程已退出,如果需要清除這樣的進程,那麼需要清除其父進程,或是等很長的時間後被核心清除。因為Zombie的進程還佔著個進程ID號呢,這樣的進程如果很多的話,不利於系統的進程調度。

 

    下面,讓我們來看看一個樣本:

 

 

 

/* zombie.c */

#include <sys/types.h>

#include <unistd.h>  main()

{

    pid_t pid; 

    pid=fork();

    if(pid<0) { /* 如果出錯*/ 

        printf("error occurred!\n");

    }else if(pid==0){ /* 如果是子進程*/ 

        exit(0);

    }else{  /* 如果是父進程*/ 

        sleep(60);  /* 休眠60秒*/ 

        wait(NULL); /* 收集殭屍進程*/

    }

}

 

編譯並運行

$ cc zombie.c -o zombie

$ ./zombie &

[1] 1217

$ ps aux | grep zombie

1217   pts/0   S   0:00   ./zombie

 

1218   pts/0   Z   0:00   [zombie]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.