47

Windows には VirtualAlloc があり、アドレス空間の連続した領域を予約できますが、実際には物理メモリを使用しません。後でそれ (またはその一部) を使用する場合は、再度 VirtualAlloc を呼び出して、以前に予約したページの領域をコミットします。

これは実際には非常に便利ですが、最終的にはアプリケーションを Linux に移植したいので、後で移植できない場合は使用したくありません。Linuxにはこれを行う方法がありますか?

編集 - ユースケース

4 GB などの仮想アドレス空間を割り当てることを考えていますが、一度に 64K しかコミットしません。これにより、アレイを最大 4 GB までゼロコピーする方法が得られます。これは重要です。通常、配列サイズとコピーを 2 倍にすると、非常に大きな配列の許容できないレイテンシがランダムに発生するように見えるからです。

4

4 に答える 4

39

のような特別なファイルをmmap/dev/zero (または MAP_ANONYMOUS を使用) しPROT_NONE、後でmprotectを使用してコミットします。

于 2010-05-06T17:00:30.820 に答える
6

カーネルのオーバーコミットを使用して、システム全体でこの機能を有効にすることができます。これは通常、多くのディストリビューションでのデフォルト設定です。

ここに説明があります http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting

于 2010-05-06T16:37:56.467 に答える
4

VirtualAlloc()に相当する Linuxはmmap()で、同じ動作を提供します。ただし、コメンターが指摘しているように、メモリが初期化されていない限り(calloc()やユーザーコードなどによって)、連続したメモリの予約はmalloc()への呼び出しの動作です。

于 2010-05-06T17:11:01.770 に答える
1

「非常に大きな配列の場合、一見ランダムで許容できないレイテンシー

MAP_LOCKEDページングの影響を軽減するためにmlock() または mmap() + を検討することもできます。多くの CPU は、巨大な (ラージとも呼ばれる) ページ、つまり 4kb を超えるページをサポートしています。これらの大きなページは、ストリーミングの読み取り/書き込みに対する TLB の影響を軽減できます。

于 2010-05-06T17:53:16.710 に答える