最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux 僵尸進(jìn)程產(chǎn)生原因及解決方法

 更新時(shí)間:2018年02月27日 10:32:32   作者:sparkdev  
這篇文章主要介紹了Linux 僵尸進(jìn)程產(chǎn)生原因及解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

Linux 允許進(jìn)程查詢內(nèi)核以獲得其父進(jìn)程的 PID,或者其任何子進(jìn)程的執(zhí)行狀態(tài)。例如,進(jìn)程可以創(chuàng)建一個(gè)子進(jìn)程來執(zhí)行特定的任務(wù),然后調(diào)用諸如 wait() 這樣的一些庫函數(shù)檢查子進(jìn)程是否終止。如果子進(jìn)程已經(jīng)終止,那么,它的終止代號(hào)將告訴父進(jìn)程這個(gè)任務(wù)是否已成功地完成。

為了遵循這些設(shè)計(jì)原則,不允許 Linux 內(nèi)核在進(jìn)程一終止后就丟棄包含在進(jìn)程描述符字段中的數(shù)據(jù)。只有父進(jìn)程發(fā)出了與被終止的進(jìn)程相關(guān)的 wait() 類系統(tǒng)調(diào)用之后,才允許這樣做。這就是引入僵死狀態(tài)的原因:盡管從技術(shù)上來說進(jìn)程已死,但必須保存它的描述符,直到父進(jìn)程得到通知。

如果一個(gè)進(jìn)程已經(jīng)終止,但是它的父進(jìn)程尚未調(diào)用 wait() 或 waitpid() 對(duì)它進(jìn)行清理,這時(shí)的進(jìn)程狀態(tài)稱為僵死狀態(tài),處于僵死狀態(tài)的進(jìn)程稱為僵尸進(jìn)程(zombie process)。任何進(jìn)程在剛終止時(shí)都是僵尸進(jìn)程,正常情況下,僵尸進(jìn)程都立刻被父進(jìn)程清理了。

僵尸進(jìn)程是如何產(chǎn)生的

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

但是如果該進(jìn)程的父進(jìn)程已經(jīng)先結(jié)束了,那么該進(jìn)程就不會(huì)變成僵尸進(jìn)程。因?yàn)槊總€(gè)進(jìn)程結(jié)束的時(shí)候,系統(tǒng)都會(huì)掃描當(dāng)前系統(tǒng)中所運(yùn)行的所有進(jìn)程,看看有沒有哪個(gè) 進(jìn)程是剛剛結(jié)束的這個(gè)進(jìn)程的子進(jìn)程,如果是的話,就由Init進(jìn)程來接管他,成為他的父進(jìn)程,從而保證每個(gè)進(jìn)程都會(huì)有一個(gè)父進(jìn)程。而Init進(jìn)程會(huì)自動(dòng) wait其子進(jìn)程,因此被Init接管的所有進(jìn)程都不會(huì)變成僵尸進(jìn)程。

為了觀察到僵尸進(jìn)程,我們自己寫一個(gè)不正常的程序,父進(jìn)程 fork 出子進(jìn)程,子進(jìn)程終止,而父進(jìn)程既不終止也不調(diào)用 wait 清理子進(jìn)程:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int i = 100;
  pid_t pid=fork();
  if(pid < 0)
  {
    perror("fork failed.");
    exit(1);
  }
  if(pid > 0)
  {
    printf("This is the parent process. My PID is %d.\n", getpid());
    for(; i > 0; i--)
    {
      sleep(1);
    }
  }
  else if(pid == 0)
  {
    printf("This is the child process. My PID is: %d. My PPID is: %d.\n", getpid(), getppid());
  }
  return 0;
}

把上面的代碼保存到文件 zomprocdemo.c 文件中,并執(zhí)行下面的命令編譯:

$ gcc zomprocdemo.c -o zomprocdemo

然后運(yùn)行編譯出來的 zomprocdemo 程序:

$ ./zomprocdemo

此時(shí)子進(jìn)程已經(jīng)退出,但是父進(jìn)程沒有退出也沒有通過 wait() 調(diào)用處理子進(jìn)程。我們使用 ps 命令查看進(jìn)程的狀態(tài):

上圖紅框中的大寫字母 "Z" 說明 PID 為 112712 的進(jìn)程此時(shí)處于僵死的狀態(tài)。

讓我們接著往下看!在結(jié)束 sleep 后父進(jìn)程退出。當(dāng)父進(jìn)程退出后,子進(jìn)程會(huì)變成孤兒進(jìn)程,此時(shí)它會(huì)被一個(gè)管理進(jìn)程收養(yǎng)。在不同的系統(tǒng)中,這個(gè)管理進(jìn)程不太一樣,早期一般是 init 進(jìn)程,Ubuntu 上是 upstart,還有近來的 Systemd。但是它們都完成相同的任務(wù),就是 wiat() 這些孤兒進(jìn)程,并最終釋放它們占用的系統(tǒng)進(jìn)程表中的資源。這樣,這些已經(jīng)僵死的孤兒進(jìn)程就徹底的被清除了。

僵尸進(jìn)程的危害

在進(jìn)程退出的時(shí)候,內(nèi)核釋放該進(jìn)程所有的資源,包括打開的文件,占用的內(nèi)存等。但是仍然為其保留一定的信息(包括進(jìn)程號(hào) PID,退出狀態(tài) the termination status of the process,運(yùn)行時(shí)間 the amount of CPU time taken by the process 等)。直到父進(jìn)程通過 wait / waitpid 來取時(shí)才釋放。

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

如何處理僵尸進(jìn)程

僵尸進(jìn)程的產(chǎn)生是因?yàn)楦高M(jìn)程沒有 wait() 子進(jìn)程。所以如果我們自己寫程序的話一定要在父進(jìn)程中通過 wait() 來避免僵尸進(jìn)程的產(chǎn)生。

當(dāng)系統(tǒng)中出現(xiàn)了僵尸進(jìn)程時(shí),我們是無法通過 kill 命令把它清除掉的。但是我們可以殺死它的父進(jìn)程,讓它變成孤兒進(jìn)程,并進(jìn)一步被系統(tǒng)中管理孤兒進(jìn)程的進(jìn)程收養(yǎng)并清理。

下面的 demo 中,父進(jìn)程通過 wait() 等待子進(jìn)程結(jié)束:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  pid_t pid;
  pid = fork();
  if (pid < 0)
  {
    perror("fork failed");
    exit(1);
  }
  if (pid == 0) {
    int i;
     for (i = 3; i > 0; i--)
     {
      printf("This is the child\n");
      sleep(1);
     }
     // exit with code 3 for test.
    exit(3);
  }
  else
  {
    int stat_val;
    wait(&stat_val);
     if (WIFEXITED(stat_val))
     {
       printf("Child exited with code %d\n", WEXITSTATUS(stat_val));
     }      
  }
  return 0;
}

demo 中父進(jìn)程不僅等待子進(jìn)程結(jié)束,還通過 WEXITSTATUS 宏取到了子進(jìn)程的 exit code。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解CentOS中的route命令

    詳解CentOS中的route命令

    這篇文章給大家主要介紹了關(guān)于CentOS中的route命令,文中介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考價(jià)值,有需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-12-12
  • centos 7系統(tǒng)下安裝Jenkins的步驟詳解

    centos 7系統(tǒng)下安裝Jenkins的步驟詳解

    Jenkins是一個(gè)開源軟件項(xiàng)目,是基于Java開發(fā)的一種持續(xù)集成工具,下面這篇文章主要給大家介紹了關(guān)于在centos 7系統(tǒng)下安裝Jenkins的步驟,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Linux下查詢外網(wǎng)IP的幾種方法總結(jié)

    Linux下查詢外網(wǎng)IP的幾種方法總結(jié)

    這篇文章主要介紹了Linux下查詢外網(wǎng)IP的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Linux下如何尋找相同文件的方法

    Linux下如何尋找相同文件的方法

    這篇文章主要介紹了Linux下如何尋找相同文件的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • linux: centos設(shè)置ip以及連接外網(wǎng)的方法

    linux: centos設(shè)置ip以及連接外網(wǎng)的方法

    本篇文章主要介紹了linux: centos設(shè)置ip以及連接外網(wǎng)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Ubuntu部署python3.5的開發(fā)和運(yùn)行環(huán)境

    Ubuntu部署python3.5的開發(fā)和運(yùn)行環(huán)境

    這篇文章主要介紹了Ubuntu部署python3.5的開發(fā)和運(yùn)行環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • 基于Apache?Hudi在Google云構(gòu)建數(shù)據(jù)湖平臺(tái)的思路詳解

    基于Apache?Hudi在Google云構(gòu)建數(shù)據(jù)湖平臺(tái)的思路詳解

    這篇文章主要介紹了基于Apache?Hudi在Google云構(gòu)建數(shù)據(jù)湖平臺(tái),本文提供了有關(guān)如何使用上述工具構(gòu)建基本數(shù)據(jù)管道的基本介紹,需要的朋友可以參考下
    2022-04-04
  • ubuntu下迅雷極速版的安裝與使用

    ubuntu下迅雷極速版的安裝與使用

    Ubuntu是一個(gè)完全基于Linux的操作系統(tǒng),它不但免費(fèi),而且有專業(yè)人員和業(yè)余愛好者共同為其提供技術(shù)支持。迅雷極速版的推出吸引了眾多追求速度的網(wǎng)友關(guān)注。那么這篇文章我們就來學(xué)習(xí)下在ubuntu下迅雷極速版與QQ旋風(fēng)的安裝與使用,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • Linux SecureCRT顯示亂碼解決方案

    Linux SecureCRT顯示亂碼解決方案

    這篇文章主要介紹了Linux SecureCRT顯示亂碼解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • varnish 配置文件分享(sens楊 注釋)

    varnish 配置文件分享(sens楊 注釋)

    varnish 為目前新興起來的軟件,由于中文文檔比較少,配置文件比較復(fù)雜,所以在運(yùn)用起來也是特別的費(fèi)勁。一個(gè)偶然的機(jī)會(huì)在一個(gè)群里,有位varnish高手( sens楊 )發(fā)表了一篇他對(duì)varnish配置文件理解的文檔。對(duì)于學(xué)者來說很有價(jià)值。所以轉(zhuǎn)載了過來
    2016-02-02

最新評(píng)論

琼中| 分宜县| 龙州县| 镇坪县| 锦屏县| 清流县| 阿勒泰市| 兖州市| 绩溪县| 措勤县| 饶河县| 河源市| 永寿县| 桑日县| 长海县| 满洲里市| 安乡县| 即墨市| 揭阳市| 昌都县| 灌阳县| 建始县| 汝南县| 隆回县| 四平市| 和林格尔县| 河间市| 沁水县| 东港市| 岐山县| 溆浦县| 隆尧县| 桐梓县| 商水县| 卫辉市| 五大连池市| 岑溪市| 铁岭县| 沙雅县| 叙永县| 南通市|