Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
仮想アドレス空間の確保のAPIの使い分けについては以下を参照。
API †
LocalAlloc? †
Win16時代の名残で新しいAPIでは使用しなくてよい。
GlobalAlloc? †
Win16時代の名残で利用は推奨されないが、
DDE 関数とクリップボード関数では、依然としてGlobalAlloc?関数が使われる。
- GlobalAlloc?でGMEM_MOVEABLE(移動可能メモリ)を指定すると
メモリのハンドルが返り、それを使用してGlobalLock?で仮想アドレスを取得する。
- これにより仮想アドレスへのマップをOSに管理させる事ができる
- (物理メモリ確保のみの状態 = ワーキングセット)
- (Win16時代は物理メモリのマップをOSに管理させていたが、Win32では、仮想メモリのマップをOSに管理させるようになった)
- このため、GlobalFree?、GlobalUnlock?、GlobalLock?で
仮想アドレス上の断片化を発生させないように処理を実装できる。
- ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。
VirtualAlloc? †
- ページ単位で操作するためアクセス権の設定の面で柔軟である。
- 多量の領域を確保する場合や、領域を予約する場合に利用する。
- 予約では、必要が生じるまで物理メモリを消費することなく、仮想アドレス空間の一定の範囲を予約できる。
- 大量のメモリを必要とするプログラム(DBMS)では、ヒープ・マネージャに頼ることなく
VirtualAlloc?を使用し自前でバッファ・キャッシュの予約~コミットの処理を行っている。
※ ヒープ・マネージャも、内部でVirtualAlloc?を使用している。
HeapAlloc? †
- 前述のヒープ = ヒープ・マネージャの実装。
- 内部的にVirtualAlloc?を使用している。
malloc (new) †
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりする。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いが、その分遅い。
ヒープを使うので、通常、malloc内部で最後にHeapAlloc?を呼び出す結果になる。
ExAllocatePoolWithTag? †
メモリ プール(ページ プールおよび非ページ プール)を割り当てるAPI
参考 †