日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

(转载)Linux僵死进程的产生与避免

發(fā)布時(shí)間:2023/12/9 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转载)Linux僵死进程的产生与避免 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?(轉(zhuǎn)載)http://blog.chinaunix.net/uid-23089249-id-210808.html

一個(gè)進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時(shí)候,其實(shí)它并沒(méi)有真正的被銷毀, 而是留下一個(gè)稱為僵死進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵死進(jìn)程,并不能將其完全銷毀)。

一、僵死進(jìn)程的產(chǎn)生
??? 在每個(gè)進(jìn)程退出的時(shí)候,內(nèi)核釋放該進(jìn)程所有的資源,包括打開(kāi)的文件,占用的內(nèi)存等,但是仍然為其保留一定的信息(包括進(jìn)程號(hào)the process ID,退出狀態(tài)the
termination status of the process,運(yùn)行時(shí)間the amount of CPU time taken by the process等), 直到父進(jìn)程通過(guò)wait/waitpid來(lái)取時(shí)才釋放。此時(shí)該進(jìn)程處于僵死狀態(tài),該進(jìn)程成為僵死進(jìn)程(Zombie Process)。 這保證了父進(jìn)程可以獲取到子進(jìn)程結(jié)束時(shí)的狀態(tài)信息。
??? 在Linux進(jìn)程的狀態(tài)中,僵死進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒(méi)有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵死進(jìn)程不再占有任何內(nèi)存空間。它需要它的父進(jìn)程來(lái)為它收尸,如果他的父進(jìn)程沒(méi)安裝SIGCHLD信號(hào)處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒(méi)有顯式忽略該信號(hào),那么它就一直保持僵死狀態(tài),如果這時(shí)父進(jìn)程結(jié)束了,僵死的子進(jìn)程成為"孤兒進(jìn)程",過(guò)繼給1號(hào)進(jìn)程init,init始終會(huì)負(fù)責(zé)清理僵死進(jìn)程,它產(chǎn)生的所有僵死進(jìn)程也跟著消失(每個(gè)進(jìn)程結(jié)束的時(shí)候,系統(tǒng)都會(huì)掃描當(dāng)前系統(tǒng)中所運(yùn)行的所有進(jìn)程, 看有沒(méi)有哪個(gè)進(jìn)程是剛剛結(jié)束的這個(gè)進(jìn)程的子進(jìn)程,如果是的話,就由Init來(lái)接管他,成為他的父進(jìn)程)。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵死狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵死進(jìn)程。怎么查看僵死進(jìn)程,利用命令ps,可以看到有標(biāo)記為Z的進(jìn)程就是僵死進(jìn)程。

二、僵死進(jìn)程的危害
??? 如果父進(jìn)程不調(diào)用wait/waitpid的話, 那么保留的那段信息就不會(huì)釋放,其進(jìn)程號(hào)會(huì)一定被占用,但是系統(tǒng)所能使用的進(jìn)程號(hào)是有限的,如果產(chǎn)生了大量的僵死進(jìn)程,將因?yàn)闆](méi)有可用的進(jìn)程號(hào)而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進(jìn)程。?

三、僵死進(jìn)程的避免
1、父進(jìn)程通過(guò)wait和waitpid等函數(shù)等待子進(jìn)程結(jié)束,這會(huì)導(dǎo)致父進(jìn)程掛起
2、如果父進(jìn)程很忙,那么可以用signal函數(shù)為SIGCHLD安裝信號(hào)處理函數(shù)。子進(jìn)程結(jié)束后,父進(jìn)程會(huì)收到該信號(hào),可以在信號(hào)處理函數(shù)中調(diào)用wait回收 。
3、如果父進(jìn)程不關(guān)心子進(jìn)程什么時(shí)候結(jié)束,那么可以用signal(SIGCHLD, SIG_IGN)通知內(nèi)核,自己對(duì)子進(jìn)程的結(jié)束不感興趣,那么子進(jìn)程結(jié)束后,內(nèi)核會(huì)回收, 并不再給父進(jìn)程
發(fā)送信號(hào)。
或用sigaction函數(shù)為SIGCHLD設(shè)置SA_NOCLDWAIT,這樣子進(jìn)程結(jié)束后,就不會(huì)進(jìn)入僵死狀態(tài)
?struct sigaction sa;
?sa.sa_handler = SIG_IGN;
?sa.sa_flags = SA_NOCLDWAIT;
?sigemptyset(&sa.sa_mask);
?sigaction(SIGCHLD, &sa, NULL);
4、fork兩次,父進(jìn)程fork一個(gè)子進(jìn)程,然后繼續(xù)工作,子進(jìn)程fork一個(gè)孫進(jìn)程后退出,那么孫進(jìn)程被init接管,孫進(jìn)程結(jié)束后,init會(huì)回收。不過(guò)子進(jìn)程的回收還要父進(jìn)程來(lái)做。

int nStatus; pid_t pid;pid = vfork(); //生成子進(jìn)程if (pid > 0) //父進(jìn)程 {waitpid(pid, &nStatus, 0); //等待子進(jìn)程結(jié)束,否則子進(jìn)程會(huì)成為僵死進(jìn)程,一直存在,即便子進(jìn)程已結(jié)束執(zhí)行 }else if (0 == pid) //子進(jìn)程 {pid = vfork(); //生成孫進(jìn)程if (pid > 0) {exit(0); //子進(jìn)程退出,孫進(jìn)程過(guò)繼給init進(jìn)程,其退出狀態(tài)也由init進(jìn)程處理,與原有父進(jìn)程無(wú)關(guān) }else if (0 == pid) //孫進(jìn)程 {if (execlp("ls", "ls", NULL) < 0){perror("execlp");exit(-1);}}else{ perror("vfork(child)"); } }else{ perror("vfork(parent)"); }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Robotke1/archive/2013/05/01/3053716.html

總結(jié)

以上是生活随笔為你收集整理的(转载)Linux僵死进程的产生与避免的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。