6

大規模なメモリ領域 (メガバイト) を大きなアラインメント (メガバイト範囲の可能性もあります) で割り当てる必要があります。関数の VirtualAlloc ファミリは、これを行うためのオプションを提供していないようです。

これを達成するために Linux で行うことは、より大きな領域を mmap することです (必要なアライメントを備えた十分に大きな領域が含まれることを保証するのに十分な大きさです)。必要ありません。

例として、4 メガバイトが必要で、1 メガバイトの境界 (つまり、最下位 20 ビットにゼロがある領域の開始) に配置されているとします。私は5メガバイトをmmapします。リージョン 0x44ff000-0x49ff000 を取得するとします。その領域内には、1 メガバイト境界に配置された領域 0x4500000 ~ 0x4900000 が含まれています。次に、0x44ff000-0x4500000 と 0x4900000-0x49ff000 を munmap します。

Win32で同様のことを行うことはできますか? PAGE_NOACCESS で VirtualProtect を使用すると、メモリは解放されますか? より良い解決策はありますか?

4

2 に答える 2

8

はい、同じテクニックを使用できます。VirtualAllocのように広い範囲MEM_RESERVEVirtualAlloc適切に配置されたサブ範囲を見つけ、そのサブ範囲で を使用してもう一度呼び出しますMEM_COMMIT

于 2011-10-01T01:06:40.143 に答える
0

_aligned_mallocWindows / MSVC crtのソースを見てください。同じ方法を使用して仮想メモリを調整するのは非常に簡単です。内部malloc呼び出しを置き換えるだけです(同じように_aligned_free)、これにより、 1回のシステムコールでの割り当てが可能になります。

しかし、なぜこのような大規模な調整が必要なのですか?高速メモリブロックスラブのアドレスビットパターンを悪用しようとしていますか?

于 2011-10-01T05:55:26.120 に答える