Win32: расчет загрузки ЦП потоком в многоядерной/многопроцессорной системе

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

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

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


person sachinjm    schedule 04.11.2008    source источник


Ответы (1)


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

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

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

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

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

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

person Martin v. Löwis    schedule 04.11.2008