Об'єкти USER і GDI

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Об'єкти GDI являють собою ресурси інтерфейсу графічного пристрою, такі як шрифти, точкові малюнки, кисті, пір'я і контексти пристроїв (поверхні конструктора). Як і у випадку з об'єктами USER, диспетчер вікон обмежує процеси використанням не більше ніж 10000 об'єктів GDI, що ви можете перевірити за допомогою Testlimit з параметром -g:

123абс.png

Щоб побачити, скільки об'єктів GDI використовує процес, ви можете звернутися до сторінки Performance в діалоговому вікні властивостей процесу в Process Explorer, а також додати колонку GDI Objects в Process Explorer, щоб переглянути параметри використання об'єктів GDI для процесів:

125абс (2).png

Як і у випадку з об'єктами USER, 16-розрядна функціональна сумісність означає, що об'єкти GDI мають 16-розрядні ідентифікатори, обмежуючи їх кількість 65535 екземплярами на сеанс. Ось як виглядає робочий стіл після того, як Testlimit досяг цього обмеження на 64-розрядній системі Windows Vista:

125абс (1).png

Зверніть увагу, що кнопка «Пуск» знаходиться в лівому нижньому кутку, тоді як інша частина панелі завдань знаходиться у верхній частині екрана. Робочий стіл став чорним, а бічна панель втратила більшість своїх кольорів. У вас це може виглядати інакше, але ви все одно можете побачити, які забавні речі починають відбуватися в таких випадках, позбавляючи вас можливості нормально взаємодіяти з робочим столом. Ось як став виглядати екран, після натиснення на кнопку «Пуск»:

127абс (2).png

На відміну від об'єктів USER, об'єкти GDI не нараховуються з куп робочого столу; натомість на системах Windows XP і Windows Server 2003, на яких не встановлені служби терміналів, вони розподіляються із загального вивантажування пулу; на всіх інших системах вони розподіляються з пулу сеансів, для кожного сеансу окремо. Команда відладчика ядра "!vm 4" відображає загальну інформацію про віртуальну пам'ять, включаючи інформацію про сеанс в кінці. На системі Windows XP вона показує, що вивантажуваний пул сеансу не використаний:

127абс (1).png

Ті ж результати відображаються і на Windows Server 2003 без встановлених служб терміналів:

129абс (2).png

Тому обмеженням пам'яті для об'єктів GDI служить обмеження вивантажування пулу. Однак, коли на тій же системі Windows Server 2003 служби терміналів встановлені, в інформації про використання пулу ненульового сеансу можна побачити, що об'єкти GDI беруться з пулу сеансу:

129абс (1).png

У наведених вище результати роботи команди "!vm 4" також показані максимальний розмір вивантажування пулу сеансу і розмір пулу сеансу, але на Windows Vista і в наступних системах максимум вивантажується пулу сеансу і розмір простору сеансу не відображаються, оскільки вони є змінними величинами. Показники використання вивантажування пулу сеансу на цих системах обмежуються або обсягом адресного простору, до якого вони можуть вирости, або межею виділення системних ресурсів, залежно від того, який параметр буде менший. Ось результати виконання цієї команди на системі Windows 7, що відображають поточні показники використання вивантажування пулу сеансів:

131абс (2).png

Цілком очікувано, що головний інтерактивний сеанс, Session 1, використовує велику частину вивантажування пулу сеансу. Можна використовувати інструмент Testlimit з параметром "-g 0", щоб побачити, що відбувається, коли закінчується місце для зберігання об'єктів GDI. Число, що визначене після -g є розміром об'єктів точкових малюнків GDI, що виділяються Testlimit, при цьому число 0 вказує Testlimit виділяти настільки великі об'єкти, наскільки це взагалі можливо. Ось результати роботи Testlimit на 32-розрядної системі Windows XP:

131абс (1).png

Щоб побачити розподіл об'єктів GDI за тегами пулів в Windows XP або Windows Server 2003 без встановлених служб терміналів, можна використовувати утиліту Poolmon з драйвера Windows Kit (WDK). Ось як виглядають результати роботи Poolmon, після того, як Testlimit вичерпав вивантажуваний пул в системі Windows XP. Результати відсортовані за кількістю виділених байт (натисніть "b" у вікні Poolmon, щоб зробити таке сортування), з яких видно, що Gh05 є тегом для об'єктів точкових малюнків на Windows Server 2003:

133абс (2).png

На системі Windows Server 2003 з встановленими службами терміналів і на Windows Vista і вище, щоб визначити, яку сесію ви хочете побачити, можна використовувати Poolmon з параметром / с. Ось результат роботи Testlimit на системі Windows Server 2003 з встановленими службами терміналів:

123аббс.png

Команда "Poolmon / S1" показує теги, які мають найбільші показники виділяється обсягу для Session 1. Ви можете побачити на верху списку тег Gh15, і чого випливає, що в даному випадку для виділення точкових малюнків використовується інший тег пула:

135абс (2).png

Зверніть увагу на те, що Testlimit зміг виділити приблизно 58 Мб під дані точкових малюнків (це число не входить у внутрішні витрати GDI для точкових малюнків) в системі Windows XP, і лише 10 Мб - в системі Windows Server 2003. Така різниця пояснюється тим, що обсяг пулу сесії в системі Windows Server Terminal Server складає всього 32 Мб, про що говорить об'єм пам'яті, який відобразила Poolmon для тега Gh15. Результати виконання команди "!vm 4" підтверджують, що пул сеансу для Session1 був повністю використаний і всі наступні спроби виділити об'єкти GDI з пулу сеансу зазнавали невдачі:

135абс (1).png

Також можна скористатися командою відладчика ядра !Poolused, щоб подивитися на показники використання пулу сеансу. Для початку, переключіться на потрібний сеанс за допомогою команди .process з параметром / р та адресою об'єкта процесу, підключеного до сеансу. Sprocess. Щоб побачити, які процеси виконуються в певному сеансі, використовуйте команду !poolmon. Ось результат виконання команди Poolmon в тій же самій системі Windows Server 2003, де опція "с" команди сортує результати за кількістю виділених байт:

136абс.png

На жаль, немає ніякого загальнодоступного зіставлення між тегами купи диспетчера вікон і об'єктами, які вони представляють, проте команда відладчика ядра !Poolused використовує файл triage.ini з директорії установки відладчика для відображення більш наочної інформації про теги. Ця команда повідомляє, що Gh15 - це GDITAG_HMGR_SPRITE_TYPE, що не дуже зрозуміло для користувача, однак для інших тегів ці дані наводяться в більш зрозумілій формі. На щастя, більшість помилок об'єктів GDI і USER пов'язані з перевищенням певним процесом обмеження в 10000 об'єктів на процес, так що немає потреби в проведенні більш докладного дослідження, що ставить метою з'ясувати, який процес відповідальний за вичерпання пулу сеансу або виділення об'єктів GDI.

Преодолевая границы Windows: объекты USER и GDI (часть 2)