Open棟梁Project - マイクロソフト系技術情報 Wiki * 目次 [#w723b692] #contents *概要 [#nffd2652] 仮想アドレス空間の確保のAPIの使い分けについては以下を参照。 -二流プログラマの三流な日常 HeapAllocとVirtualAllocの使いどころ~ http://konuma.txt-nifty.com/blog/2006/03/heapallocvirtua_5d49.html -ヒープに関する話題 - Web-DB プログラミング徹底解説~ http://keicode.com/windows/win11.php *LocalAlloc [#a4dca8c7] Win16時代の名残で新しいAPIでは使用しなくてよい。 *GlobalAlloc [#qef612e1] Win16時代の名残で利用は推奨されないが、~ DDE 関数とクリップボード関数では、依然としてGlobalAlloc関数が使われる。 GlobalAllocでGMEM_MOVEABLE(移動可能メモリ)を指定すると メモリのハンドルが返り、それを使用してGlobalLockで仮想アドレスを取得する。 これにより仮想アドレスへのマップをOSに管理させる事ができる(物理メモリ確保のみの状態 = ワーキングセット)。 (Win16時代は物理メモリのマップをOSに管理させていたが、Win32では、仮想メモリのマップをOSに管理させるようになった。) このため、GlobalFree、GlobalUnlock、GlobalLockで仮想アドレス上の断片化を発生させないように処理を実装できる。 ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。 *VirtualAlloc [#gaa20581] -ページ単位で操作するためアクセス権の設定の面で柔軟である。 -多量の領域を確保する場合や、領域を予約する場合に利用する。 -予約では、必要が生じるまで物理メモリを消費することなく、仮想アドレス空間の一定の範囲を予約できる。 ※ ヒープ・マネージャも、内部でVirtualAllocを使用している。 -大量のメモリを必要とするプログラム(DBMS)では、ヒープ・マネージャに頼ることなく~ VirtualAllocを使用し自前でバッファの予約~コミットの処理を行っている。 *HeapAlloc [#b5014a2e] -前述のヒープ = ヒープ・マネージャの実装。 -内部的にVirtualAllocを使用している。 ただし、大量の異なるサイズの領域確保・解放を繰り返す場合は、断片化が発生する。~ ADO(MDAC)を使用して、大量データの結果セットを取得・解放を繰り替えすプログラムで~ ADO(MDAC)の追加メモリを倍々でReservedするアルゴリズムによりに断片化が発生した事例がある。 *malloc (new) [#m30f99b4] データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりする。~ またマルチスレッドに対する耐性があるバージョンも存在し、賢いが、その分遅い。~ 一般的には最後にHeapAllocを呼び出す結果になる。 *ExAllocatePoolWithTag [#r5b1da04] メモリ プール(ページ プールおよび非ページ プール)を割り当てるAPI