オペレーティングシステムによって異なります。POSIX (Linux を含む)には、madvise
メモリ パフォーマンスを向上させるためのシステム コールがあります。マニュアルページから:
madvise() システム コールは、アドレス addr で始まる size length バイトのアドレス範囲でのページング入出力の処理方法についてカーネルにアドバイスします。これにより、アプリケーションは、カーネルが適切な先読みおよびキャッシュ技術を選択できるように、マップされたメモリ領域または共有メモリ領域の使用方法をカーネルに伝えることができます。この呼び出しは、アプリケーションのセマンティクスには影響しませんが (MADV_DONTNEED の場合を除く)、パフォーマンスに影響を与える可能性があります。カーネルはアドバイスを自由に無視できます。
詳細については、のマニュアル ページを参照してmadvise
ください。
編集:どうやら、上記の説明は十分に明確ではありませんでした。そのため、ここにいくつかの詳細を示します。そのうちのいくつかは Linux に固有のものです。
を使用mmap
して、ファイルによってサポートされていないメモリ ブロックを (libc ではなく OS から直接) 割り当てることができます。メモリの大きなチャンクの場合、malloc
まったく同じことを行っています。munmap
の使用に関係なく、メモリを解放するために使用する必要がありmadvise
ます。
void* data = ::mmap(nullptr, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
// ...
::munmap(data, size);
このチャンクの一部を取り除きたい場合は、 を使用madvise
してカーネルにそうするように指示できます。
madvise(static_cast<unsigned char*>(data) + 7 * page_size,
3 * page_size, MADV_DONTNEED);
アドレス範囲は引き続き有効ですが、物理 RAM にもストレージにもバックアップされなくなりました。後でページにアクセスすると、カーネルはその場でいくつかの新しいページを割り当て、それらをゼロに再初期化します。Dontneedページもプロセスの仮想メモリ サイズの一部であることに注意してください。オーバーコミットの有効化など、仮想メモリ管理にいくつかの構成変更を加える必要がある場合があります。