Как посмотреть потоки процесса в windows

Работа операционной системы Windows основана на работе процессов. В этой статье разберём что такое Windows процессы, их свойства, состояния и другое.

Процессы

Процесс стоит воспринимать как контейнер с набором ресурсов для выполнения программы. То есть запускаем мы программу, для неё выделяется часть ресурсов компьютера и эта программа работает с этими ресурсами.

Процессы нужны операционной системе для многозадачности, так как программы работают в своих процессах и не мешают друг другу, при этом по очереди обрабатываются процессором.

Windows процессы состоят из следующего:

  • Закрытое виртуальное адресное пространство, то есть выделенная для процесса часть оперативной памяти, которая называется виртуальной.
  • Исполняемая программа выполняя свой код, помещает его в виртуальную память.
  • Список открытых дескрипторов. Процесс может открывать или создавать объекты, например файлы или другие процессы. Эти объекты нумеруются, и их номера называют дескрипторами. Ссылаться на объект по дескриптору быстрее, чем по имени.
  • Контекст безопасности. Сюда входит пользователь процесса, группа, привилегии, сеанс и другое.
  • Идентификатор процесса, то есть его уникальный номер.
  • Программный поток (как минимум один или несколько). Чтобы процесс хоть что-то делал, в нем должен существовать программный поток. Если потока нет, значит что-то пошло не так, возможно процесс не смог корректно завершиться, или стартовать.

У процессов есть еще очень много свойств которые вы можете посмотреть в «Диспетчере задач» или «Process Explorer«.

Процесс может быть в различных состояниях:

  • Выполняется — обычно все фоновые процессы будут в этом состоянии, а если процесс с окошком, то значит что приложение готово принимать данные от пользователя.
  • Приостановлен — означает что все потоки процесса находятся в приостановленном состоянии. Приложения Windows Apps переходят в это состояние при сворачивании окна для экономии ресурсов.
  • Не отвечает — означает что программный поток не проверял свою очередь сообщений более 5 секунд. Поток может быть занят работой и интенсивно загружать процессор, или может ожидать операции ввода/вывода. При этом окно приложения зависает.

В Windows существуют процессы трёх типов:

  • Приложения. Процессы запущенных приложений. У таких приложений есть окно на рабочем столе, которое вы можете свернуть, развернуть или закрыть.
  • Фоновые процессы. Такие процессы работают в фоне и не имеют окна. Некоторые процессы приложений становятся фоновыми, когда вы сворачиваете их в трей.
  • Процессы Windows. Процессы самой операционной системы, например «Диспетчер печати» или «Проводник».

Дерево процессов

В Windows процессы знают только своих родителей, а более древних предков не знают.

Например у нас есть такое дерево процессов:

Процесс_1
|- Процесс_2
  |- Процесс_3

Если мы завершим дерево процессов «Процесс_1«, то завершатся все процессы. Потому что «Процесс_1» знает про «Процесс_2«, а «Процесс_2» знает про «Процесс_3«.

Если мы вначале завершим «Процесс_2«, а затем завершаем дерево процессов «Процесс_1«, то завершится только «Процесс_1«, так как между «Процесс_1» и «Процесс_3» не останется связи.

Например, запустите командную строку и выполните команду title parrent чтобы изменить заголовок окна и start cmd чтобы запустить второе окно командной строки:

>title parrent
>start cmd

Измените заголовок второго окна на child и из него запустите программу paint:

>title child
>mspaint

В окне командной строке child введите команду exit, окно закроется а paint продолжит работать:

>exit

После этого на рабочем столе останутся два приложения, командная строка parrent и paint. При этом parrent будет являться как бы дедом для paint.

Запустите «Диспетчер задач», на вкладке «Процессы» найдите процесс «Обработчик команд Windows», разверните список и найдите «parrent«. Затем нажмите на нём правой копкой мыши и выберите «Подробно»:

Подробности по процессу parrent

Вы переключитесь на вкладку «Подробно» с выделенным процессом «cmd.exe«. Нажмите правой кнопкой по этому процессу и выберите «Завершить дерево процессов»:

Завершаем дерево процессов в диспетчере задач

Окно командной строки Parrent завершится а Paint останется работать. Так мы убедились что связи между первым процессом и его внуком нет, если у внука нет непосредственного родителя.

Потоки

На центральном процессоре обрабатываются не сами процессы, а программные потоки. Каждый поток, это код загруженный программой. Программа может работать в одном потоке или создавать несколько. Если программа работает в несколько потоков, то она может выполняться на разных ядрах процессора. Посмотреть на потоки можно с помощью программы Process Explorer.

Поток содержит:

  • два стека: для режима ядра и для пользовательского режима;
  • локальную памятью потока (TLS, Thread-Local Storage);
  • уникальный идентификатор потока (TID, Thread ID).

Приложение может создать дополнительный поток, например, когда у приложения есть графический интерфейс, который работает в одном потоке и ожидает от пользователя ввода каких-то данных, а второй поток в это время занимается обработкой других данных.

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

  • svchost.exe — главный процесс для служб Windows.
  • dllhost.exe — отвечает за обработку приложений, использующих динамически подключаемые библиотеки. Также отвечает за COM и .NET. И ещё управляет процессами IIS.
  • lsass.exe — отвечает за авторизацию локальных пользователей, попросту говоря без него вход в систему для локальных пользователей будет невозможен.

Волокна и планирование пользовательского режима

Потоки выполняются на центральном процессоре, а за их переключение отвечает планировщик ядра. В связи с тем что такое переключение это затратная операция. В Windows придумали два механизма для сокращения таких затрат: волокна (fibers) и планирование пользовательского режима (UMS, User Mode Scheduling).

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

Потоки UMS (User Mode Scheduling), доступные только в 64-разрядных версиях Windows, предоставляют все основные преимущества волокон при минимуме их недостатков. Потоки UMS обладают собственным состоянием ядра, поэтому они «видимы» для ядра, что позволяет нескольким потокам UMS совместно использовать процессор и конкурировать за него. Работает это следующим образом:

  • Когда двум и более потокам UMS требуется выполнить работу в пользовательском режиме, они сами могут периодически уступать управление другому потоку в пользовательском режиме, не обращаясь к планировщику. Ядро при этом думает что продолжает работать один поток.
  • Когда потоку UMS все таки нужно обратиться к ядру, он переключается на специально выделенный поток режима ядра.

Задания

Задания Windows (Job) позволяют объединить несколько процессов в одну группу. Затем можно этой группой управлять:

  • устанавливать лимиты (на память или процессорное время) для группы процессов входящих в задание;
  • останавливать, приостанавливать, запускать такую группу процессов.

Посмотреть на задания можно с помощью Process Explorer.

Диспетчер задач

Чаще всего для получения информации о процессе мы используем «Диспетчер задач». Запустить его можно разными способами:

  • комбинацией клавиш Ctrl+Shift+Esc;
  • щелчком правой кнопкой мыши на панели задач и выборе «Диспетчер задач»;
  • нажатием клавиш Ctrl+Alt+Del и выборе «Диспетчер задач»;
  • запуском исполняемого файла C:\Windows\system32\Taskmgr.exe.

При первом запуске диспетчера задач он запускается в кратком режиме, при этом видны только процессы имеющие видимое окно. При нажатие на кнопку «Подробнее» откроется полный режим:

Краткий режим Диспетчера задач

В полном режиме на вкладке «Процессы» виден список процессов и информация по ним. Чтобы получить больше информации можно нажать правой кнопкой мышки на заголовке и добавить столбцы:

Диспетчер задач - Добавление столбцов с информацией

Чтобы получить еще больше информации можно нажать правой кнопкой мышки на процессе и выбрать «Подробно». При этом вы переключитесь на вкладку «Подробности» и этот процесс выделится.

На вкладке «Подробности» можно получить ещё больше информации о процессе. А также здесь также можно добавить колонки с дополнительной информацией, для этого нужно щелкнуть правой кнопкой мыши по заголовку и нажать «Выбрать столбцы»:

Выбор столбцов с информацией о процессах на вкладке «Подробности»

Process Explorer

Установка и подготовка к работе

Более подробную информацию о процессах и потоках можно получить с помощью программы Process Explorer из пакета Sysinternals. Его нужно скачать и запустить.

Некоторые возможности Process Explorer:

  • информация по правам процесса: кто владелец процесса, у кого есть доступ к нему;
  • выделение разными цветами процессов и потоков, для удобного восприятия информации:
    • процессы служб — розовый;
    • ваши собственные процессы — синий;
    • новые процессы — зелёный;
    • завершенные процессы — красный;
  • список файлов открытых процессом;
  • возможность приостановки процесса или потока;
  • возможность уничтожения отдельных потоков;
  • поиск процессов создающих наибольшую нагрузку на процессор;
  • отображение списка процессов в виде дерева, а также алфавитная сортировка и сортировка в обратном порядке;
  • возможность посмотреть:
    • число дескрипторов у процесса;
    • активность потоков в процессе;
    • подробную информация о распределении памяти.

Запустите Process Explorer:

Process Explorer

Далее нужно настроить сервер символических имен. Если это не сделать, при двойном щелчке на процессе, на вкладке Threads (потоки) вы получите сообщение о том, что символические имена не настроены:

Предупреждение о не настроенных символических именах

Для начала скачиваем установщик «Пакет SDK для Windows 10».

Устанавливать все не нужно, достаточно при установки выбрать «Debugging Tools for Windows«:

Установка SDK для Windows 10

Для настройки символических имен перейдите в меню Options / Configure / Symbols. Введите путь к библиотеке Dbghelp.dll, которая находится внутри установленного «Пакета SDK для Windows 10» по умолчанию:

  • C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\Dbghelp.dll.

И путь к серверу символической информации:

  • srv*C:\Symbols*http://msdl.microsoft.com/download/symbols

При этом:

  • C:\Symbols — путь к кеширующей локальной папке;
  • http://msdl.microsoft.com/download/symbols — сервер microsoft.

Настройка символический имен в Process Explorer

Некоторые основные настройки Process Explorer:

  • Смена цветового выделения — Options / Configure Colors.
  • Выбор колонок с информацией о процессах — View / Select Columns.
  • Сортировка процессов — нужно щелкнуть на заголовке столбца Process, при первом щелчке сортировка будет в алфавитном порядке, при втором в обратном порядке, при третьем вернется в вид дерева.
  • Просмотр только своих процессов — View / снять галочку Show Processes from All Users.
  • Настройка времени выделения только что запущенных процессов и завершённых — Options / Difference Highlight Duration / введите количество секунд.
  • Чтобы исследователь процесс подробнее можно дважды щелкнуть на нем и посмотреть информацию на различных вкладках.
  • Открыть нижнюю панель для просмотра открытых дескрипторов или библиотек — Vies / Show Lower Panel.

Потоки в Process Explorer

Потоки отдельного процесса можно увидеть в программе Process Explorer. Для этого нужно дважды кликнуть по процессу и в открывшемся окне перейти на вкладку «Threads»:

Process Explorer (потоки процесса)

В колонках видна информация по каждому потоку:

  • TID — идентификатор потока.
  • CPU — загрузка процессора.
  • Cycles Delta — общее количество циклов процессора, которое этот процесс использовал с момента последнего обновления работы Process Explorer. Скорость обновления программы можно настроить, указав например 5 минут.
  • Suspend Count — количество приостановок потока.
  • Service — название службы.
  • Start Address — начальный адрес процедуры, который начинает выполнение нового потока. Выводится в формате:«модуль!функция».

При выделении потока, снизу показана следующую информация:

Изучение активности потока

  • Идентификатор потока.
  • Время начала работы потока.
  • Состояние потока.
  • Время выполнения в режиме ядра и в пользовательском режиме.
  • Счетчик переключения контекста для центрального процессора.
  • Количество циклов процессора.
  • Базовый приоритет.
  • Динамический приоритет (текущий).
  • Приоритет ввода / вывода.
  • Приоритет памяти.
  • Идеальный процессор (предпочтительный процессор).

Есть также кнопки:

Устройство Windows. Изучение активности потока, изображение №3

  • Stack — посмотреть стек процесса;
  • Module — посмотреть свойства запущенного исполняемого файла;
  • Permission — посмотреть права на поток;
  • Kill — завершить поток;
  • Suspend — приостановить поток.

Задания в Process Explorer

Process Explorer может выделить процессы, управляемые заданиями. Чтобы включить такое выделение откройте меню «Options» и выберите команду «Configure Colors», далее поставьте галочку «Jobs»:

Process Explorer — выделение заданий

Более того, страницы свойств таких процессов содержат дополнительную вкладку Job с информацией о самом объекте задания. Например приложение Skype работает со своими процессами как за заданием:

Process Explorer — вкладка Job

Запустите командную строку и введите команду:

>runas /user:<домен>\<пользователь> cmd

Таким образом вы запустите еще одну командную строку от имени этого пользователя. Служба Windows, которая выполняет команды runas, создает безымянное задание, чтобы во время выхода из системы завершить процессы из задания.

В новой командной строке запустите блокнот:

>notepad.exe

Далее запускаем Process Explorer и находим такое дерево процессов:

Устройство Windows. Задания, изображение №3

Как видим, процесс cmd и notepad это процессы связанные с каким-то заданием. Если дважды кликнуть по любому из этих процессов и перейти на вкладку Job, то мы увидим следующее:

Process Explorer — вкладка Job

Тут видно что эти два процесса работают в рамках одного задания.

Вернуться к оглавлению

Сводка

Процессы Windows

Имя статьи

Процессы Windows

Описание

Работа операционной системы Windows основана на работе процессов. В этой статье разберём что такое Windows процессы, их свойства, состояния и другое

Время на прочтение
5 мин

Количество просмотров 93K

Process Explorer – альтернатива стандартному Task Manager-у. Эта утилита, как и многие другие утилиты Sysinternals, здорово расширяет возможности контроля и управления системой. Главное новшество только что вышедшей 14-ой версии — возможность мониторить сетевую активность процессов. Далее небольшой обзор возможностей этой утилиты, которые считаю наиболее полезными для себя.

Для справки. С 2006 года Sysinternals была приобретена Microsoft, а ключевая фигура этой компании – Марк Руссинович с тех пор работает в Microsoft. Марк известен своими утилитами, книгой Windows Internals, блогом и является признанным специалистом по архитектуре Windows.

Содержание:

  • Колонки в главном окне
  • Сервисы внутри svchost
  • Суммарные графики активности, процесс с максимальной активностью
  • Суммарные графики активности в трее, процесс с максимальной активностью
  • Сетевые соединения процесса
  • Потоки процесса, их активность, стек потока с загрузкой символов
  • Информация по использованию памяти в системе
  • Handles и DLL процесса
  • Поиск handles и DLL

Колонки в главном окне

1

2

Для каждого процесса:

  1. Имя процесса
  2. Владелец процесса, я использую сортировку по этому полю, чтобы первыми шли пользовательские процессы, потом системные
  3. Загрузка CPU процессом
  4. Суммарное затраченное время CPU, интересно иногда обращать на это внимание, полезен для таймирования
  5. Private bytes — объем занимаемой процессом памяти (реально выделенные страницы, исключая shared)
  6. Peak private bytes — пиковое значение Private bytes, интересно иногда взглянуть до чего дело доходило
  7. I/O read bytes — суммарный объем считанных с диска данных, по изменению видна активность
  8. I/O write bytes — суммарный объем записанных на диск данных, по изменению видна активность
  9. Network receive bytes — суммарный объем считанных из сети данных, по изменению видна активность
  10. Network send bytes — суммарный объем переданных в сеть данных, по изменению видна активность
  11. Описание процесса
  12. Название компании
  13. Полный путь к образу процесса (тут можно точно понять откуда стартовал процесс)
  14. Командная строка запуска процесса

Сервисы внутри svchost

При наведении курсора на svchost (процесс который хостит в себе сервисы) можно видеть перечень сервисов – довольно полезная фича.

ScreenShot00243

Суммарные графики активности, процесс с максимальной активностью

Сверху основного окна расположены графики основных суммарных параметров – память, дисковая, сетевая и CPU активность. При перемещении курсора по истории параметра, показан процесс который дал максимальный вклад в это значение в данный момент времени. Кроме того в тултипе есть информация о мгновенном значении параметра (зависит от частоты обновления). На следующей картинке — график сетевой активности.

ScreenShot00239

В окне «system information» графики собраны вместе, здесь удобнее смотреть корреляцию параметров.

ScreenShot00262

Суммарные графики активности в трее, процесс с максимальной активностью

Очень удобная фича – выведение в трей иконок с графиками суммарной активности. Там могут быть графики дисковой активности, CPU и память. Я использую первые два – поглядываю туда, при возникновении вопросов достаточно навести курсор и узнать какой процесс дает максимальный вклад в параметр. К сожалению сетевую активность туда нельзя выставить, я надеюсь это вопрос времени.

ScreenShot00240 ScreenShot00241

Сетевые соединения процесса

В свойствах процесса в закладке TCP/IP можно посмотреть текущие активные соединения. К сожалению сетевая активность по ним не видна, эта функциональность пока доступна в другой утилите – tcpview.

ScreenShot00254

Потоки процесса, их активность, стек потока с загрузкой символов

В свойствах процесса в закладке threads видны все его потоки и загрузка CPU по потокам. Допустим хочется рассмотреть стек потока, который интенсивно что-то делает или висит. Для этого сперва надо его распознать, допустим по загрузке CPU, потом полезно приостановить процесс, чтобы спокойно рассмотреть его состояние — это можно сделать прямо в этом окне по кнопке “suspend”. Далее выделяем поток и нажимаем “stack”. В большинстве случаев стек будет начинаться в недрах системы и обрываться не совсем понятным образом. Дело в том, что не имея отладочной информации по системным библиотекам не удастся корректно развернуть стек и разобраться в нем. Есть решение – нужно сконфигурировать доступ с символьной информации с сайта Microsoft. Надо проделать несколько шагов:

  1. Установить Debugging Tools. Из приведенной ссылки надо пойти по ссылке “Debugging Tools for Windows 32-bit Versions” или “Debugging Tools for Windows 64-bit Versions”. Далее выбрать для скачивания последнюю версию не интегрированную в SDK, иначе это выльется в скачивание огромного объема SDK, а так всего несколько Mb.
  2. Настроить доступ к символам в Process Explorer. Options –> Configure Symbols. В одном поле задаем путь к dbghelp.dll, которая находится внутри установленного продукта из шага 1. Во втором настраиваем такую хитрую строку: “srv*C:\Symbols*http://msdl.microsoft.com/download/symbols”. Часть строки указывает на локальный кэш для PDB файлов, вторая часть на путь к серверу для скачивания.
  3. Теперь список потоков и стек будут более информативны. При открытии этих окон может происходить задержка на время подкачки PDB файлов с сервера Microsoft, но делается это один раз для каждой версии модуля, результат кэшируется в выбранной папке.

ScreenShot00255

ScreenShot00256

Информация по использованию памяти в системе

В окне «system information» закладка «memory». Здесь есть два графика – commit и physical. Physical – использование физической памяти без учета файлового кэша, под который уходит все что остается. Commit – сколько памяти выделено для процессов включая используемую виртуальную память. Под графиками в разделе «Commit Charge» есть поля Limit и Peak. Limit определяется суммой физической и виртуальной памяти, т.е. это максимальный суммарный объем памяти, который может выделить система. Peak – это максимум графика Commit за время работы утилиты. Процентные соотношения Current/Limit и Peak/Limit удобны для быстрой оценки насколько состояние системы приближалось к критическому лимиту по доступной памяти.

ScreenShot00257

Handles и DLL процесса

В главном окне можно включить разделитель и снизу отображать DLL или handles выделенного процесса. При борьбе с вирусами и отладке программ это бывает очень полезно. На картинке — список handles для opera, первый handle файловой системы – это flash ролик в временном каталоге.

ScreenShot00258

Для DLL можно добавить колонку с полным путем к образу, отсортировав по нему, проанализировать нет ли каких подозрительных модулей. На картинке видно, что подключен модуль от Logitech, есть подозрение что это что-то типа хука внедряющегося во все процессы. Следующим пунктом посмотрим где он еще встречается.

ScreenShot00259

Поиск handles и DLL

Поиск по имени handle или DLL во всех процессах. Вводим имя DLL от Logitech из предыдущего пункта и убеждаемся что подключается он почти везде.

ScreenShot00260

Другой пример – надо понять, кто блокирует файл или работает с папкой. Вводим часть пути и находим все процессы, которые открыли подобные объекты системы. Можно щелкнуть на элементе из списка и перейти к процессу, при этом будет подсвечен соответствующий handle или DLL.

ScreenShot00261

PS Для отображения некоторых полей (например сетевая статистика) требуются административные привилегии. Повысить привилегии в уже запущенном Process Explorer можно с помощью команды в меню File. Только при наличии таких привилегий есть возможность добавить такие колонки. Я считаю такое поведение неверным, т.к. скрывает потенциальные возможности приложения от пользователя. Если поля добавлены и при следующем запуске нет административных прав, то они будут пустыми. Можно задать ключ «/e» в командной строке, чтобы форсировать поднятие привилегий при старте Process Explorer.

Asked

Viewed
109k times

I know I can see all running processes in Task Manager. But how can I see the single threads that run inside these processes?

asked Aug 17, 2012 at 18:14

Oliver Salzburg's user avatar

Oliver SalzburgOliver Salzburg

86.6k63 gold badges261 silver badges306 bronze badges

  1. Get Process Explorer.

  2. Enable Show Details for All Processes from the File menu:

    enter image description here

  3. In the main pane, select the process you’re interested in:

    enter image description here

  4. Open the context menu (right-click) for the selected process and click Properties:

    enter image description here

  5. On the Threads tab, you’ll be able to see a list of the running threads inside that process:

    enter image description here

Symbols

If your troubleshooting requires you to get more detail, it is often very helpful to load debugging symbols into Process Explorer. This is how:

  1. If you don’t already have a Windows debugger installed, you’re going to have to install the Debugging Tools for Windows first.

  2. In Process Explorer, open Configure Symbols… from the Options menu:

    enter image description here

  3. If you have the Debugging Tools (or another Windows debugger) installed, Process Explorer will automatically find the dbghelp.dll file. Otherwise, set the correct path here.

    enter image description here

    The Symbols path should look something like:

    SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
    

    The only part you’ll want to adjust is C:\Symbols. That’s the location where the debugging symbols will be cached.

answered Aug 17, 2012 at 18:14

Oliver Salzburg's user avatar

Oliver SalzburgOliver Salzburg

86.6k63 gold badges261 silver badges306 bronze badges

2

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

В этой статье мы поговорим на такие темы, как процессы и потокидискрипторы процесса, поговорим о синзронизации потоков и затронем всеми любимый диспетчер задач windows.

На протяжении существования процесса его выполнение может быть многократно прервано и продолжено. Для того, чтобы возобновить выполнение процесса, необходимо восстановить состояние его операционной среды. Состояние операционной среды отображается состоянием регистров и программного счетчика, режимом работы процессора, указателями на открытые файлы, информацией о незавершенных операциях ввода-вывода, кодами ошибок выполняемых данным процессом системных вызовов и т.д. Эта информация называется контекстом процесса.

Для того чтобы ОС могла управлять процессами, она должна располагать всей необходимой для этого информацией. С этой целью на каждый процесс заводится дескриптор процесса.

Дескриптор – специальная информационная структура, которая заводится на каждый процесс (описатель задачи, блок управления задачей).

В общем случае дескриптор содержит следующую информацию:

  1. Идентификатор процесса.
  2. Тип (или класс) процесса, который определяет для супервизора некоторые правила предоставления ресурсов.
  3. Приоритет процесса.
  4. Переменную состояния, которая определяет, в каком состоянии находится процесс (готов к работе, в состоянии выполнения, ожидание устройства ввода-вывода и т.д.)
  5. Защищенную область памяти (или адрес такой зоны), в которой хранятся текущие значения регистров процессора, если процесс прерывается, не закончив работы. Эта информация называется контекстом задачи.
  6. Информацию о ресурсах, которыми процесс владеет и/или имеет право пользоваться (указатели на открытые файлы, информация о незавершенных операциях ввода/вывода и т.п.).
  7. Место (или его адрес) для организации общения с другими процессами.
  8. Параметры времени запуска (момент времени, когда процесс должен активизироваться, и периодичность этой процедуры).
  9. В случае отсутствия системы управления файлами – адрес задачи на диске в ее исходном состоянии и адрес на диске, куда она выгружается из оперативной памяти, если ее вытесняет другая.

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

Дескрипторы, как правило, постоянно располагаются в оперативной памяти с целью ускорить работу супервизора, который организует их в списки (очереди) и отображает изменение состояния процесса перемещением соответствующего описателя из одного списка в другой.

Для каждого состояния (за исключением состояния выполнения для однопроцессорной системы) ОС ведет соответствующий список задач, находящийся в этом состоянии. Однако для состояния ожидания может быть не один список, а столько, сколько различных видов ресурсов могут вызывать состояние ожидания.

Например, состояний ожидания завершения операции ввода/вывода может быть столько, сколько устройств ввода/вывода содержится в системе.

Процессы и потоки

Чтобы поддерживать мультипрограммирование, ОС должна определить и оформить для себя те внутренне единицы работы, между которыми будет разделяться процессор и другие ресурсы компьютера. В настоящее время в большинстве ОС определены два типа единиц работы:

  • Процесс (более крупная единица работы).
  • Поток (нить или тред) – более мелкая единица работы, которую требует для своего выполнения процесс.
  • Когда говорят о процессах, то тем самым хотят отметить, что ОС поддерживает их обособленность: у каждого процесса имеется свое виртуальное адресное пространство, каждому процессу назначаются свои ресурсы – файлы, окна и др. Такая обособленность нужна для того, чтобы защитить один процесс от другого, поскольку они, совместно используя все ресурсы вычислительной системы, конкурируют друг с другом.

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

Для повышения быстродействия процессов есть возможность задействовать внутренний параллелизм в самих процессах.

Например, некоторые операции, выполняемые приложением, могут требовать для своего исполнения достаточно длительного использования ЦП. В этом случае при интерактивной работе с приложением пользователь вынужден долго ожидать завершения заказанной операции и не может управлять приложением до тех пор, пока операция не выполнится до самого конца. Такие ситуации встречаются достаточно часто, например, при обработке больших изображений в графических редакторах. Если же программные модули, исполняющие такие длительные операции, оформлять в виде самостоятельных «подпроцессов» (потоков), которые будут выполняться параллельно с другими «подпроцессами», то у пользователя появляется возможность параллельно выполнять несколько операций в рамках одного приложения (процесса).

Можно выделить следующие отличия потоков от процессов:

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

Главное, что обеспечивает многопоточность, — это возможность параллельно выполнять несколько видов операций в одной прикладной программе. За счет чего реализуется эффективное использование ресурсов ЦП, а суммарное время выполнения задач становится меньше.

Например, если табличный процессор или текстовый процессор были разработаны с учетом возможностей многопоточной обработки, то пользователь может запросить пересчет своего рабочего листа или слияние нескольких документов и одновременно продолжать заполнять таблицу или открывать для редактирования следующий документ.

Диспетчер задач WINDOWS

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

Диспетчер задач служит для отображения ключевых показателей быстродействия компьютера. Для выполняемых программ можно просмотреть их состояние и завершить программы, переставшие отвечать на запросы. Имеется возможность просмотра активности выполняющихся процессов с использованием до 15 параметров, а также графиков и сведений об использовании ЦП и памяти.

Кроме того, если имеется подключение к сети, можно просматривать состояние сети и параметры ее работы. Если к компьютеру подключились несколько пользователей, можно увидеть их имена, какие задачи они выполняют, а также отправить им сообщение.

На вкладке Процессы отображаются сведения о выполняющихся на компьютере процессах: сведения об использовании ЦП и памяти, счетчике процессов и некоторые другие параметры:

На вкладке Быстродействие, отображаются сведения о счетчике дескрипторов и потоках, параметры памяти:

Потребность в синхронизации потоков возникает только в мультипрограммной ОС и связана с совместным использованием аппаратных и информационных ресурсов компьютера. Синхронизация необходима для исключения гонок (см. далее) и тупиков при обмене данными между потоками, разделении данных, при доступе к процессору и устройствам ввода-вывода.

Синхронизация потоков и процессов заключается в согласовании их скоростей путем приостановки потока до наступления некоторого события и последующей его активизации при наступлении этого события.

Пренебрежение вопросами синхронизации в многопоточной системе может привести к неправильному решению задачи или даже к краху системы.

Пример. Задача ведения базы данных клиентов некоторого предприятия.

Каждому клиенту отводится отдельная запись в базе данных, в которой имеются поля Заказ и Оплата. Программа, ведущая базу данных, оформлена как единый процесс, имеющий несколько потоков, в том числе:

  • Поток А, который заносит в базу данных информацию о заказах, поступивших от клиентов.
  • Поток В, который фиксирует в базе данных сведения об оплате клиентами выставленных счетов.

Оба эти потока совместно работают над общим файлом базы данных, используя однотипные алгоритмы:

  1. Считать из файла БД в буфер запись и клиенте с заданным идентификатором.
  2. Ввести новое значение в поле Заказ (для потока А) или оплата (для потока В).
  3. Вернуть модифицированную запись в файл БД.

Обозначим шаги 1-3 для потока А как А1-А3, а для потока В как В1-В3. Предположим, что в некоторый момент поток А обновляет поле Заказ записи о клиенте N. Для этого он считывает эту запись в свой буфер (шаг А1), модифицирует значение поля Заказ (шаг А2), но внести запись в базу данных не успевает, так как его выполнение прерывается, например, вследствие истечение кванта времени.

Предположим, что потоку В также потребовалось внести сведения об оплате относительно того же клиента N. Когда подходит очередь потока В, он успевает считать запись в свой буфер (шаг В1) и выполнить обновление поля Оплата (шаг В2), а затем прерывается. Заметим, что в буфере у потока В находится запись о клиенте N, в которой поле Заказ имеет прежнее, не измененное значение.

Важным понятием синхронизации процессов является понятие «критическая секция» программы. Критическая секция — это часть программы, в которой осуществляется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находился максимум один процесс. Этот прием называют взаимным исключением.

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

Другим способом является использование блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная переменная, которая принимает значение 1, если ресурс свободен (то есть ни один процесс не находится в данный момент в критической секции, связанной с данным процессом), и значение 0, если ресурс занят. На рисунке ниже показан фрагмент алгоритма процесса, использующего для реализации взаимного исключения доступа к разделяемому ресурсу D блокирующую переменную F(D). Перед входом в критическую секцию процесс проверяет, свободен ли ресурс D. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной F(D) устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной F(D) снова устанавливается равным 1.

Если все процессы написаны с использованием вышеописанных соглашений, то взаимное исключение гарантируется. Следует заметить, что операция проверки и установки блокирующей переменной должна быть неделимой. Поясняется это следующим образом. Пусть в результате проверки переменной процесс определил, что ресурс свободен, но сразу после этого, не успев установить переменную в 0, был прерван. За время его приостановки другой процесс занял ресурс, вошел в свою критическую секцию, но также был прерван, не завершив работы с разделяемым ресурсом. Когда управление было возвращено первому процессу, он, считая ресурс свободным, установил признак занятости и начал выполнять свою критическую секцию. Таким образом, был нарушен принцип взаимного исключения, что потенциально может привести к нежелаемым последствиям. Во избежание таких ситуаций в системе команд машины желательно иметь единую команду «проверка-установка», или же реализовывать системными средствами соответствующие программные примитивы, которые бы запрещали прерывания на протяжении всей операции проверки и установки.

Реализация критических секций с использованием блокирующих переменных имеет существенный недостаток: в течение времени, когда один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять рутинные действия по опросу блокирующей переменной, бесполезно тратя процессорное время. Для устранения таких ситуаций может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по-своему, но в любом случае используются системные функции аналогичного назначения, которые условно называются WAIT(x) и POST(x), где x — идентификатор некоторого события.

Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(D), здесь D обозначает событие, заключающееся в освобождении ресурса D. Функция WAIT(D) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события D. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет системную функцию POST(D), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события D, в состояние ГОТОВНОСТЬ.

Обобщающее средство синхронизации процессов предложил Дейкстра, который ввел два новых примитива. В абстрактной форме эти примитивы, обозначаемые P и V, оперируют над целыми неотрицательными переменными, называемыми семафорами. Пусть S такой семафор. Операции определяются следующим образом:

V(S): переменная S увеличивается на 1 одним неделимым действием; выборка, инкремент и запоминание не могут быть прерваны, и к S нет доступа другим процессам во время выполнения этой операции.

P(S): уменьшение S на 1, если это возможно. Если S=0, то невозможно уменьшить S и остаться в области целых неотрицательных значений, в этом случае процесс, вызывающий P-операцию, ждет, пока это уменьшение станет возможным. Успешная проверка и уменьшение также является неделимой операцией.

В частном случае, когда семафор S может принимать только значения 0 и 1, он превращается в блокирующую переменную. Операция P заключает в себе потенциальную возможность перехода процесса, который ее выполняет, в состояние ожидания, в то время как V-операция может при некоторых обстоятельствах активизировать другой процесс, приостановленный операцией P.

Взаимоблокировка процессов

При организации параллельного выполнения нескольких процессов одной из главных функций ОС является корректное распределение ресурсов между выполняющимися процессами и  обеспечение процессов средствами взаимной синхронизации и обмена данными.

При параллельном исполнении процессов могут возникать ситуации, при которых два или более процесса все время находятся в заблокированном состоянии. Самый простой случай – когда каждый из двух процессов ожидает ресурс, занятый другим процессом. Из-за такого ожидания ни один из процессов не может продолжить исполнение и освободить в конечном итоге ресурс, необходимый другому процессу. Эта тупиковая ситуация называется дедлоком (dead lock), тупикомклинчем или взаимоблокировкой.

Говорят, что в мультизадачной системе процесс находится в состоянии тупика, если он ждет события, которое никогда не произойдет.

Тупиковые ситуации надо отличать от простых очередей, хотя и те и другие возникают при совместном использовании ресурсов и внешне выглядят похоже: процесс приостанавливается и ждет освобождения ресурса. Однако очередь — это нормальное явление, неотъемлемый признак высокого коэффициента использования ресурсов при случайном поступлении запросов. Она возникает тогда, когда ресурс недоступен в данный момент, но через некоторое время он освобождается, и процесс продолжает свое выполнение. Тупик же является в некотором роде неразрешимой ситуацией.

Проблема тупиков включает в себя следующие задачи:

  1. предотвращение тупиков.
  2. распознавание тупиков.
  3. восстановление системы после тупиков.

Тупики могут быть предотвращены на стадии написания программ, то есть программы должны быть написаны таким образом, чтобы тупик не мог возникнуть ни при каком соотношении взаимных скоростей процессов. Так, если бы в предыдущем примере процесс А и процесс В запрашивали ресурсы в одинаковой последовательности, то тупик был бы в принципе невозможен. Второй подход к предотвращению тупиков называется динамическим и заключается в использовании определенных правил при назначении ресурсов процессам, например, ресурсы могут выделяться в определенной последовательности, общей для всех процессов.

В некоторых случаях, когда тупиковая ситуация образована многими процессами, использующими много ресурсов, распознавание тупика является нетривиальной задачей. Существуют формальные, программно-реализованные методы распознавания тупиков, основанные на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки.

Если же тупиковая ситуация возникла, то не обязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, при этом освобождаются ресурсы, ожидаемые остальными процессами, можно вернуть некоторые процессы в область свопинга, можно совершить «откат» некоторых процессов до так называемой контрольной точки, в которой запоминается вся информация, необходимая для восстановления выполнения программы с данного места. Контрольные точки расставляются в программе в местах, после которых возможно возникновение тупика.

Процессы, потоки и задания. Продолжение

Эксперимент: просмотр информации о процессах с помощью Диспетчера задач

Встроенный в 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
Оценить некоторые основные возможности Process Explorer вам помогут следующие действия:

  1. Обратите внимание на то, что хост-процессы служб по умолчанию выделены розовым фоном. Ваши собственные процессы выделены синим фоном. (Цвета можно настроить по-другому.)
  2. Проведите указателем мыши над отображениями имен процессов и обратите внимание на то, что в окне подсказки показывается полное путевое имя. Как уже говорилось, для процессов конкретного типа в подсказке выводятся и дополнительные сведения.
  3. Щелкните на пунктах View (Вид), Select Columns (Выбрать столбцы) и во вкладке Process Image (Отображение процесса) установите флажок Image Path (Отображение пути).
  4. Отсортируйте информацию, щелкнув на заголовке столбца Process (Процесс), и обратите внимание на то, что отображение дерева исчезло. (Доступен либо просмотр дерева, либо просмотр информации, отсортированной по любому из показанных столбцов.) Щелкните еще раз для сортировки в порядке следования имен от Z до A. Затем щелкните еще раз, чтобы вернуться к просмотру дерева процессов.
  5. Чтобы просматривать только свои процессы, щелкните на пункте View (Вид) и снимите флажок ShowProcessesFromAllUsers (Показывать процессы от всех пользователей).
  6. Щелкните на пунктах 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-разрядный контекст.

  • Как посмотреть последние открытые файлы на компе windows 10
  • Как посмотреть почему перезагрузился компьютер windows 10
  • Как посмотреть последние открытые приложения на компьютере windows 10
  • Как посмотреть почему выключился компьютер windows 10
  • Как посмотреть пользователей в windows через cmd