プロセスに使用可能なメモリがないことが見つかった場合は、状況をどのように処理しますか?

プロセスに使用可能なメモリがないことが見つかった場合は、状況をどのように処理しますか?

特定のプロセスで使用可能なメモリがないことがわかった場合はどうなりますか?

プロセスはジョブを続行するために他のプロセスを終了/再開しますか?

それとも、この場合(より多くのメモリを必要とするプロセス)はどうなりますか?

可能であれば、誰でもこれに関連する良いリンクを提供できますか?

ベストアンサー1

一部の要求ページング仮想メモリシステムでは、オペレーティングシステムは、匿名ページ(つまり、ランタイムデータ、プログラムスタックなどのファイルシステムソースを持たないデータを含むページ)を交換するのに十分なスワップスペースがない場合、割り当てを拒否します。物理メモリを解放するためのページです。この厳密な計算の利点は、各プロセスが割り当てられた数の仮想メモリへのアクセスを保証することです。ただし、これは、使用可能な仮想メモリの量が本質的にスワップスペースのサイズによって制限されることを意味します。

Linuxカーネルのメモリ統計は、プロセスが実際に使用しているメモリ量を追跡して使用するよりも多くのメモリを割り当てる傾向があるプログラムを補償しようとします。過度にコミットする仮想メモリの量。つまり、カーネルが割り当てる仮想メモリの量は、システムの物理メモリとスワップ領域を合わせたものよりも大きくなる可能性があります。実際、これはメモリ割り当てが決してmalloc()失敗しないことを意味します。これにより、物理メモリとスワップ空間をより活用することができますが、使用されているメモリ量が使用可能な物理メモリとスワップ空間の量を超える場合、カーネルはメモリ割り当ての予約を満たすために何らかの方法でメモリリソースを確保する必要があるという欠点があります。

再利用を埋めるためにメモリを回収するカーネルメカニズムを呼び出します。メモリ不足キラー(OOMキラー)。通常、このメカニズムはメモリを大量に消費する「不良」プロセスを終了し、他のプロセスのためにメモリを解放します。 OOM-killerとメモリ計算アルゴリズムの動作をsysctl設定するか、/proc/sys/vm。 0以外の値に設定すると、vm.panic_on_oomシステムメモリが不足するとカーネルにパニックが発生します。

OOM-killer が使用する経験的な方法は、vm.oom_kill_allocating_task設定で変更できます。デフォルトでは、OOM-killer はタスクのリストをチェックし、メモリ集約型の悪意のあるタスクを選択して終了します。 OOM-killerは、メモリ不足状態を引き起こすタスクを終了するように設定することもできます。

カーネルメモリ統計アルゴリズムは設定で調整できますvm.overcommit_memory。デフォルトはオーバーコミット前に弱い経験的チェックを実行することですが、メモリ計算アルゴリズムを厳密モードに設定することもできます。ここで、仮想アドレス空間の制限は、次式vm.overcommit_ratioにより設定される値によって決定される。

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

厳密なメモリ統計を使用するときにページを保存するのに十分な空き物理メモリまたはスワップ領域がない場合、カーネルは匿名ページを割り当てなくなりました。これは、システムが次のことを行う必要があることを意味します。十分なスワップ領域が設定されました。。メモリ予約を満たすのに十分な物理メモリまたはスワップ領域がないと、呼び出しはmalloc()失敗する可能性があります。このような状況で適切な処置プロセスを決定することはプログラム自体に依存する。一部はあきらめて完全に失敗する可能性がありますが、メモリ割り当てが必要なタスクを実行するためには遅くなりますが、メモリ効率の良いアルゴリズムに戻ることもできます。

おすすめ記事