Win32: Рассчитать использование ЦП потока в многоядерной / многопроцессорной системе
В настоящее время я работаю над приложением MFC, которое должно быть осведомлено об использовании процессора. Он может иметь несколько потоков в разные моменты времени, но основная часть работы выполняется основным потоком.
Я пытаюсь найти способ подсчитать, сколько процентов процессора использует этот основной поток. Тем не менее, я сталкиваюсь с некоторыми проблемами, касающимися того, как именно это сделать в многопроцессорной / многоядерной среде. Проблема в том, что большинство системных вызовов, похоже, дают системную информацию, тогда как мне нужна информация, специфичная для процессора, на котором выполняется мой основной поток.
Я посмотрел на WMI, но это кажется излишним для этой задачи. Будет ли GetThreadTimes() работать на то, что мне нужно?
1 ответ
Ваш основной поток может выполняться на разных процессорах в разное время, поэтому "информация, специфичная для процессора, на котором выполняется мой основной поток", может быть бессмысленной - это могут быть все процессоры. Windows не отслеживает, сколько раз поток выполнялся на каком процессоре, поэтому вы не можете попросить "дать мне список времени выполнения для этого потока на процессор". Единственное исключение - когда вы устанавливаете маску привязки потока к одному ЦП - тогда вы можете быть уверены, что, если поток вообще выполняется, он работает на этом единственном ЦП.
Для вычислений времени выполнения, GetThreadTimes - правильный API, да. Если вы хотите, чтобы какой процент (теоретического) процессора использовал процесс, вычислите
(kerneltime+usertime) / (now - starttime) / numberofcpus
Эта формула предполагает, конечно, что все процессоры имеют одинаковую скорость. Если вы хотите отобразить, какая часть ЦП недавно использовалась потоком, отбирайте GetThreadTimes каждую секунду, а затем вычисляйте
(usedtimenow - usedtimeprevious) / (now - previous) / numberofcpus
Если вы производите выборку каждую секунду, то теперь предыдущий будет примерно равен 1, но вы все равно должны записать время выборки - система может не заставить вас спать ровно 1 с между выборками.