Об'єкти 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, на якій не встановлено служби терміналів, вони розподіляються із загального вивантажування пулу; на всіх інших системах вони розподіляються з пулу сеансів, для кожного сеансу окремо. Команда відладчика ядра "!vm 4" відображає загальну інформацію про віртуальну пам'ять, включаючи інформацію про сеанс в кінці. На системі Windows XP вона показує, що вивантажуваний пул сеансу не використаний:

127абс (1).png

На 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 без встановлених служб терміналів, можна використовувати утиліту Poolmon з драйвера Windows Kit (WDK). Ось як виглядають результати роботи Poolmon, після того, як Testlimit вичерпав вивантажуваний пул в системі Windows XP. На щастя, більшість помилок об'єктів GDI і USER пов'язані з перевищенням певним процесом обмеження в 10000 об'єктів на процес, так що немає потреби в проведенні більш докладного дослідження, що ставить метою з'ясувати, який процес відповідальний за вичерпання пулу сеансу або виділення об'єктів GDI.

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