他の答えに加えて、プログラムが使用していない場合でも、割り当てられたメモリのバッキングを要求するようにLinuxを構成できます。
ただし、メモリのオーバーコミットとOOMキラーの恐れは、Linuxエクスペリエンスの必要な部分ではありません。sysctlパラメータvm / overcommit_memoryを2に設定するだけで、オーバーコミット動作がオフになり、OOMキラーが永久にベイに保持されます。ほとんどの最新のシステムには、ほとんどの状況で十分なスワップファイルを提供するのに十分なディスク領域が必要です。オーバーコミットされたメモリが不足したときにペットプロセスが強制終了されないようにするのではなく、状況を完全に回避する方が簡単な場合があります。[ OOMキラーから一休み ]
プログラムがメモリを割り当てる場合、カーネルは単にスワップのより多くのページをコミット済みとしてマークできます。この指標はカーネルのメモリマネージャーに保存されます。実際のディスク領域はまだ変更されていません。そのメモリが使用されるまで、実際には何も交換する必要はありません。それらが使用されない場合、スワップの使用はパフォーマンスに影響を与えることなく変動します。
プロセスには独自のアドレス空間または「ビュー」が表示されるため(これが最初にswapが機能する方法です)、カーネルはそれを管理する方法に多くの余裕があります。上記のリンク先の記事のフォークの例を使用すると、未使用の大量のメモリを新たに割り当てるよりも共有メモリページを使用する可能性がはるかに高いため、メモリをコピーオンライトに割り当てて、スワップの使用数を増やすことができます。それが実際に書き込まれるとき(これは起こらないかもしれません)、その「コミットされたスワップ」は、未使用のRAMに置き換えることができます(RAMの使用を増やし、スワップの使用を減らします)。500MBが割り当てられ、すべてまたはほとんどすべてのRAMが使用されているマシンでforkするプロセスを想像してください。スワップで500MBが利用可能であり(ディスク容量が安い場合、今日のTBドライブの1%はどれくらいの大きさですか?:P)、メモリをコピーする必要はありません(まだ、
したがって、OOMキラーの可能性は回避され、メモリ割り当て(forkのようなものによる「暗黙の」割り当てを含む)がすぐに成功または失敗するという仮定でほとんどのソフトウェアを設計することははるかに簡単です。交換すると、パフォーマンスに影響を与える可能性があります。その影響はほとんど常にわずかですが、最悪の場合、スワップスラッシングにつながります(完全なカーネルクラッシュやOOMキラーよりも好ましい場合があります)。
Linuxのメモリマネージャがどのように機能するかについての正確な詳細はわかりませんが、この答えは私自身の一般的な理解であり、長年にわたって読んだことを覚えています。私はこの回答を再編集しようとしたので、OS設計の最小限の理解が必要です(これはかなり複雑であり、私自身にはあまり興味がありません)。それがどのように改善できるかを見て、私に知らせてください。握手に関して、それはそれほど恥ずかしいほど基本的な質問ではないかもしれません。