Open棟梁Project - マイクロソフト系技術情報 Wiki

* 目次 [#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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS