亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

孤兒進程與僵尸進程[總結]

2024-06-28 16:00:47
字體:
來源:轉載
供稿:網友

1、前言

  之前在看《unix環境高級編程》第八章進程時候,提到孤兒進程和僵尸進程,一直對這兩個概念比較模糊。今天被人問到什么是孤兒進程和僵尸進程,會帶來什么問題,怎么解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真總結一下,加深理解。

2、基本概念

  我們知道在unix/linux中,正常情況下,子進程是通過父進程創建的,子進程在創建新的進程。子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什么時候結束。 當一個 進程完成它的工作終止之后,它的父進程需要調用wait()或者waitpid()系統調用取得子進程的終止狀態。

  孤兒進程:一個父進程退出,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養,并由init進程對它們完成狀態收集工作。

  僵尸進程:一個進程使用fork創建子進程,如果子進程退出,而父進程并沒有調用wait或waitpid獲取子進程的狀態信息,那么子進程的進程描述符仍然保存在系統中。這種進程稱之為僵死進程。

3、問題及危害

  unix提供了一種機制可以保證只要父進程想知道子進程結束時的狀態信息, 就可以得到。這種機制就是: 在每個進程退出的時候,內核釋放該進程所有的資源,包括打開的文件,占用的內存等。 但是仍然為其保留一定的信息(包括進程號the PRocess ID,退出狀態the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放。 但這樣就導致了問題,如果進程不調用wait / waitpid的話, 那么保留的那段信息就不會釋放,其進程號就會一直被占用,但是系統所能使用的進程號是有限的,如果大量的產生僵死進程,將因為沒有可用的進程號而導致系統不能產生新的進程. 此即為僵尸進程的危害,應當避免。

  孤兒進程是沒有父進程的進程,孤兒進程這個重任就落到了init進程身上,init進程就好像是一個民政局,專門負責處理孤兒進程的善后工作。每當出現一個孤兒進程的時候,內核就把孤 兒進程的父進程設置為init,而init進程會循環地wait()它的已經退出的子進程。這樣,當一個孤兒進程凄涼地結束了其生命周期的時候,init進程就會代表黨和政府出面處理它的一切善后工作。因此孤兒進程并不會有什么危害。

  任何一個子進程(init除外)在exit()之后,并非馬上就消失掉,而是留下一個稱為僵尸進程(Zombie)的數據結構,等待父進程處理。這是每個 子進程在結束時都要經過的階段。如果子進程在exit()之后,父進程沒有來得及處理,這時用ps命令就能看到子進程的狀態是“Z”。如果父進程能及時 處理,可能用ps命令就來不及看到子進程的僵尸狀態,但這并不等于子進程不經過僵尸狀態。  如果父進程在子進程結束之前退出,則子進程將由init接管。init將會以父進程的身份對僵尸狀態的子進程進行處理。

  僵尸進程危害場景:

  例如有個進程,它定期的產 生一個子進程,這個子進程需要做的事情很少,做完它該做的事情之后就退出了,因此這個子進程的生命周期很短,但是,父進程只管生成新的子進程,至于子進程 退出之后的事情,則一概不聞不問,這樣,系統運行上一段時間之后,系統中就會存在很多的僵死進程,倘若用ps命令查看的話,就會看到很多狀態為Z的進程。 嚴格地來說,僵死進程并不是問題的根源,罪魁禍首是產生出大量僵死進程的那個父進程。因此,當我們尋求如何消滅系統中大量的僵死進程時,答案就是把產生大 量僵死進程的那個元兇槍斃掉(也就是通過kill發送SIGTERM或者SIGKILL信號啦)。槍斃了元兇進程之后,它產生的僵死進程就變成了孤兒進 程,這些孤兒進程會被init進程接管,init進程會wait()這些孤兒進程,釋放它們占用的系統進程表中的資源,這樣,這些已經僵死的孤兒進程 就能瞑目而去了。

3、孤兒進程和僵尸進程測試

孤兒進程測試程序如下所示:

復制代碼
 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <errno.h> 4 #include <unistd.h> 5  6 int main() 7 { 8     pid_t pid; 9     //創建一個進程10     pid = fork();11     //創建失敗12     if (pid < 0)13     {14         perror("fork error:");15         exit(1);16     }17     //子進程18     if (pid == 0)19     {20         printf("I am the child process./n");21         //輸出進程ID和父進程ID22         printf("pid: %d/tppid:%d/n",getpid(),getppid());23         printf("I will sleep five seconds./n");24         //睡眠5s,保證父進程先退出25         sleep(5);26         printf("pid: %d/tppid:%d/n",getpid(),getppid());27         printf("child process is exited./n");28     }29     //父進程30     else31     {32         printf("I am father process./n");33         //父進程睡眠1s,保證子進程輸出進程id34         sleep(1);35         printf("father process is  exited./n");36     }37     return 0;38 }復制代碼

測試結果如下:

僵尸進程測試程序如下所示:

復制代碼
 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <errno.h> 4 #include <stdlib.h> 5  6 int main() 7 { 8     pid_t pid; 9     pid = fork();10     if (pid < 0)11     {12         perror("fork error:");13         exit(1);14     }15     else if (pid == 0)16     {17         printf("I am child process.I am exiting./n");18         exit(0);19     }20     printf("I am father process.I will sleep two seconds/n");21     //等待子進程先退出22     sleep(2);23     //輸出進程信息24     system("ps -o pid,ppid,state,tty,command");25     printf("father process is exiting./n");26     return 0;27 }復制代碼

測試結果如下所示:

僵尸進程測試2:父進程循環創建子進程,子進程退出,造成多個僵尸進程,程序如下所示:

復制代碼
 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <errno.h> 5  6 int main() 7 { 8     pid_t  pid; 9     //循環創建子進程10     while(1)11     {12         pid = fork();13         if (pid < 0)14         {15             perror("fork error:");16             exit(1);17         }18         else if (pid == 0)19         {20             printf("I am a child process./nI am exiting./n");21             //子進程退出,成為僵尸進程22             exit(0);23         }24         else25         {26             //父進程休眠20s繼續創建子進程27             sleep(20);28             continue;29         }30     }31     return 0;32 }復制代碼

程序測試結果如下所示:

4、僵尸進程解決辦法

(1)通過信號機制

  子進程退出時向父進程發送SIGCHILD信號,父進程處理SIGCHILD信號。在信號處理函數中調用wait進行處理僵尸進程。測試程序如下所示:

復制代碼
 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <errno.h> 4 #include <stdlib.h> 5 #include <signal.h> 6  7 static void sig_child(int signo); 8  9 int main()10 {11     pid_t pid;12     //創建捕捉子進程退出信號13     signal(SIGCHLD,sig_child);14     pid = fork();15     if (pid < 0)16     {17         perror("fork error:");18         exit(1);19     }20     else if (pid == 0)21     {22         printf("I am child process,pid id %d.I am exiting./n",getpid());23         exit(0);24     }25     printf("I am father process.I will sleep two seconds/n");26     //等待子進程先退出27     sleep(2);28     //輸出進程信息29     system("ps -o pid,ppid,state,tty,command");30     printf("father process is exiting./n");31     return 0;32 }33 34 static void sig_child(int signo)35 {36      pid_t        pid;37      int        stat;38      //處理僵尸進程39      while ((pid = waitpid(-1, &stat, WNOHANG)) >0)40             printf("child %d terminated./n", pid);41 }復制代碼

測試結果如下所示:

(2)fork兩次  《Unix 環境高級編程》8.6節說的非常詳細。原理是將子進程成為孤兒進程,從而其的父進程變為init進程,通過init進程可以處理僵尸進程。測試程序如下所示:

復制代碼
 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <errno.h> 5  6 int main() 7 { 8     pid_t  pid; 9     //創建第一個子進程10     pid = fork();11     if (pid < 0)12     {13         perror("fork error:");14         exit(1);15     }16     //第一個子進程17     else if (pid == 0)18     {19         //子進程再創建子進程20         printf("I am the first child process.pid:%d/tppid:%d/n",getpid(),getppid());21         pid = fork();22         if (pid < 0)23         {24             perror("fork error:");25             exit(1);26         }27         //第一個子進程退出28         else if (pid >0)29         {30             printf("first procee is exited./n");31             exit(0);32         }33         //第二個子進程34         //睡眠3s保證第一個子進程退出,這樣第二個子進程的父親就是init進程里35         sleep(3);36         printf("I am the second child process.pid: %d/tppid:%d/n",getpid(),getppid());37         exit(0);38     }39     //父進程處理第一個子進程退出40     if (waitpid(pid, NULL, 0) != pid)41     {42         perror("waitepid error:");43         exit(1);44     }45     exit(0);46     return 0;47 }復制代碼

測試結果如下圖所示:

5、參考資料

《unix環境高級編程》第八章

http://www.rosoo.net/a/201109/15071.html

http://blog.chinaunix.net/uid-1829236-id-3166986.html

http://forkhope.diandian.com/post/2012-10-01/40040574200

http://blog.csdn.net/metasearch/article/details/2498853

http://blog.csdn.net/yuwenliang/article/details/6770750

冷靜思考,勇敢面對,把握未來!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产中文精品字幕自在自线| 亚洲欧洲国产伦综合| 国产美女精品视频免费观看| 欧美激情视频在线| 欧美性猛交xxxx乱大交蜜桃| 91国内产香蕉| 久久久噜噜噜久久久| 久久久精品国产网站| 午夜精品久久久久久久99黑人| 色午夜这里只有精品| 日韩精品免费综合视频在线播放| 亚洲国产精品推荐| 欧美成人精品h版在线观看| 另类天堂视频在线观看| 国内精品小视频| 亚洲精品国精品久久99热一| 亚洲国产97在线精品一区| 国色天香2019中文字幕在线观看| 久久久www成人免费精品| 国产成人av在线播放| 久久999免费视频| 欧美日韩亚洲高清| 久久五月天色综合| 日韩中文娱乐网| 国产精品久久久久久久美男| 国产69精品久久久久99| 亚洲久久久久久久久久| 亚洲精品影视在线观看| 久久精品国产亚洲| 日韩欧美精品在线观看| 日韩av毛片网| 国产精品久久久久久搜索| 久久久女人电视剧免费播放下载| 国产免费一区二区三区香蕉精| 久久成人综合视频| 亚洲人精品午夜在线观看| 国产精品入口福利| 亚洲国产精品久久久久秋霞不卡| 亚洲人成在线免费观看| 精品久久久久久久久久| 亚洲精品一区中文| 亚洲经典中文字幕| 日韩在线中文字幕| 欧美日韩在线视频观看| 欧美精品videos性欧美| 日本欧美国产在线| 亚洲a在线观看| 日韩精品免费在线视频观看| 亚洲色图日韩av| 一本一本久久a久久精品综合小说| 欧美理论在线观看| 日韩高清av一区二区三区| 日韩国产欧美区| 成人免费看黄网站| 在线电影欧美日韩一区二区私密| 国产亚洲欧美日韩精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 77777亚洲午夜久久多人| 黄网动漫久久久| 欧美激情一二区| 正在播放亚洲1区| 亚洲一区二区久久久久久久| 国产精品久久久久久久av大片| 成人免费视频网| 美日韩丰满少妇在线观看| 日韩av综合网| 精品福利免费观看| 午夜欧美大片免费观看| 日韩经典中文字幕| 色综合久综合久久综合久鬼88| 久久久久久久影视| 国产一区欧美二区三区| 亚洲精品动漫久久久久| 国产日韩亚洲欧美| 国产精品偷伦一区二区| 麻豆一区二区在线观看| 成人黄色片网站| 国产日韩精品在线| 国产精品视频精品| 国产丝袜精品视频| 久久久久久亚洲精品不卡| 国产91精品视频在线观看| 欧美成人激情视频免费观看| 久久视频国产精品免费视频在线| 日av在线播放中文不卡| 亚洲精品成人av| 精品日韩视频在线观看| 992tv成人免费影院| 色偷偷偷亚洲综合网另类| 国产精品444| 91精品国产九九九久久久亚洲| 亚洲精品视频在线观看视频| 国产啪精品视频网站| 久久久久日韩精品久久久男男| 欧美性猛交xxxx富婆弯腰| 中文精品99久久国产香蕉| 黄色精品在线看| 亚洲www视频| 欧洲成人免费视频| www.日韩不卡电影av| 理论片在线不卡免费观看| 亚洲国产精品久久久久| 91社影院在线观看| 92国产精品久久久久首页| 国产亚洲日本欧美韩国| 日韩精品高清在线观看| 久久久www成人免费精品| 国产精品久久久久久久久久小说| 国产精品老牛影院在线观看| 欧美日韩中文字幕| 久久精品国产久精国产思思| 色yeye香蕉凹凸一区二区av| 久久久久久久色| 97在线免费观看视频| 国产精品丝袜久久久久久高清| 国产精品久久久久久超碰| 91亚洲精品在线观看| 精品久久久国产精品999| 亚洲国产精品高清久久久| 精品亚洲一区二区三区在线播放| 日韩美女毛茸茸| 日韩在线视频免费观看| 一本一道久久a久久精品逆3p| 国产不卡av在线| 91福利视频在线观看| 国产成人91久久精品| 91国产美女在线观看| 欧美日韩视频在线| 欧美亚洲国产日韩2020| 国产精品免费小视频| 韩国三级日本三级少妇99| 日韩精品极品在线观看| 国产精品久久久久7777婷婷| 成人啪啪免费看| 91精品久久久久久久久中文字幕| 久久久亚洲福利精品午夜| 欧美成人激情视频免费观看| 欧美在线视频观看免费网站| 精品国产精品三级精品av网址| 欧美性xxxx在线播放| 日本不卡视频在线播放| 日韩中文字幕国产精品| 久久国产精品电影| 一区二区三区天堂av| 亚洲精品国产欧美| 日韩中文在线不卡| 久久精品99久久久久久久久| 久久免费视频这里只有精品| 久久久久999| 久久久精品2019中文字幕神马| 精品视频偷偷看在线观看| 欧美另类第一页| 欧美第一淫aaasss性| 欧日韩在线观看| 国产欧美日韩精品专区| 中文字幕av一区二区三区谷原希美| 亚洲jizzjizz日本少妇| 国产亚洲欧洲在线| 国产精品香蕉av| 91精品国产成人www| 久久在线视频在线| 亚洲成色777777在线观看影院| 午夜精品久久久久久久男人的天堂| 91国内精品久久|