<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 的僵尸(zombie)進(jìn)程

          共 844字,需瀏覽 2分鐘

           ·

          2020-03-29 23:24

          7f993b885124feae58e6d7378d09bc7a.webp637ac41baebd6294f5dd59a57d4e8ba8.webp


          點(diǎn)擊「閱讀原文」查看良許原創(chuàng)精品視頻。

          鏈接:https://coolshell.cn/articles/656.html

          4dfefda3242140c7e366d8d9a1c95db8.webp

          可能很少有人意識(shí)到,在一個(gè)進(jìn)程調(diào)用了exit之后,該進(jìn)程 并非馬上就消失掉,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)。


          在Linux進(jìn)程的5種狀態(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)程的來由,要追溯到Unix,Unix的設(shè)計(jì)者們設(shè)計(jì)這個(gè)東西并非是因?yàn)殚e來無事想裝裝酷什么的。上面說到,僵尸進(jìn)程中保存著很多對程序員和系統(tǒng)管理員非常重要的信息,首先,這個(gè)進(jìn)程是怎么死亡的?是正常退出呢,還是出現(xiàn)了錯(cuò)誤,還是被其它進(jìn)程強(qiáng)迫退出的?也就是說,這個(gè)程序的退出碼是什么?其次,這個(gè)進(jìn)程占用的總系統(tǒng)CPU時(shí)間和總用戶CPU時(shí)間分別是多少?發(fā)生頁錯(cuò)誤的數(shù)目和收到信號(hào)的數(shù)目。這些信息都被存儲(chǔ)在僵尸進(jìn)程中,試想如果沒有僵尸進(jìn)程,進(jìn)程執(zhí)行多長我們并不知道,一旦其退出,所有與之相關(guān)的信息都立刻都從系統(tǒng)中清除,而如果此時(shí)父進(jìn)程或系統(tǒng)管理員需要用到,就只好干瞪眼了。


          所以,進(jìn)程退出后,系統(tǒng)會(huì)把該進(jìn)程的狀態(tài)變成Zombie,然后給上一定的時(shí)間等著父進(jìn)程來收集其退出信息,因?yàn)榭赡芨高M(jìn)程正忙于別的事情來不及收集,所以,使用Zombie狀態(tài)表示進(jìn)程退出了,正在等待父進(jìn)程收集信息中。


          Zombie進(jìn)程不可以用kill命令清除,因?yàn)檫M(jìn)程已退出,如果需要清除這樣的進(jìn)程,那么需要清除其父進(jìn)程,或是等很長的時(shí)間后被內(nèi)核清除。因?yàn)閆ombie的進(jìn)程還占著個(gè)進(jìn)程ID號(hào)呢,這樣的進(jìn)程如果很多的話,不利于系統(tǒng)的進(jìn)程調(diào)度。

          下面,讓我們來看看一個(gè)示例:

          #include 
          #include main()
          {
          pid_t pid;
          pid=fork();
          if(pid<0) { printf("error occurred!\n");
          }else if(pid==0){ exit(0);
          }else{ sleep(60); wait(NULL);
          }
          }

          編譯這個(gè)程序:

          $ cc zombie.c -o zombie

          后臺(tái)運(yùn)行程序,以使我們能夠執(zhí)行下一條命令

          $ ./zombie &[1] 1217

          列一下系統(tǒng)內(nèi)的進(jìn)程

          $ ps -ax
          ...?...1137???pts/0???S???0:00???-bash1217???pts/0???S???0:00???./zombie1218???pts/0???Z???0:00???[zombie]1578 pts/0 R 0:00 ps -ax

          其中的”Z”就是僵尸進(jìn)程的標(biāo)志,它表示1218號(hào)進(jìn)程現(xiàn)在就是一個(gè)僵尸進(jìn)程。

          收集Zombie進(jìn)程的信息,并終結(jié)這些僵尸進(jìn)程,需要我們在父進(jìn)程中使用waitpid調(diào)用和wait調(diào)用。這兩者的作用都是收集僵尸進(jìn)程留下的信息,同時(shí)使這個(gè)進(jìn)程徹底消失。

          -?END -

          良許個(gè)人微信


          添加良許個(gè)人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號(hào)全部博文已整理成一個(gè)目錄,請?jiān)诠娞?hào)里回復(fù)「m」獲取!

          推薦閱讀:

          再來一個(gè)吊打百度網(wǎng)盤的開源神器,還是99年妹子開發(fā)的

          十分鐘了解 git 那些“不常用”命令

          這才是你需要的C語言、C++學(xué)習(xí)路線!


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取!!


          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人久久影音 | 久久鲁欧美 | 女人18片毛片120分钟 | www.青青草 | 视频一区在线观看视频 |