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