Windows system >> Windowsの知識 >  >> Windows NTチュートリアル >> Windows NTの情報 >> GDIリソースなどのシステムリソースはWindows NTでどのように管理されますか?

GDIリソースなどのシステムリソースはWindows NTでどのように管理されますか?

  

#11フロアスコア:0返信先:2006-04-29 08:37:18

GDIリソースが枯渇した理由やりますか?データ復旧トレーニングこの質問に答えるために、私たちはWindowsエクスプローラ自身のタスクマネージャを観察し、プログラムインターフェースが混乱し始めたとき、プロセスのGDIオブジェクト値は9999である、そしてGDIオブジェクトが9999に達した後インターフェースはなぜ混乱するのですか?この質問で、私はいくつかの情報を見つけ、WindowsがGDIオブジェクトを管理する方法を簡単に学びました。オフィスソフトウェアの障害GDIオブジェクトは、実際にはWindowsシステムによって管理されているいくつかのデータ構造です。安定性と堅牢性に基づいて、マイクロソフトはすべてのGDIオブジェクトの管理をWindowsシステムのオブジェクトマネージャに引き継ぎ、ユーザーはシステムから返される「ハンドル」を介してのみこれらのオブジェクトを操作できます。グラフィックカードの障害Windows 2000では、ハンドルは実際にはDWORD型の値です。 DWORD値は32ビットのデータで、テーブルインデックスと一意性識別子(それぞれ16ビットを占める)の2つの部分に分かれているため、理論上、Windowsの各プロセスはGDIにアクセスできます。オブジェクトの最大値は64Kです。ただし、Windows 2000では、クライアントハンドルの最大数が16384(16K)にハードセットされていますが、Windows 2000では、クライアントハンドルの最大数が16384にハードセットされていても、GDIオブジェクトが追加されます。 9999の後、プログラムのインターフェースは混乱し始めましたか? Windows 2000では、プロセスあたりのGDIオブジェクトの最大値がデフォルトで10000になっています。Microsoftのデータによると、 "Bad"プログラムが多くのリソースを割り当てないようにするため、その理由は10000に設定されています。 9999に達すると、プログラムは新しいGDIリソースを作成できなくなるため、毎回新しいリソースを使用してインターフェイスを描画するプログラムは混乱します。ただし、Windows 2000以降のオペレーティングシステムでは、各プロセスが作成できるGDIオブジェクトの最大値は、レジストリを変更することによってリセットできますWindows 2000では、レジストリエントリは次のとおりです。 \\ Microsoft \\ Windows NT \\ CurrentVersion \\ Windows" GDIProcessHandleQuota"新しい値を設定した後、コンピュータを再起動した後、システム内のプロセスごとに使用できるGDIオブジェクトの数が、新しく設定した数になります。しかし、上記の記述は完全には正しくありません。 SYBASEのデータ表示(?id = 1019174)によると、Windwos2000では "GDIProcessHandleQuota"の値だけが微調整でき、値が15000を超えるとシステムは不安定になります。実際、Windows 2000でテストしました。GetGuiResources関数の戻り値が12288(12K)の場合、新しいGDIオブジェクト、つまりWindows 2000のプロセス内の合計GDIオブジェクトを作成することはできません。数が12288に達すると、新しいGDIオブジェクトを作成できなくなります。 Windows 2000では、プロセスが作成できるGDIオブジェクトの数は各プロセスとは無関係ですか、それともWindowsオペレーティングシステムに限られていますか。この目的のために、指定した数のBRUSHオブジェクトをバッチで作成し、プロセス内のGDIオブジェクトの数とシステム内のGDIオブジェクトの合計数を数えるチェックプログラムを作成しました(実行中のインターフェイスは次のとおりですが、関係ありません)。統計システム内の総GDIオブジェクトのコードは次のとおりです。int GetGDINumInSystem(void){int nGDINums = 0; /*すべてのプロセスのGDIオブジェクトの合計* /int nProcess = 0; /*システム内のプロセス数* /DWORD aProID [1024]; DWORD cbNeeded; :: EnumProcesses(aProID、sizeof(aProID)、&cbNeeded); /*システム内のプロセスの総数* /nProcess = cbNeeded /sizeof(DWORD); /*各プロセスのGDIオブジェクト数* /(INT i = 0; i

Copyright © Windowsの知識 All Rights Reserved