Получить количество процессоров, на которых запущен конкретный процесс - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть processID, связанный с процессом.Я создал этот процесс, используя функцию CreateProcess().Во время работы я хочу отслеживать, сколько процессоров он использует и сколько времени этот исполняемый файл использовал на многоядерных машинах.

Я хочу написать код C ++ для того же самого;кто-нибудь может мне помочь в этом?

Я использую многоядерные машины Win XP.

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

GetProcessAffinityMask:

Извлекает маску сходства процесса для указанного процесса и маску сходства системы для системы.

GetProcessTimes:

Извлекает информацию о времени для указанного процесса.

0 голосов
/ 23 февраля 2012

Вы можете получить этот уровень детализации в Vista или более поздней версии, используя трассировку событий для Windows (ETW) и событие CSwitch (которое генерируется при каждом переключении контекста).

Различные инструменты (например, Windows Performance Toolkit ) собирают и визуализируют эти данные.

Однако это не поддерживается в Windows XP.

Если вы просто хотите знать, каков ваш типичный параллелизм (то есть, сколько ваших потоков запущено в данный момент времени), вы можете регулярно выбирать данные потока perfmon (из HKEY_PERFORMANCE_DATA). Счетчик «Thread State» даст вам мгновенное состояние каждого потока в вашем процессе (т.е. работает ли каждый поток или нет). Очевидно, что этот процесс выборки ограничит максимальный параллелизм до (количество процессоров - 1).

Но вам действительно нужно это много деталей? GetProcessTimes обычно достаточно.

Обновление

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

Чтобы получить данные для отчета, запустите perfmon от имени администратора.

  • Перейдите к «Performance Monitor» с правой стороны, чтобы отобразить график производительности в реальном времени. Выберите объекты / счетчики, которые вы хотите отслеживать (т. Е. «% Времени процессора» для всех процессоров и процессов). Perfmon должен начать сбор данных в режиме реального времени.
  • Щелкните правой кнопкой мыши по графику и выберите частоту захвата (например, если ваше приложение работает часами, вы, вероятно, не хотите данных каждую секунду).
  • Щелкните правой кнопкой мыши узел «Performance Monitor» в правом дереве и выберите «New | Data Collector Set». Введите имя для него и нажмите другие значения по умолчанию.
  • Перейдите к своему набору сборщиков данных справа (в разделе «Наборы сборщиков данных | Определено пользователем»). Вы можете начать и остановить сбор данных, используя кнопки панели инструментов (или щелкнув правой кнопкой мыши).
  • Теперь у вас есть данные, которые возвращаются на график монитора производительности и выбираете «Просмотр данных журнала» (вторая кнопка панели инструментов). Выберите файл журнала на вкладке «Источник». Это отобразит график ваших захваченных данных.
  • Щелкните правой кнопкой мыши на графике и выберите «Сохранить данные как ...». Вы можете выбрать CSV или TSV.

И это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...