• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            解密“僵尸進(jìn)程”

            Posted on 2008-08-21 18:24 Prayer 閱讀(493) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

            僵尸進(jìn)程
            --是指一個(gè)已經(jīng)終止、但是其父進(jìn)程尚未對其進(jìn)行善后處理(獲取終止進(jìn)程的有關(guān)信息,釋放它仍占用的資源)的進(jìn)程被稱為"僵尸進(jìn)程"(zombie)。

            怎樣產(chǎn)生僵尸進(jìn)程的:
                    一個(gè)進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時(shí)候,其實(shí)它并沒有真正的被銷毀,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit, 它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵尸進(jìn)程,并不能將其完全銷毀)。
                    在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。它需要它的父進(jìn)程來為它收尸,如果他的父進(jìn)程沒安裝SIGCHLD信號處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態(tài),如果這時(shí)父進(jìn)程結(jié)束了,那么init進(jìn)程自動(dòng)會(huì)接手這個(gè)子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵尸進(jìn)程。

            怎么查看僵尸進(jìn)程:
            利用命令ps,可以看到有父進(jìn)程ID為1的進(jìn)程是孤兒進(jìn)程;s(state)狀態(tài)為Z的是僵尸進(jìn)程。

            注意:孤兒進(jìn)程(orphan process)是尚未終止但已停止(相當(dāng)于前臺(tái)掛起)的進(jìn)程,但其父進(jìn)程已經(jīng)終止,由init收養(yǎng);而僵尸進(jìn)程則是已終止的進(jìn)程,其父進(jìn)程不一定終止。

            怎樣來清除僵尸進(jìn)程:
            1.改寫父進(jìn)程,在子進(jìn)程死后要為它收尸。具體做法是接管SIGCHLD信號。子進(jìn)程死后,會(huì)發(fā)送SIGCHLD信號給父進(jìn)程,父進(jìn)程收到此信號后,執(zhí)行 waitpid()函數(shù)為子進(jìn)程收尸。這是基于這樣的原理:就算父進(jìn)程沒有調(diào)用wait,內(nèi)核也會(huì)向它發(fā)送SIGCHLD消息,盡管對的默認(rèn)處理是忽略, 如果想響應(yīng)這個(gè)消息,可以設(shè)置一個(gè)處理函數(shù)。
            2.把父進(jìn)程殺掉。父進(jìn)程死后,僵尸進(jìn)程成為"孤兒進(jìn)程",過繼給1號進(jìn)程init,init始終會(huì)負(fù)責(zé)清理僵尸進(jìn)程,關(guān)機(jī)或重啟后所有僵尸進(jìn)程都會(huì)消失。

            避免Zombie Process的方法:
            1)在SVR4中,如果調(diào)用signal或sigset將SIGCHLD的配置設(shè)置為忽略,則不會(huì)產(chǎn)生僵死子進(jìn)程。另外,使用SVR4版的sigaction,則可設(shè)置SA_NOCLDWAIT標(biāo)志以避免子進(jìn)程僵死。 Linux中也可使用這個(gè),在一個(gè)程序的開始調(diào)用這個(gè)函數(shù)signal(SIGCHLD,SIG_IGN)。
            2)調(diào)用fork兩次。
            3)用waitpid等待子進(jìn)程返回。

            久久久无码精品亚洲日韩京东传媒| 无码人妻少妇久久中文字幕蜜桃| 国内精品久久国产大陆| 99999久久久久久亚洲| 精品免费久久久久国产一区 | jizzjizz国产精品久久| 久久精品中文字幕久久| 中文字幕精品久久| 久久久青草青青亚洲国产免观| 久久精品三级视频| 久久久久AV综合网成人| 久久久久国产精品三级网| 亚洲国产精品久久电影欧美| 久久精品国产一区二区三区不卡| 久久精品亚洲中文字幕无码麻豆| 精品久久国产一区二区三区香蕉 | 亚洲午夜久久久影院| 国产精品激情综合久久| 九九精品99久久久香蕉| 波多野结衣久久| 国产精品一区二区久久精品无码| 亚洲va国产va天堂va久久| 亚洲国产成人乱码精品女人久久久不卡| 久久亚洲美女精品国产精品| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久综合国产乱子伦精品免费| 精品久久久久久无码免费| 国产成人精品久久免费动漫| 伊人久久综合精品无码AV专区| 日韩欧美亚洲综合久久影院Ds| 一本大道久久a久久精品综合| 久久大香香蕉国产| 久久久老熟女一区二区三区| 国产精品久久久香蕉| 久久中文精品无码中文字幕| 久久精品成人影院| 久久精品免费网站网| 人妻丰满?V无码久久不卡| 精品久久久久久99人妻| 久久综合成人网| 久久亚洲AV无码精品色午夜 |