免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Linux的僵尸進程及其解決方法

 Linux的僵尸進程及其解決方法

1. 產(chǎn)生原因:

在UNIX 系統(tǒng)中,一個進程結束了,但是他的父進程沒有等待(調(diào)用wait / waitpid)他,那么他將變成一個僵尸進程。通過ps命令查看其帶有defunct的標志。僵尸進程是一個早已死亡的進程,但在進程表(processs table)中仍占了一個位置(slot)。

但是如果該進程的父進程已經(jīng)先結束了,那么該進程就不會變成僵尸進程。因為每個進程結束的時候,系統(tǒng)都會掃描當前系統(tǒng)中所運行的所有進程,看看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init進程來接管他,成為他的父進程,從而保證每個進程都會有一個父進程。而Init進程會自動wait其子進程,因此被Init接管的所有進程都不會變成僵尸進程。

2. 原理分析:

每個Unix進程在進程表里都有一個進入點(entry),核心進程執(zhí) 行該進程時使用到的一切信息都存儲在進入點。當用 ps 命令察看系統(tǒng)中的進程信息時,看到的就是進程表中的相關數(shù)據(jù)。當以fork()系統(tǒng)調(diào)用建立一個新的進程后,核心進程就會在進程表中給這個新進程分配一個 進入點,然后將相關信息存儲在該進入點所對應的進程表內(nèi)。這些信息中有一項是其父進程的識別碼。

子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程到底什么時候結束。那么會不會因為父進程太忙來不及 wait 子進程,或者說不知道子進程什么時候結束,而丟失子進程結束時的狀態(tài)信息呢?不會。因為UNIX提供了一種機制可以保證,只要父進程想知道子進程結束時的狀態(tài)信息,就可以得到。這種機制就是:當子進程走完了自己的生命周期后,它會執(zhí)行exit()系統(tǒng)調(diào)用,內(nèi)核釋放該進程所有的資源,包括打開的文件,占用的內(nèi)存等。但是仍然為其保留一定的信息(包括進程號the process ID,退出碼exit code,退出狀態(tài)the terminationstatus of the process,運行時間the amount of CPU time taken by the process等),這些數(shù)據(jù)會一直保留到系統(tǒng)將它傳遞給它的父進程為止,直到父進程通過wait / waitpid來取時才釋放。

3.解決方法:

(1) 父進程通過wait和waitpid等函數(shù)等待子進程結束,這會導致父進程掛起。

執(zhí)行wait()或waitpid()系統(tǒng)調(diào)用,則子進程在終止后會立即把它在進程表中的數(shù)據(jù)返回給父進程,此時系統(tǒng)會立即刪除該進入點。在這種情形下就不會產(chǎn)生defunct進程。

(2) 如果父進程很忙,那么可以用signal函數(shù)為SIGCHLD安裝handler。在子進程結束后,父進程會收到該信號,可以在handler中調(diào)用wait回收。

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

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


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux中產(chǎn)生zombie的原因是什么?
fork兩次如何避免僵尸進程收藏
wait WNOHANG 僵尸進程
Linux僵尸進程詳解
《UNIX環(huán)境高級編程》的筆記——wait&waitpid
孤兒進程與僵尸進程[總結]
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服