Хочется получить статистику работы потоков внутри одного процесса.
Каким образом до этого можно добраться?
В двух словах, проблема такова:
Есть симулятор оборудования, написанный для Win32 платформы.
При работе на реальном железе я без проблем получаю информацию о переключении потоков.
Считаю сколько времени процессор в Idle, а сколько в других потоках.
Очень нужна такая же информация в симуляторе. Как такое получить?
Здравствуйте, Аноним, Вы писали:
А>Есть симулятор оборудования, написанный для Win32 платформы. А>При работе на реальном железе я без проблем получаю информацию о переключении потоков. А>Считаю сколько времени процессор в Idle, а сколько в других потоках. А>Очень нужна такая же информация в симуляторе. Как такое получить?
Re[2]: Статистика по потокам внутри своей программы.
От:
Аноним
Дата:
18.08.14 09:49
Оценка:
Здравствуйте, DM.PROFF, Вы писали:
DP> ... гляньте на GetThreadTimes
Спасибо. Эту ф-цию буду использовать если не будет другой альтернативы.
Мне нужно (точнее — хотелось бы) отлавливать сам факт переключения потоков.
Желание это проистекает из единообразной логики работы как оборудоения, так и симулятора.
На самом деле, при переключении потока еще делается несколько операций.
perfmon.msc
Там есть статистика по Thread->Context Switches/sec и есть возможность выбрать конкретный процесс. Для более глубокого анализа есть Intel Thread Analyzer ( сейчас это часть VTune )
Re[3]: Статистика по потокам внутри своей программы.
Можно совершенно легально получить кол-во переключений контекста потока и множить его на среднее время, затрачиваемое на переключение, это же для статистики только? Ну или похукай переключалку контекстов и меряй там что тебе нужно, но... чота это что-то я тут уже херню советую.
.. А>Считаю сколько времени процессор в Idle, а сколько в других потоках.
когда то давно на не вытесняющей оси делал похожее — высчитывал общую загрузку железа.
не скажу насколько поможет в вытесняющих осях, но... смысл следующий..
вы засекаете временной интервал при отдаче управления другим потокам. в не вытесняющей это будет переключение всех не спящих ниток.
в вытесняющей — у вас добавляется квантование таймером. Для маленьких осей вектор решения = Idle поток. Обычно на него вешается
подобная механизация. А вот в больших братах — типа форточек, может не прокатить такой фокус. имхо конечно же.
ЗЫ
И ещё инфа...
Была на просторах инета статья про смещения форточек в сторону реал-тайм осей(натыкался в году 2006 где то). Область — компьютерные игры. Я так думаю, что там можно найти инфу по нюансам планировщика виндоуз.
Re[4]: Статистика по потокам внутри своей программы.
От:
Аноним
Дата:
23.08.14 06:43
Оценка:
Здравствуйте, x64, Вы писали:
А>>Что, неужели никак? x64>Можно совершенно легально получить кол-во переключений контекста потока ... это же для статистики только?
Получилось очень криво.
Действительно нужно _только_ для статистики.
Но статистика "железная" и эмуляторная получилась уж очень разная.
В железе (FreeRTOS) есть свой "хук" который вызывается при каждом переключении потоков.
Само тело программы уже считает сколько времени было затрачено в потоках.
Дальше телеметрическими методами можно вытягивать все это.
В принципе, получилось и этим способом. Но уж очень отличаются значения в железе и на эмуляторе.
x64>похукай переключалку контекстов и меряй там что тебе нужно
Что-то мне подсказывает, что это именно то, что мне нужно.
Только я не предполагал, что решение может быть такое "тяжелое". Думал, что есть более легкие методы внутри одного процесса.
На какой API надо поставить хук?
Re[5]: Статистика по потокам внутри своей программы.
В винде это не так просто, нет никакой "API", которая переключает контексты, тебе нужно будет похукать код ядра, но 64-битное ядро защищено PG, поэтому сие тупо невозможно, если только не похукать загрузчик ОС, как в буткитах, но на 8 винде придётся что-то придумать с Secure Boot, так что... Тебе оно точно надо? Если только на 32-битной системе сделать, там ядро не защищено ни чем, начни с изучения исходников ядра Server 2003 SP1 aka Windows Research Kit (WRK), а также исходников антируткитов (например, Process Hunter, там есть кое-что на эту тему), которые хукают в т.ч. и переключалку контекстов, чтобы обнаруживать скрытые потоки.
Re[3]: Статистика по потокам внутри своей программы.
Здравствуйте, Аноним, Вы писали:
А>Желание это проистекает из единообразной логики работы как оборудоения, так и симулятора. А>На самом деле, при переключении потока еще делается несколько операций.
А>Что, неужели никак?
Ядро логирует переключения контекста при помощи ETW. Для того, чтобы анализировать эти события можно использовать xperf, либо если требуется это делать в собственном коде, то теоретически должно помочь ETW API.