Опрос
Вы участвуете в программе Windows Insider?
Популярные новости
Обсуждаемые новости

06.04.2010 11:44 | Dazila

В прошлый раз я рассказал об ограничениях и о том, как измерить параметры использования для одного из двух ключевых ресурсов диспетчера окон - объектах USER. На этот раз я собираюсь затронуть другой ключевой ресурс - объекты GDI. Как всегда, перед прочтением этой статьи я рекомендую вам прочитать предыдущие мои публикации, поскольку некоторые из ограничений, связанных с ресурсами USER и GDI, основаны на ограничениях, о которых я уже рассказывал. Вот полный список моих статей из серии "Преодолевая границы Windows":

Преодолевая границы Windows: Физическая память
Преодолевая границы Windows: Виртуальная память
Преодолевая границы Windows: Выгружаемый и невыгружаемый пулы
Преодолевая границы Windows: Процессы и потоки
Преодолевая границы Windows: Дескрипторы
Преодолевая границы Windows: объекты USER и GDI (ч.1)


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


Чтобы увидеть, сколько объектов GDI использует процесс, вы можете обратиться к странице Performance в диалоговом окне свойств процесса в Process Explorer, а также добавить колонку GDI Objects в Process Explorer, чтобы просмотреть параметры использования объектов GDI для процессов:


Как и в случае с объектами USER, 16-битная функциональная совместимость означает, что объекты GDI имеют 16-битные идентификаторы, ограничивая их количество 65535 на сеанс. Вот рабочий стол, как он выглядит после того, как Testlimit достиг этого ограничения на 64-битной системе Windows Vista:


Обратите внимание, что кнопка Пуск находится в левом нижнем углу, тогда как остальная часть панели задач находится в верхней части экрана. Рабочий стол стал черным, а боковая панель потеряла большинство своих цветов. У вас это может выглядеть по-другому, но вы все равно можете увидеть, какие забавные вещи начинают происходить в таких случаях, лишая вас возможности нормально взаимодействовать с рабочим столом. Вот как стал выглядеть экран, когда я нажал на кнопку Пуск:


В отличие от объектов USER, объекты GDI не распределяются из куч рабочего стола; вместо этого на системах Windows XP и Windows Server 2003, на которых не установлены Terminal Services, они распределяются из общего выгружаемого пула; на всех других системах они распределяются из пула сеансов, для каждого сеанса в отдельности.

Команда отладчика ядра "!vm 4" отображает общую информацию о виртуальной памяти, включая информацию о сеансе в конце. На системе Windows XP она показывает, что выгружаемый пул сеанса не использован:


Те же результаты отображаются и на Windows Server 2003 без установленных Terminal Services:


Поэтому ограничением по памяти для объектов GDI служит ограничение выгружаемого пула, как я описывал в своей предыдущей статье, "Преодолевая границы Windows: выгружаемый и невыгружаемый пулы". Однако, когда на той же системе Windows Server 2003 установлены Terminal Services, в информации об использовании пула ненулевого сеанса вы можете увидеть, что объекты GDI прибывают из пула сеанса:


В приведенных выше результатах работы команды "!vm 4" также показаны максимум выгружаемого пула сеанса и размер пула сеанса, но на Windows Vista и последующих системах максимум выгружаемого пула сеанса и размер пространства сеанса не отображаются, поскольку они являются переменными величинами. Показатели использования выгружаемого пула сеанса на этих системах ограничиваются либо объемом адресного пространства, до которого они могут вырасти, либо пределом выделения системных ресурсов, в зависимости от того, что из этого будет меньше. Вот результаты выполнения этой команды на системе Windows 7, отображающие текущие показатели использования выгружаемого пула сеансов:


Вполне ожидаемо, что главный интерактивный сеанс, Session 1, использует большую часть выгружаемого пула сеанса.

Вы можете использовать инструмент Testlimit с параметром "-g 0", чтобы увидеть, что происходит, когда заканчивается место для хранения объектов GDI. Число, указываемое вами после -g является размером объектов точечных рисунков GDI, выделяемых Testlimit, при этом число 0 указывает Testlimit выделять настолько большие объекты, насколько это вообще возможно. Вот результаты работы Testlimit на 32-битной системе Windows XP:


На Windows XP или Windows Server 2003 без установленных Terminal Services, чтобы увидеть распределение объектов GDI по их тегам пулов, вы можете использовать утилиту Poolmon из Windows Driver Kit (WDK). Вот как выглядят результаты работы Poolmon, после того, как Testlimit исчерпал выгружаемый пул на системе Windows XP, отсортированные по количеству выделенных байт (нажмите "b" в окне Poolmon, чтобы сделать такую сортировку), из которых видно, что Gh05 является тегом для объектов точечных рисунков на Windows Server 2003:


На системе Windows Server 2003 с установленными Terminal Services и на Windows Vista и выше, чтобы определить, какую сессию вы хотите увидеть, вы можете использовать Poolmon с параметром /s. Вот результат работы Testlimit на системе Windows Server 2003 с установленными Terminal Services:


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


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


Вы также можете воспользоваться командой отладчика ядра !poolused, чтобы посмотреть на показатели использования пула сеанса. Для начала, переключитесь на нужный сеанс с помощью команды .process с параметром /p и адресом объекта процесса, подключенного к сеансу. Чтобы увидеть, какие процессы выполняются в определенном сеансе, используйте команду !sprocess. Вот результат выполнения команды !poolmon на той же самой системе Windows Server 2003, где опция "с" команды сортирует результаты по числу выделенных байт:


К сожалению, нет никакого общедоступного сопоставления между тегами кучи диспетчера окон и объектами, которые они представляют, однако команда отладчика ядра !poolused использует файл triage.ini из директории установки отладчика для отображения более наглядной информации о тегах. Эта команда сообщает, что Gh15 - это GDITAG_HMGR_SPRITE_TYPE, что не столь понятно для пользователя, однако для других тегов эти данные приводятся в более понятной форме.

К счастью, большинство ошибок объектов GDI и USER связаны с превышением определенным процессом ограничения в 10000 объектов на процесс, так что нет надобности в проведении более подробного исследования с целью выяснить, какой процесс ответственен за исчерпание пула сеанса или выделение объектов GDI, чтобы исчерпать выгружаемый пул.

В следующий раз я рассмотрю системные элементы таблицы страниц (System PTE) - другой ключевой ресурс, у которого есть ограничения, которые могут быть превышены, особенно в сеансах Remote Desktop в системах Windows Server 2003.


Источник: http://blogs.technet.com/mark_russinovich
Перевод: Dazila

Комментарии

Не в сети

Интересно, когда они поднимут это ограничение на 65535 объектов GDI? Даже в Windows 7 X64 есть этот недостаток: Попробуйте открывать много окон проводника и уведите, что где-то на 50-м окне начнутся глюки...

06.04.10 21:23
0
Не в сети

Количество поддерживаемых процессоров увеличили, сохранив совместимость. И это увеличат.

07.04.10 00:16
0
Для возможности комментировать войдите в 1 клик через

По теме

Акции MSFT
420.55 0.00
Акции торгуются с 17:30 до 00:00 по Москве
Все права принадлежат © ms insider @thevista.ru, 2022
Сайт является источником уникальной информации о семействе операционных систем Windows и других продуктах Microsoft. Перепечатка материалов возможна только с разрешения редакции.
Работает на WMS 2.34 (Страница создана за 1.504 секунд (Общее время SQL: 1.483 секунд - SQL запросов: 57 - Среднее время SQL: 0.02602 секунд))
Top.Mail.Ru