web-dev-qa-db-ja.com

ゾンビとは何ですか?その原因は何ですか?ゾンビプロセスとゾンビオブジェクトはありますか?

ゾンビについての質問はありますが、ゾンビとは何か、なぜ、どのように発生するのかを直接説明するものはありません。特定の質問に答えるという文脈でゾンビプロセスが何であるかを扱っているが、原因を扱っていないカップルがいます。

ゾンビプロセスに関する質問やObjective-C/Cocoa関連のゾンビオブジェクトに関する質問もあります。違いは何ですか、またはこれらはどのように関連していますか? Mac/iPhoneの「EXEC_BAD_ACCESS」(または他のプラットフォームの同様のエラー)はゾンビと同義ですか?

どうすればゾンビを防止できますか?ゾンビを回避するのに役立つベストプラクティスはありますか?

この情報を1か所にまとめておくと便利です。この質問は、可能であれば、プラットフォーム/言語に依存しないことを目的としています。

35
yabada

ゾンビプロセスとゾンビオブジェクトはまったく関係ありません。ゾンビプロセスは、親が子プロセスを開始し、子プロセスが終了するが、親が子の終了コードを取得しない場合です。プロセスオブジェクトは、これが発生するまで存在し続ける必要があります-リソースを消費せず、死んでいますが、まだ存在しています-したがって、「ゾンビ」です。

ゾンビobjectsは、メモリエラーをキャッチするのに役立つCocoa/CoreFoundationのデバッグ機能です。通常、オブジェクトのrefcountがゼロに低下すると、すぐに解放されますが、デバッグが困難になります。代わりに、ゾンビオブジェクトが有効になっている場合、オブジェクトのメモリはすぐには解放されず、ゾンビとしてマークされ、それ以上の使用の試みはログに記録され、オブジェクトがその存続期間を過ぎて使用されたコードの場所を追跡できます。 。

EXEC_BAD_ACCESSは、私が行った場合のように、ありふれた「不良ポインタを使用しました」という例外です。

(*(0x42)) = 5;
36
Ana Betts

プロセスが終了しても、その状態の多くはカーネル内にまだ存在します。これは、その親が、どこかに格納する必要がある戻り値など、いくつかのことを確認したい場合があるためです。親がwait()またはwaitpid()を呼び出すと、カーネルはそれをすべて破棄するように指示します。そうするまで、子はpidを保持し、リソースを使い果たします。これらの未到達の子プロセスはゾンビと呼ばれます。ゾンビを殺してもそれは削除されませんが、親がゾンビを刈り取る(待つ)必要があります。親が死んだ場合、それらはunixシステムの「init」に渡されます。unixシステムの唯一の仕事は、それらがクリーンアップされるのを待つことです。

「ゾンビオブジェクト」については聞いたことがありませんが、ガベージコレクターによってクリーンアップされていないもの、循環参照などがあり、クリーンアップされないものを指していると思います。ガベージコレクターによってアップ。比喩は非常に似ています:特定のレベルでfork()== malloc()、wait()== free()。 (もちろん、完璧な比喩ではありません。)

8
eruciform