Процессы, потоки и задания. Продолжение
Содержание:
Эксперимент: просмотр информации о процессах с помощью Диспетчера задач
Встроенный в Windows "Диспетчер задач" предоставляет краткий список процессов, идущих в системе. Запустить этот диспетчер можно одним из четырех способов: 1) нажатием клавиш Ctrl+Shift+Esc, 2) щелчком правой кнопки мыши на панели задач с последующим выбором пункта "Запустить диспетчер задач", 3) нажатием клавиш Ctrl+Alt+Delete с последующим щелчком на кнопке "Запустить диспетчер задач", или 4) запуском исполняемой программы Taskmgr.exe.
Чтобы увидеть перечень процессов, нужно после запуска Диспетчера задач щелкнуть на вкладке "Процессы". Обратите внимание на то, что процессы идентифицируются по именам тех образов, экземплярами которых они являются. В отличие от некоторых объектов Windows, процессам нельзя давать глобальные имена. Чтобы посмотреть дополнительную информацию, выберите в меню "Вид" пункт "Выбрать столбцы" и отметьте те столбцы, которые нужно добавить.
Вполне очевидно, что на вкладке "Процессы" "Диспетчера задач" показывается список процессов, а вот о содержимом вкладки "Приложения" с такой же долей очевидности судить нельзя. Там показывается список видимых окон верхнего уровня на всех Рабочих столах интерактивного оконного терминала, к которому вы подключены. (По умолчанию есть только один интерактивный Рабочий стол, но приложение может создать и больше, если воспользуется функцией Windows "CreateDesktop", как это сделано в средстве Sysinternals Desktops.) В столбце Состояние показывается, находится ли поток, являющийся владельцем окна, в состоянии ожидания сообщения от этого окна. Состояние «Работает» означает, что поток ожидает поступления в это окно какого-нибудь ввода, а состояние «Не отвечает» означает, что поток не ждет поступления ввода в окно (например, поток может быть запущен или же находиться в ожидании ввода-вывода или в ожидании изменения состояния какого-нибудь объекта синхронизации Windows).
На вкладке Приложения можно сопоставить задачу тому процессу, который является владельцем потока, являющегося владельцем окна задачи. Для этого нужно щелкнуть правой кнопкой мыши на имени задачи и выбрать пункт Перейти к процессу, как показано в предыдущем эксперименте со средством tlist.
Инструментальное средство Process Explorer из арсенала Sysinternals предоставляет больше подробностей о процессах и потоках, чем другие доступные средства, поэтому вы увидите его в ряде рассматриваемых экспериментов. Можно упомянуть следующие, допускаемые Process Explorer уникальные возможности показа той или иной информации или выполнения действий:
- демонстрация маркера доступа к процессу (в виде перечня групп, прав доступа и состояния виртуализации);
- выделение изменений в списке процессов и потоков;
- вывод списка служб внутри процессов, являющихся их хозяевами, включая демонстрацию имен и описаний этих служб;
- показ процессов, являющихся частью задания и подробностей задания;
- показ процессов, являющихся хозяевами .NET-приложений и специфичных для .NET-технологии подробностей (таких как список экземпляров класса AppDomain, загруженных сборок и счетчиков производительности CLR);
- показ времени запуска процессов и потоков;
- показ полного списка отображенных на память файлов (не только DLL-библиотек);
- приостановка процесса или потока;
- завершение отдельного потока;
- простота определения тех процессов, которые потребляли за определенный период времени основную часть времени центрального процессора. (Системный монитор (Performance Monitor) может показывать процесс использования центрального процессора для заданного набора процессов, но он не будет автоматически показывать процессы, созданные после запуска сеанса мониторинга производительности, это может сделать только ручная трассировка в двоичном формате вывода.)
Process Explorer также обеспечивает легкий доступ к информации, собранной в одном месте. Вы можете просмотреть:
- дерево процессов (с возможностью свертывать части дерева);
- открытые в процессе дескрипторы (включая безымянные дескрипторы);
- список имеющихся в процессе DLL-библиотек (и отображенных на память файлов);
- активность потоков в процессе;
- стеки потоков пользовательского режима и режима ядра (включая отображение адресов на имена с использованием библиотеки Dbghelp.dll, поставляемой с отладочным пакетом Debugging Tools для Windows);
- более точный процентный показатель использования центрального процессора, вычисляемый с помощью счетчика циклов потока (как объясняется в главе 5 «Процессы, потоки и задания», по сравнению с обычным представлением, это еще более точное представление об активности центрального процессора);
- уровень целостности;
- подробности управления памятью, такие как зафиксированная пиковая нагрузка (peakcommitcharge), страницы памяти ядра (kernelmemorypaged) и лимиты резидентного пула (nonpaged pool limits) — другие инструментальные средства показывают только текущий размер.
А теперь проведем начальный эксперимент с использованием средства Process Explorer.
Эксперимент: просмотр подробностей процесса с помощью Process Explorer.
Загрузите самую последнюю версию Process Explorer ссайта Sysinternals изапуститеее. При первом запуске вы получите сообщение о неправильной настройке символов. При правильной настройке Process Explorer может получить доступ к информации о символах для вывода символического имени стартовой функции потока и функций в стеке вызовов потока (доступном после двойного щелчка на имени процесса и щелчка на вкладке Threads (Потоки)). Это поможет определить, что делают потоки внутри процесса. Для доступа к символам у вас должен быть установлен пакет средств для отладки Debugging Tools для Windows. После его установки щелкните на пункте Options (Дополнительные параметры), выберите пункт Configure Symbols (Настройка символов) и заполните поле пути к библиотеке Dbghelp.dll в папке Debugging Tools, а также укажите правильный путь к символам. Например, для 64-разрядной системы вполне подойдет следующая настройка.
В предыдущем примере для доступа к символам и копирования файлов символов с целью хранения этих файлов на локальной машине в каталоге c:\symbols используется сервер востребованных символов. Более подробная информация по настройкам использования сервера символов дана на сайте http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx.
При запуске средства Process Explorer оно по умолчанию показывает дерево процессов. У него также имеется дополнительная нижняя панель, в которой могут быть показаны открытые дескрипторы или отображенные на память DLL-библиотеки и другие, отображенные на память файлы. Также это средство дает подсказки для некоторых видов хост-процессов (hosting processes):
- При перемещении указателя мыши над именем хост-процесса служб (Svchost.exe) показываются службы внутри этого процесса.
- Показываются задачи COM-объектов внутри процесса Taskeng.exe (запускаемого Диспетчером задач (Task Scheduler)).
- Показывается целевой объект процесса Rundll32.exe (используется для таких объектов, как элементы Панели управления (Control Panel)).
- Показывается COM-объект, размещающийся внутри процесса Dllhost.exe.
- Показываются процессы вкладок Internet Explorer.
- Показываются хост-процессы консоли.
Оценить некоторые основные возможности Process Explorer вам помогут следующие действия:
- Обратите внимание на то, что хост-процессы служб по умолчанию выделены розовым фоном. Ваши собственные процессы выделены синим фоном. (Цвета можно настроить по-другому.)
- Проведите указателем мыши над отображениями имен процессов и обратите внимание на то, что в окне подсказки показывается полное путевое имя. Как уже говорилось, для процессов конкретного типа в подсказке выводятся и дополнительные сведения.
- Щелкните на пунктах View (Вид), Select Columns (Выбрать столбцы) и во вкладке Process Image (Отображение процесса) установите флажок Image Path (Отображение пути).
- Отсортируйте информацию, щелкнув на заголовке столбца Process (Процесс), и обратите внимание на то, что отображение дерева исчезло. (Доступен либо просмотр дерева, либо просмотр информации, отсортированной по любому из показанных столбцов.) Щелкните еще раз для сортировки в порядке следования имен от Z до A. Затем щелкните еще раз, чтобы вернуться к просмотру дерева процессов.
- Чтобы просматривать только свои процессы, щелкните на пункте View (Вид) и снимите флажок ShowProcessesFromAllUsers (Показывать процессы от всех пользователей).
- Щелкните на пунктах Options (Дополнительные параметры), Difference Highlight Duration (Продолжительность различных подсветок) и измените значение на 5 секунд. Затем запустите новый (любой) процесс и обратите внимание на то, что новый процесс будет выделен зеленым фоном в течение 5 секунд. Завершите этот новый процесс и обратите внимание, что он остается выделенным красным фоном в течение 5 секунд, пока не исчезнет из перечня. Этот эффект помогает заметить в вашей системе созданные и завершенные процессы.
И наконец, щелкните дважды на имени процесса и исследуйте различные вкладки, доступные в окне свойств процесса. (Ссылки на эти вкладки будут встречаться в различных экспериментах, предлагаемых в данной книге, там же будут даны объяснения, касающиеся выводимой в них информации.)
Поток, выполнение которого планируется операционной системой Windows, является составляющей того или иного процесса. Без него программа, запустившая процесс, не сможет работать. Поток включает в себя следующие основные компоненты:
- Содержимое набора регистров центрального процессора, отображающее его состояние.
- Два стека — один, используемый потоком при выполнении кода в режиме ядра, и один, используемый при выполнении кода в пользовательском режиме.
- Закрытую область хранения, называемую локальным хранилищем потока - thread-local storage (TLS) для использования подсистемами, библиотеками времени выполнения и DLL-библиотеками.
- Уникальный идентификатор, называемый идентификатором потока — thread ID (часть внутренней структуры, называемая идентификатором клиента —client ID — идентификаторы процессов и идентификаторы потоков образуются из одного и того же пространства имен, поэтому они никогда не перекрываются).
- Иногда у потоков имеется свой собственный контекст безопасности, или маркер (token), часто используемый многопоточными серверными приложениями, который является олицетворением контекста безопасности обслуживаемых этими приложениями клиентов.
Подвергаемые изменениям регистры, стеки и закрытая область хранения называются контекстом потока. Поскольку эта информация для каждой машинной архитектуры, в среде которой запущена Windows, бывает разной, структура, если это необходимо, также зависит от той или иной архитектуры. Доступ к этой, специфической для конкретной архитектуры, информации (называемой блоком CONTEXT) предоставляется Windows-функцией GetThreadContext.
ПРИМЕЧАНИЕ. В потоках 32-разрядных приложений, запущенных под управлением 64-разрядной версии Windows, будут содержаться блоки как 32-разрядного, так и 64-разрядного контекста, которые Wow64 будет использовать при необходимости для переключения приложения из работы в 32-разрядном режиме в работу в 64-разрядном режиме. У этих потоков будут два стека для работы в пользовательском режиме и два CONTEXT-блока, а обычные функции Windows API будут возвращать 64-разрядный контекст. Но функция Wow64GetThreadContext будет возвращать 32-разрядный контекст.