Win32: Рассчитать использование ЦП потока в многоядерной / многопроцессорной системе - PullRequest
4 голосов
/ 04 ноября 2008

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

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

Я посмотрел на WMI, но это, кажется, излишнее решение задачи. Будет ли GetThreadTimes () работать на то, что мне нужно?

1 Ответ

7 голосов
/ 04 ноября 2008

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

Для вычислений времени выполнения, GetThreadTimes - это правильный API, да. Если вы хотите узнать, какой процент (теоретического) ЦП использовал процесс, вычислите

(kerneltime+usertime) / (now - starttime) / numberofcpus

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

(usedtimenow - usedtimeprevious) / (now - previous) / numberofcpus

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

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