国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

linux僵死進程的解決方法

2020-10-14 22:40:00
字體:
來源:轉載
供稿:網友

linux僵死進程的解決方法

  一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀, 而是留下一個稱為僵死進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵死進程,并不能將其完全銷毀)。

  一、僵死進程的產生

  在每個進程退出的時候,內核釋放該進程所有的資源,包括打開的文件,占用的內存等,但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態the

  termination status of the process,運行時間the amount of CPU time taken by the process等), 直到父進程通過wait/waitpid來取時才釋放。此時該進程處于僵死狀態,該進程成為僵死進程(Zombie Process)。 這保證了父進程可以獲取到子進程結束時的狀態信息。

  在Linux進程的狀態中,僵死進程是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵死進程不再占有任何內存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵死狀態,如果這時父進程結束了,僵死的子進程成為"孤兒進程",過繼給1號進程init,init始終會負責清理僵死進程,它產生的所有僵死進程也跟著消失(每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init來接管他,成為他的父進程)。但是如果如果父進程是一個循環,不會結束,那么子進程就會一直保持僵死狀態,這就是為什么系統中有時會有很多的僵死進程。怎么查看僵死進程,利用命令ps,可以看到有標記為Z的進程就是僵死進程。

  二、僵死進程的危害

  如果父進程不調用wait/waitpid的話, 那么保留的那段信息就不會釋放,其進程號會一定被占用,但是系統所能使用的進程號是有限的,如果產生了大量的僵死進程,將因為沒有可用的進程號而導致系統不能產生新的進程。

  三、僵死進程的避免

  1、父進程通過wait和waitpid等函數等待子進程結束,這會導致父進程掛起

  2、如果父進程很忙,那么可以用signal函數為SIGCHLD安裝信號處理函數。子進程結束后,父進程會收到該信號,可以在信號處理函數中調用wait回收 。

  3、如果父進程不關心子進程什么時候結束,那么可以用signal(SIGCHLD, SIG_IGN)通知內核,自己對子進程的結束不感興趣,那么子進程結束后,內核會回收, 并不再給父進程 發送信號。

  或用sigaction函數為SIGCHLD設置SA_NOCLDWAIT,這樣子進程結束后,就不會進入僵死狀態

  struct sigaction sa;

  sa.sa_handler = SIG_IGN;

  sa.sa_flags = SA_NOCLDWAIT;

  sigemptyset(&sa.sa_mask);

  sigaction(SIGCHLD, &sa, NULL);

  4、fork兩次,父進程fork一個子進程,然后繼續工作,子進程fork一個孫進程后退出,那么孫進程被init接管,孫進程結束后,init會回收。不過子進程的回收還要父進程來做。

  int nStatus;

  pid_t pid;

  pid = vfork(); //生成子進程

  if (pid > 0) //父進程

  {
(責任編輯:VEVB)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通许县| 民乐县| 门头沟区| 西乌珠穆沁旗| 芜湖县| 双鸭山市| 长岭县| 永城市| 垫江县| 定襄县| 绥宁县| 尉犁县| 游戏| 抚顺县| 民丰县| 新绛县| 黄山市| 黑龙江省| 宁城县| 承德市| 广宗县| 仲巴县| 吉水县| 宜君县| 乌拉特后旗| 涟水县| 阳东县| 都安| 灵璧县| 杨浦区| 读书| 理塘县| 西安市| 黄平县| 九龙城区| 磴口县| 深水埗区| 湖南省| 盐山县| 东明县| 金沙县|