私が読んでいるLinuxプログラミングインターフェース。
49.9MAP_NORESERVE およびスワップ領域超過割り当て
一部のアプリケーションは大規模な(しばしば非公開の匿名)マップを生成しますが、マップされた領域の小さな部分のみを使用します。たとえば、いくつかの種類の科学アプリケーションは非常に大きな配列を割り当てますが、配列から離れている少数の要素(いわゆる希少配列)でのみ機能します。
カーネルが常にマップ全体に十分なスワップスペースを割り当て(または予約)すると、大量のスワップスペースが無駄になる可能性があります。代わりに、カーネルは実際に必要なときにのみ(つまり、アプリケーションがページにアクセスするとき)、マップされたページのスワップスペースを予約できます。この方法は怠惰なスワップ予約、アプリケーションで使用される仮想メモリ全体が、RAMの合計サイズにスワップ領域を加えたサイズを超える可能性があるという利点があります。
つまり、遅延スワップ予約によってスワップスペースが過度に割り当てられる可能性があります。このアプローチは、すべてのプロセスがマップの全範囲にアクセスしようとしない限り、うまく機能します。 ...
私が知る限り、スワップスペースはメモリスワッピング用に予約されたディスクスペースです。メモリ内のこれらのページが非アクティブの場合は、次のページに置き換えられます。スワップスペースディスクに。これはメモリ/RAMのL2キャッシュと同じです。
だからこれは何ですか?怠惰なスワップ予約器具?
たとえば、私の混乱をお見せしましょう。
一部のアプリケーションは、大規模(しばしば非公開匿名)マップを生成します。
malloc
さて、そうであれば、大きなバイト配列16384(4096*4)
(大きな(通常は個人の匿名)マップの生成)があり、配列から広く分離されたいくつかの要素でのみ動作すると仮定します。
これにより、一部の非アクティブページがスワップ領域にスワップされます。そうですか?メモリ内の他のすべての非アクティブページがスワップ領域にスワップされているとします0-4095(4096B)
。8192-12287(4096B)
4096-8191(4096B)
12288-16383(4096B)
それでは、この文はどういう意味ですか?
代わりに、カーネルは実際に必要なときにのみ(つまり、アプリケーションがページにアクセスするとき)、マップされたページのスワップスペースを予約できます。
これらの非アクティブページ(4096-8191(4096B)
および12288-16383(4096B)
)がまだオンになっていない場合スワップスペース?テキストは、スワップ空間に使用される3番目のレベルのキャッシュがあることを示すようです。
memory -> swap space (disk) -> ????
ベストアンサー1
スワップは真のインメモリL2キャッシュではありません。メモリ用の複数のバックアップストアの1つです。。カーネルが物理メモリページを割り当てる必要がありますが、利用可能なメモリが十分でない場合は、他のページを削除する必要があります。これは、削除されたページの内容を削除できる場合、または他の場所から回復できる場合にのみ実行できます。他の場所にバックアップストアがあります。これはディスク上のファイルです。例えば実行可能ファイルまたはマップされたファイルの場合)または特定のスワップ領域。
交換予約超過コミットを追跡すると、メモリ計算が機能します(表49-4を参照)。LPI)。オーバーコミットが許可されていない場合、カーネルは割り当て時に割り当てが可能かどうかを判断する必要があります。プライベート書き込み可能マッピングと共有匿名マッピングの場合、これは十分なアドレス空間と十分なスワップ空間が必要であることを意味します(カーネルがマッピングされたメモリの内容がそこに書き込まれることを保証することができるため、マッピングされたメモリへの書き込みが保証されています)。決して)は発生しませんSIGSEGV
。
オーバーコミットには遅延スワップ予約が必要です。これは、カーネルがそのスワップスペースを予約せずにスワップ対応メモリマップを割り当てることができることを意味します。で述べたようにLPIを使用すると、プログラムは実際に使用可能なメモリよりもはるかに多くのメモリを割り当てることができ、を使用して要求する必要がありますMAP_NORESERVE
。保存はページへの書き込み中にのみ発生します。これは、書き込みが失敗SIGSEGV
し、OOMキラーが介入できることを意味します。
これは、16KiBの例よりもはるかに大きな割り当てに重要です。プログラムを簡単に作成できるように、まれな64GiB、262,144×262,144の配列が欲しいと想像してください。厳格な予約では使用可能なすべてのメモリが必要ですが、厳密に予約しない限り実際に書き込むページのみが可能です。割り当てられます。
これはすべてLinuxにのみ適用され、/proc/sys/vm/overcommit_memory
選択したシステムオーバーコミットポリシーと密接に関連しています。モード1(常にオーバーコミット)と2(オーバーコミットしない)ではMAP_NORESERVE
何も変更されず、モード0でのみ有効です。