注1:Windowsカーネルについての詳しい本を読んだことがないので、いくつか誤りがあるかもしれません。
注2:具体的な設定方法にはあえて触れていません。参考サイトを熟読なさった上で自己責任のもとでお願いします。

○Windows9xのシステムリソースの話
システムリソース。
Windows95や98、もしくはそれ以前から利用しているユーザーなら多くの人が悩まされただろう。
(かくいう私は通常の使用では一度も悩まされたことはないのだが。)

ここで言うシステムリソースとはUSERリソース(ウィンドウ管理のための作業メモリ)とGDIリソース(2Dグラフィック描画のための作業メモリ)のことである。
ブラウザやメーラー、エクスプローラなどのウィンドウを開くたびにシステムリソースが消費され、ウィンドウを閉じると解放されるはずだった。
しかし一部のプログラムがリソースを解放しないまま終了してしまったり、そもそもリソースの容量そのものが少なかったこともあり、リソースがすぐに一杯になってしまうことが多々あった。
リソースの空きが少ないと実行中のプログラムが不安定になったり、最悪Windowsそのものが固まってしまったりした。

リソースが少なかった理由は、
ウィンドウやデスクトップ描画の管理をおこなうプログラムが16ビットアプリケーションだったこと。
(見かけ上はUSER32.DLLやGDI32.DLLを呼び出しているが、USER32.DLLやGDI32.DLLは16ビットアプリケーションであるUSER.EXEやGDI.EXEを呼び出しているため、実質16ビットアプリケーションを実行していることになる。)
さらに、パフォーマンスや下位互換性(Windows3.x等との互換)を維持するため、USER.EXEやGDI.EXEが利用できるメモリが1セグメント(64KB)に固定されていることもある。

このようにしてシステムリソースのサイズは固定されており増やすことができなかったので、
極力リソースを減らさないための様々なテクニックが本やネット上で紹介された。

○Windows2000以降では
Windows2000、XP、それ以降のNTベースのOSは、Windows9x(Windows3.x(2.x)ベース)とは別系統の32ビット前提で作られたOSであり、RAMの容量が許す限りはシステムリソース(NT系ではヒープメモリと呼ぶ。)の容量に制限はない。
そのはずなのだが、実際はメモリ節約とパフォーマンス維持のため、Windows9xよりは多いもののこのヒープメモリのサイズが固定されている。

・各OSのInteractive desktop heap size(Win9xで言うUSERリソース)
Windows 標準のサイズ
2000 3MB
XP 32ビット版 3MB
Vista 無印 32ビット版 3MB
Vista 無印/SP1 64ビット版 20MB
Vista SP1 32ビット版 12MB
7 無印 32ビット版 12MB
7 無印 64ビット版 20MB

サーバー用OSその他は省略。Vista 32ビット版はヒープメモリのサイズが原因とみられる不具合がいくつか報告されたようで、Service Pack 1で修正されている。

○もしヒープメモリが一杯になると
Windows XP上でWebブラウザで動画を再生しながら他にも様々なウィンドウを開き、
エクスプローラを30個起動するバッチファイルを実行してみた。
するとエクスプローラのウィンドウが20数個開いた後、コマンドプロンプト上は実行しているのにウィンドウが開かなくなった。
試しに今開いているウィンドウを動かしたり最小化したりしてみたがなにも異常はない。
動画も途切れることなく再生し続けている。
しかしいくつかおかしな点があった。
・右クリックメニューが開かない(ブラウザやエクスプローラ、さらにはデスクトップやタスクバーですら。)
・メニューが開かない
・スタートメニューは開けるのに「すべてのプログラム」のリストを表示できない。
試しにコマンドプロンプトでexplorerを実行してみると、XP同じみのエラー音が一度鳴り、何も表示がないままプロンプトが入力待機状態に戻ってしまった。

エクスプローラをいくつか閉じると、これらの症状は直った。
やはり表示関連のキャッシュか何かに問題があると考えられる。

○Interactive desktop heap sizeを変更する
変更方法は下記リンクを参照。
http://blogs.msdn.com/b/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx
レジストリを変更することでヒープメモリのサイズを変更できる。
場所は HKEY_LOCAL_MACHINE¥System¥CurrentControlSet¥Control¥Session Manager¥SubSystems キーのWindows
ただしあまり大きい値に設定するとパフォーマンスが低下する恐れがある。

○GDIオブジェクトのメモリ使用制限
実はWindowsXPや2003(2000は不明)にはWindows9xでのGDIリソースの制限に相当するものもある。
GDIオブジェクトはページプールという領域に割り当てられており、これもまたサイズが指定されている。
ページプールのサイズを変更する方法は下記リンクを参照。
http://support.microsoft.com/kb/840342
HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion¥WindowsにあるGDIProcessHandleQuotaを変更すればいいらしい。
これもまた、値を大きくしすぎるとパフォーマンスの低下を引き起こしたりシステムの機能が制限されたりすることがある。
Vista以降のOSはページプール領域が可変なのでGDIオブジェクトの制限はなく、これを行う必要はない。


値を変更することでパフォーマンスの低下を招いたり空きメモリを減らしてしまうことがあるため、通常これらの値を変更する必要はない。
しかしRAM容量128MB~256MBが一般的だったWindows XPリリース当初から、1GB~4GBのRAMを搭載するパソコンが一般的になってきた今、多くのアプリケーションを同時に起動して使うことがあるだろう。その場合にはヒープメモリを増やしておくことをお勧めする。
ただ、多くの場合は「1プロセスあたり使用可能なGDI/USERオブジェクトが最大10000個に制限されている」この規則を誤動作か何かがで破ろうとしたことが原因で不具合が起こる。
そのときはアプリケーション側に不具合がないかどうかを疑ってみることも重要だ。


○参考
Windows の限界に挑む: USER オブジェクトと GDI オブジェクト – 第 1 部
http://technet.microsoft.com/ja-jp/windows/ff606443.aspx
Desktop Heap Overview
http://blogs.msdn.com/b/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx
Desktop Heap, part 2
http://blogs.msdn.com/ntdebugging/archive/2007/07/05/desktop-heap-part-2.aspx
Windows の限界に挑む: USER オブジェクトと GDI オブジェクト – 第 2 部
http://technet.microsoft.com/ja-jp/windows/ff621348.aspx

comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. This blog theme is based on sakmug. Hosted by Xdomain