マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

API

LocalAlloc?

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

GlobalAlloc?

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

  • GlobalAlloc?でGMEM_MOVEABLE(移動可能メモリ)を指定すると
    メモリのハンドルが返り、それを使用してGlobalLock?で仮想アドレスを取得する。
  • これにより仮想アドレスへのマップをOSに管理させる事ができる
    • (物理メモリ確保のみの状態 = ワーキングセット)
    • (Win16時代は物理メモリのマップをOSに管理させていたが、Win32では、仮想メモリのマップをOSに管理させるようになった)
  • このため、GlobalFree?GlobalUnlock?GlobalLock?
    仮想アドレス上の断片化を発生させないように処理を実装できる。
  • ただし、ハンドルリークや、小さいメモリ領域を多数確保する場合は断片化が発生し易い。

VirtualAlloc?

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

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

HeapAlloc?

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

malloc (new)

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

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

ExAllocatePoolWithTag?

メモリ プール(ページ プールおよび非ページ プール)を割り当てるAPI

参考


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-03-27 (月) 13:58:50 (908d)