17

ゾンビプロセスについていくつか質問があります

  • ゾンビ プロセスの概念から得られるメリットは何ですか?
  • カーネルがゾンビプロセスの (PID、終了ステータス、リソース使用情報) を保持していることを知っている
    「リソース使用情報」の意味は何ですか
  • どのようにゾンビの PPID() = 1 であり、それがまだゾンビであるか (init はデフォルトで wait() であるため、ゾンビをリープします) 、C コードを記述して、親であるゾンビを Init にすることは
    できますか?
  • ゾンビはメモリのロックを解放することを拒否できますか??

前もって感謝します

4

4 に答える 4

16

-- ゾンビ プロセスの概念から得られるメリットは何ですか?

waitゾンビ プロセスは、pid、終了ステータス、および親がシステム コールのファミリの1 つを使用して最終ステータスを取得するまで保持される一部のアカウンティング情報です。親が子のプロセス ID を呼び出すまで、wait他のプロセスが割り当てられないように、子のプロセス ID は使用済みとしてマークされたままにする必要があります。別のプロセスにリサイクルされた pid が割り当てられた場合、それと同じ pid を持つ以前のプロセスとの違いを見分けるのは困難です。一度wait親によって呼び出され、最終的な終了ステータスを返します。誰もその pid で子を再び探しに行くことはないと想定できるため、pid は再利用される可能性があります。(Linuxでは、親がSIGCHLDをSIG_IGNのままにしておくと、カーネルはゾンビを保持しませんが、SIGCHLDの性質をSIG_IGNとして再登録しても同じ効果はありません)

-- カーネルがゾンビ プロセスの (PID、終了ステータス、リソース使用情報) を保持していることを知っています。「リソース使用情報」の意味は何ですか?

この情報の一部は、プログラムを次のように実行するものです。

time my_program

報告します。これらの値は通常、SIGCHLD の siginfo 構造体で報告されますが (正確には への呼び出しではありません) 、systme 呼び出しの形式waitへの呼び出しからも利用できます (システムによっては)。この構造については、 を参照waitidしてください。man sigaction

-- どのようにゾンビの PPID() = 1 であり、ゾンビのままか (init はデフォルトで wait() であるため、ゾンビをリープします)

ppid = 1 のゾンビは、 initがかなり迅速に刈り取る必要があるため、長時間ゾンビのままであってはなりません。プロセスは、親が呼び出して最終ステータスを取得するexitまで、(プロセスを強制終了する unhanded シグナルを介して、またはプロセスを強制終了することによって) 死亡した直後の時点からゾンビのままになります。waitこれは、init が何もせずに init を何度も呼び出したとしても、プロセスがゾンビとして現れる可能性があるわずかな時間がある可能性があることを意味します。プロセスがinit (0=ppid) の子として長時間 (秒) 表示される場合は、おそらく何かが間違っています。

-- ゾンビの親を Init にする C コードを書ける人はいますか?

これは明確ではありませんが、あなたが望むと思います:

pid_t f = fork();
if (f > 0) {
    exit(0); // this is the parent dying, so the child will be an orphan
             // and get adopted by init
} else if (f == 0) {
    sleep(100); // This is the child doing something that takes enough time for
                // its parent to commit suicide (exit(0)) and then for you to
                // observe that it has now been adopted by init
    exit(0);    // And now it dies as well, so init should reap its status, but
                // it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */

-- ゾンビはメモリのロックを解放することを拒否できますか??

ゾンビはほとんどのものをつかむことができません。それらはすべてのメモリ ページを失い、開いているファイル ハンドルなどを失います。オペレーティングシステムが解放する方法を理解できるほとんどすべてのものは、解放されるべきです。そうしないとバグになりますが、OS はそれが解放されるはずのものであることを認識している必要があることを覚えておいてください。ユーザー空間にリソースを作成するのは非常に簡単で、OS が解放すべきことを認識していないプログラムが終了したときに解放する必要があります。

于 2010-10-04T18:15:58.413 に答える
4

ゾンビ プロセスは、純粋に pid と終了ステータスの値です。リソース (pid) が親に「属している」ため、pid を解放できません。解放された場合、別のプロセスに同じ pid が割り当てられ、親プロセスが関連のないプロセスにシグナルを送信する可能性があります。親が最初に子が終了したかどうかを判断するのを待っていたとしても、競合状態を回避する方法はありません。

于 2010-10-04T17:34:00.773 に答える
3

実行中のプロセスのリスト内でゾンビ プロセスを表示することに関心がある場合は、次のコマンドを使用します。

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

int main(void)
{
    pid_t p = fork();   // creates child process and stores the returned PID

    if (p != 0)         // executed by parent process
    {   sleep(1);       /* the child process terminates while the parent process sleeps,
                           the child then becomes a zombie process because the returned status
                           of the terminated child process isn't checked via a wait() */

        system("ps -eo pid,ppid,stat,cmd");  // prints a list of processes in your terminal

    }
    else        // executed by child process
    {
        exit(0);        // the child process terminates immediately
    }

    return 0;
}

リスト内の Z+ でゾンビ プロセスを識別できます。

ゾンビプロセスのスクリーンショット

注: Windows を使用している場合は、コードを変更する必要があります。

于 2016-11-18T23:09:34.423 に答える