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

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

特定のプロセスで使用できるメモリがないことが判明した場合、何が起こりますか?

そのプロセスは、タスクを続行するために別のプロセスを終了/再起動しますか?

あるいは、この状況で(より多くのメモリを必要とする)プロセスは何を行うでしょうか?

可能であれば、これに関する良いリンクを提供してもらえますか?

答え1

一部のデマンド ページング仮想メモリ システムでは、物理メモリを解放するためにページをスワップ アウトするのに十分なスワップ領域がない限り、オペレーティング システムは匿名ページ (つまり、実行時データ、プログラム スタックなど、ファイル システム ソースのないデータを含むページ) の割り当てを拒否します。この厳密な計算には、各プロセスが割り当てた仮想メモリへのアクセスが保証されるという利点がありますが、使用可能な仮想メモリの量は基本的にスワップ領域のサイズによって制限されるということでもあります。

Linuxカーネルのメモリアカウンティングは、プロセスが実際に使用しているメモリの量を追跡することで、使用するよりも多くのメモリを割り当てる傾向があるプログラムを補正しようとします。オーバーコミット仮想メモリの量。言い換えると、カーネルによって割り当てられる仮想メモリの量は、システム上の物理メモリとスワップ領域の合計量を超える可能性があります。実際には、これはメモリ割り当てmalloc()が失敗しないことを意味します。これにより、物理メモリとスワップ領域の利用率が向上しますが、使用中のメモリの量が物理メモリと使用可能なスワップ領域の量を超えると、カーネルはメモリ割り当てのコミットメントを満たすために何らかの方法でメモリ リソースを解放する必要があるという欠点があります。

オーバーコミットを埋めるためにメモリを回収するために使用されるカーネルメカニズムは、メモリ不足キラー(OOMキラー)。通常、このメカニズムはメモリを大量に消費する「不正な」プロセスを強制終了し、他のプロセスのためにメモリを解放します。OOMキラーとメモリ計算アルゴリズムの動作は、sysctl設定または/proc/sys/vmvm.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()失敗する可能性があります。このような場合、適切なアクションを決定するのはプログラム自体の責任です。あきらめて完全に失敗する場合もありますが、メモリ割り当てを必要とするアクションを実行するために、より低速だがメモリ効率の高いアルゴリズムにフォールバックすることもできます。

答え2

それは、プログラムが何を行うように設定されているかによって異なります。単純なプログラムは、十分なメモリを割り当てられない場合、エラー メッセージを出力して終了します。一部のプログラムは、独自にメモリの一部を解放して再試行します。一部のプログラムは、終了する前に緊急状態保存を実行します。一部のプログラムは、何らかのコマンドを実行できなかったことをユーザーに通知した後、何らかの方法で実行を続け、余分なメモリなしで間に合わせます。

プロセスは原理的には別のプロセスを強制終了できますが、これは非常に奇妙な動作です。プロセスはどのプロセスを強制終了するかを知る方法がなく、そのプロセスのメモリを取得できるという保証もありません。

もし、カーネルによってメモリ不足が検出されましたアプリケーションではなく、カーネルが複雑なヒューリスティック(「強制終了しないsshd」など)に基づいて一部のプロセスを強制終了する場合があります。

関連情報