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

目次

概要

デスクトップ・ヒープは、ウィンドウステーション内の
デスクトップ・オブジェクト(GDIオブジェクトを除く)を格納する。

構成

デスクトップ・ヒープの構成は以下の通り。

デスクトップ・ヒープのストレージ領域

カーネル・アドレス空間 - セッション・スペース┬->セッション・イメージ・スペース(Session Image Space)
                                       ├->セッション構造(Session Structure)
                                       ├->セッション・ビュー・スペース(Session View Space) ─-> デスクトップ・ヒープ
                                       └->セッション・ページ・プール(Session Page Pool)

デスクトップ・ツリーとデスクトップ・ヒープの構成

┬ Session 0
│ ├--- WinSta0(対話型ウィンドウステーション)
│ │    ├--- Default(対話型デスクトップ)
│ │    ├--- Disconnect(対話型デスクトップ)
│ │    └--- Winlogon(対話型デスクトップ)
│ ├--- Service-0x0-3e7$(非対話型ウィンドウステーション)
│ │    └--- Default(非対話型デスクトップ)
│ ├--- Service-0x0-3e4$(非対話型ウィンドウステーション)
│ │    └--- Default(非対話型デスクトップ)
│ └--- SAWinSta(非対話型ウィンドウステーション)
│      └--- SADesktop(非対話型デスクトップ)
│    
└ Session 1
  └--- WinSta0(対話型ウィンドウステーション)
       ├--- Default(対話型デスクトップ)
       ├--- Disconnect(対話型デスクトップ)
       └--- Winlogon(対話型デスクトップ)

デスクトップ・ヒープの構成

デスクトップ毎のデスクトップ・ヒープ領域は、
システムのデフォルト値および設定されているレジストリの値を元に、

  • 「標準ヒープ」
  • 「対話型ヒープ」、
  • 「非対話型ヒープ」

の3つの領域により構成される。

デスクトップ・ヒープ領域のイメージ

標準ヒープ対話型ヒープ - WinSta0非対話型・・・非対話型ヒープ
各デスクトップ・ヒープ領域の値各デスクトップ・ヒープ領域の値各デスクトップ・ヒープ領域の値・・・各デスクトップ・ヒープ領域の値
全デスクトップ・ヒープの容量

デスクトップ毎にダイナミックに確保される「非対話型ヒープ」の数が、
「全デスクトップ・ヒープの容量」と「各デスクトップ・ヒープ領域の値」で自動的に決定される。

この制約はVista以降で改良されており、「非対話型ヒープ」(全容量)は
デスクトップ・ヒープが、Dynamic Kernel Spaceに実装され、ダイナミックに拡張される。
これにより、「全デスクトップ・ヒープの容量」は、チューニング不要となった。

ただし、「各種デスクトップ・ヒープ」のサイズの問題は発生する。

サーバでは、「標準ヒープ」と「対話型ヒープ」の容量は変更しないため、
「全デスクトップ・ヒープの容量」と「非対話型ヒープの容量」により決定される。

各ヒープの説明

各ヒープの容量

OSによって異なる。

標準ヒープ

  • デスクトップに共有される。
  • USERオブジェクトを保持する。
  • クローバル・ハンドルテーブルや、共有システムの設定が含まれる。
  • 通常、この領域サイズの変更の必要はない。  

対話型ヒープ

セッションに唯一の対話型のウィンドウステーションデスクトップが使用する。
(WinSta0には、Winlogon、Default、Screen-saverの3つのデスクトップがある)

こちらには、USERオブジェクトが格納される。

通常、クライアントOSにてウィンドウの立ち上げすぎなどに起因して
対話型が枯渇することがある(通常、サーバOSでは問題にならない)。

非対話型ヒープ

非対話型のウィンドウステーションデスクトップが使用する。

その他の用語説明

USERオブジェクトとGDIオブジェクト

Windows ウィンドウ マネージャーによって管理される、

  • ウィンドウ要素 (ウィンドウやメニューなど) と
  • グラフィック要素 (ペン、ブラシ、描画領域など) を

表す 2 つのリソース (USER オブジェクトと GDI オブジェクト)

USERオブジェクト

  • ウィンドウ
  • ウィンドウ位置
  • メニュー、アイコン
  • カーソル(マウスの絵)
  • キャレット(TextBox? の I)
  • フック、DDE、アクセラレータ テーブル(メニューのキーボード ショートカット)

などのユーザー インターフェイス要素を表す。

USERオブジェクトの使用するメモリはデスクトップ・ヒープから割り当てられる。

GDIオブジェクト

  • フォント
  • ビットマップ
  • ブラシ
  • ペン
  • デバイス コンテキスト (描画領域)

などのグラフィックス デバイス インターフェイス要素を表す。

GDIオブジェクトの使用するメモリは

  • ページ プール、
  • セッション プール※

から割り当てられる。

USERオブジェクトとGDIオブジェクトの最大値

  • 1つのセッション当たり、其々65,536のユーザ・ハンドルだが、
    1つのセッション当たり開くことができるユーザ・ハンドルの最大数は通常より低い(10,000程度)。
  • さらにユーザ・ハンドルのプロセスごとのデフォルト限界がある。
    どのプロセスも 其々10,000 個以上のUSERオブジェクトとGDIオブジェクトを作成することはできない。

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-10 (木) 18:19:13 (676d)