Skip to content

MS_VirtualAddressSpaceAPI

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

仮想アドレス空間の確保のAPI

概要

仮想アドレス空間の確保のAPIの使い分けについては以下を参照。

API

LocalAlloc

Win16 時代の名残で新しい API では使用しなくてよい。

GlobalAlloc

Win16 時代の名残で利用は推奨されないが、
DDE 関数とクリップボード関数では、依然として GlobalAlloc 関数が使われる。

  • GlobalAllocGMEM_MOVEABLE(移動可能メモリ)を指定すると
    メモリのハンドルが返り、それを使用して GlobalLock で仮想アドレスを取得する。
  • これにより仮想アドレスへのマップを OS に管理させる事ができる。
  • このため、GlobalFreeGlobalUnlockGlobalLock
    仮想アドレス上の断片化を発生させないように処理を実装できる。
  • ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。

※ Win32 では LocalAlloc / GlobalAlloc はいずれも
内部的に既定のプロセス ヒープ(ヒープ)を使う実装になっており、
両者に実質的な差はない(互換のための API)。

VirtualAlloc

  • ページ単位で操作するためアクセス権の設定の面で柔軟である。
  • 多量の領域を確保する場合や、領域を予約する場合に利用する。
  • 予約では、必要が生じるまで物理メモリを消費することなく、仮想アドレス空間の一定の範囲を予約できる。
  • 大量のメモリを必要とするプログラム(DBMS)では、ヒープ・マネージャに頼ることなく
    VirtualAlloc を使用し自前でバッファ・キャッシュの予約〜コミットの処理を行っている。

※ ヒープ・マネージャも、内部で VirtualAlloc を使用している。

※ 確保の単位は、予約が割り当て粒度(通常 64KB)、コミットがページ(通常 4KB)
小さな領域を大量に取るとアドレス空間を浪費するため、その用途にはヒープを使う。

HeapAlloc

  • 前述のヒープ = ヒープ・マネージャの実装。
  • 内部的に VirtualAlloc を使用している。

malloc (new)

データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりする。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いが、その分遅い。

ヒープを使うので、通常、malloc 内部で最後に HeapAlloc を呼び出す結果になる。

ExAllocatePoolWithTag

メモリ プール(ページ プールおよび非ページ プール)を割り当てる API
(カーネル モード用。仮想メモリ管理を参照)。

使い分けのまとめ

API レイヤ 主な用途
LocalAlloc / GlobalAlloc Win32(互換) 新規では使わない。クリップボード/DDE のみ
VirtualAlloc Win32(ページ単位) 大きな領域、予約とコミットを分けたい場合、自前のメモリ管理
HeapAlloc Win32(ヒープ) 小〜中サイズを多数。汎用
malloc / new CRT / C++ アプリケーション コードの標準的な選択
ExAllocatePool2 カーネル ドライバからのプール確保

参考


Tags: Windows, メモリ管理, 障害対応, 性能, デバッグ

NetDevInfraWiki

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

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally