-
Notifications
You must be signed in to change notification settings - Fork 0
MS_VirtualAddressSpaceAPI
nishi_74322014 edited this page Aug 3, 2026
·
1 revision
-
TOP > インフラストラクチャ > 仮想メモリ管理
- 仮想アドレス空間の確保のAPI
- スレッドのスタック
仮想アドレス空間の確保のAPIの使い分けについては以下を参照。
Win16 時代の名残で新しい API では使用しなくてよい。
Win16 時代の名残で利用は推奨されないが、
DDE 関数とクリップボード関数では、依然として GlobalAlloc 関数が使われる。
-
GlobalAllocでGMEM_MOVEABLE(移動可能メモリ)を指定すると
メモリのハンドルが返り、それを使用してGlobalLockで仮想アドレスを取得する。 - これにより仮想アドレスへのマップを OS に管理させる事ができる。
- このため、
GlobalFree、GlobalUnlock、GlobalLockで
仮想アドレス上の断片化を発生させないように処理を実装できる。 - ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。
※ Win32 では LocalAlloc / GlobalAlloc はいずれも
内部的に既定のプロセス ヒープ(ヒープ)を使う実装になっており、
両者に実質的な差はない(互換のための API)。
- ページ単位で操作するためアクセス権の設定の面で柔軟である。
- 多量の領域を確保する場合や、領域を予約する場合に利用する。
- 予約では、必要が生じるまで物理メモリを消費することなく、仮想アドレス空間の一定の範囲を予約できる。
- 大量のメモリを必要とするプログラム(DBMS)では、ヒープ・マネージャに頼ることなく
VirtualAllocを使用し自前でバッファ・キャッシュの予約〜コミットの処理を行っている。
※ ヒープ・マネージャも、内部で VirtualAlloc を使用している。
※ 確保の単位は、予約が割り当て粒度(通常 64KB)、コミットがページ(通常 4KB)。
小さな領域を大量に取るとアドレス空間を浪費するため、その用途にはヒープを使う。
- 前述のヒープ = ヒープ・マネージャの実装。
- 内部的に
VirtualAllocを使用している。
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりする。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いが、その分遅い。
ヒープを使うので、通常、malloc 内部で最後に HeapAlloc を呼び出す結果になる。
メモリ プール(ページ プールおよび非ページ プール)を割り当てる API
(カーネル モード用。仮想メモリ管理を参照)。
| API | レイヤ | 主な用途 |
|---|---|---|
LocalAlloc / GlobalAlloc
|
Win32(互換) | 新規では使わない。クリップボード/DDE のみ |
VirtualAlloc |
Win32(ページ単位) | 大きな領域、予約とコミットを分けたい場合、自前のメモリ管理 |
HeapAlloc |
Win32(ヒープ) | 小〜中サイズを多数。汎用 |
malloc / new
|
CRT / C++ | アプリケーション コードの標準的な選択 |
ExAllocatePool2 |
カーネル | ドライバからのプール確保 |
- メモリ管理関数 - Microsoft Learn
- Comparing Memory Allocation Methods - Microsoft Learn
- ヒープに関する話題 - Web-DB プログラミング徹底解説
Tags: Windows, メモリ管理, 障害対応, 性能, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。