0

カードゲームをエミュレートするために、Cでクライアントサーバーアプリを実行しています。これは 1 対 1 のゲームで、クライアントはスレッド ワーカー (マッチごとに 1 つのワーカー) によって支援されてゲームをプレイします。私はいくつかのテストを行おうとしていましたが、ある時点で、まったく理由もなく、サーバー自体がクラッシュしました。コードは、あらゆる方法で安全に終了しようとするチェックでいっぱいです。すべてのコードを投稿することは考えられませんが、これは計算の結果です (同じ結果を得るために 10 回以上繰り返しました)。

worker: Start Playing!
worker: hand number: 0
worker: player pluto playing on port 6!
Killed

考えられる理由は?他の誰かが同じ問題に遭遇しましたか?

4

2 に答える 2

2

これは、プログラムがkill -9他のプログラムまたはスクリプトから取り込まれた場合に発生します。

一般的なミステリアスなプロセス キラーの 1 つは、Linuxのメモリ不足 (OOM) キラーです。Linux では、プログラムがあまりにも多くのメモリを割り当てると、 から NULL が返されなかっmalloc()たり、newオペレーターから例外が返されたりしません。代わりに、あなたのプログラムはおそらくkill -9カーネルによって処理されます。

OOMキラー

Linux には、要求を満たすのに十分なメモリがない場合でも、プロセスが必要なだけ多くのメモリを割り当てることができる、奇妙な (しかし賢明な) ポリシーがあります。これは、多くのプログラムが楽観的に大量のメモリを割り当てますが、実際にはそのすべてのメモリを使用しないためです。Linux では、プログラムは好きなように割り当てることができ、そのメモリにアクセスしようとした場合にのみ、Linux はメモリの存在を確認します。

そうでない場合、カーネルはメモリが使用可能であることをプログラムに通知した (つまりmalloc()、以前に有効なポインターを返した) ため、カーネルはバインドされていますが、現在は嘘に引っかかっています。プログラムにエラーを通知する良い方法はありません。エラーが発生しました。以前に NULL を返す必要がありました。

ここで、OOM キラーの出番です。OOM キラーは、フライトをオーバーブッキングした航空会社のようなもので、料金を支払っている顧客にそのフライトに乗らないよう説得する必要があります。あなたがお金を払ったことは知っていますが、もしかしたら誰かが親切にも後のフライトに乗ってくれるでしょうか?

カーネルはメモリ要求を満たすことができないので、何ができるでしょうか? 「ごめんなさい、嘘をつきました」と言って、現在のプログラムを強制終了することができます。または、現在のプログラムに十分な空き容量ができるまで、他のプログラムを強制終了してメモリを解放することもできます。OOM キラーは、悪い状況をうまく利用しようとします。被害を最小限に抑えるために、どのプログラムを強制終了するのが最適かを判断しようとします。新たに開始されたプログラムが大量のメモリを消費している場合、それが殺されます。これは理にかなっています。プログラムにバグがあり、メモリの割り当てが多すぎる可能性があります。

または、別の可能性を考えてみましょう: あなたのプログラムはまったく問題がありませんが、他のプログラムが正しく動作せず、OOM キラーがあなたのプログラムを強制終了することにしまし

これが起こっているかどうかはわかりません。しかし、「私のプログラムが理由もなく殺されている」と聞くと、私はOOM killerだと思います。

于 2012-10-13T15:18:49.983 に答える
0

"Killed" は、プログラムが を受け取ったときに出力されるメッセージSIGKILLです。SIGKILLキャッチ可能またはマスク可能ではありません。つまり、プログラムを強制終了することが保証されています (SIGKILL通常はシグナル 9 であり、プロセスを強制終了するための一般的なイディオムkill -9 <pid>につながります)。

どこかでトリガーしていない場合kill -9、原因は OOM キラーである可能性があります。@JohnKugelman は、キラーの概要を説明しています。

OOM キラーがプロセスを強制終了したかどうかは、以下を調べることで判断できます/var/log/messages

grep -i 'killed process' /var/log/messages
于 2012-10-13T15:24:21.993 に答える