Статистика по потокам внутри своей программы.
От: Аноним  
Дата: 15.08.14 09:43
Оценка:
Привет всем.

Хочется получить статистику работы потоков внутри одного процесса.
Каким образом до этого можно добраться?

В двух словах, проблема такова:
Есть симулятор оборудования, написанный для Win32 платформы.
При работе на реальном железе я без проблем получаю информацию о переключении потоков.
Считаю сколько времени процессор в Idle, а сколько в других потоках.
Очень нужна такая же информация в симуляторе. Как такое получить?


Сергей.
Re: Статистика по потокам внутри своей программы.
От: DM.PROFF Россия  
Дата: 16.08.14 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть симулятор оборудования, написанный для Win32 платформы.

А>При работе на реальном железе я без проблем получаю информацию о переключении потоков.
А>Считаю сколько времени процессор в Idle, а сколько в других потоках.
А>Очень нужна такая же информация в симуляторе. Как такое получить?

Для начала гляньте GetThreadTimes
Re[2]: Статистика по потокам внутри своей программы.
От: Аноним  
Дата: 18.08.14 09:49
Оценка:
Здравствуйте, DM.PROFF, Вы писали:

DP> ... гляньте на GetThreadTimes

Спасибо. Эту ф-цию буду использовать если не будет другой альтернативы.
Мне нужно (точнее — хотелось бы) отлавливать сам факт переключения потоков.
Желание это проистекает из единообразной логики работы как оборудоения, так и симулятора.
На самом деле, при переключении потока еще делается несколько операций.

Что, неужели никак?
Re: Статистика по потокам внутри своей программы.
От: antropolog  
Дата: 18.08.14 21:13
Оценка:
Здравствуйте, Аноним, Вы писали:

perfmon.msc
Там есть статистика по Thread->Context Switches/sec и есть возможность выбрать конкретный процесс. Для более глубокого анализа есть Intel Thread Analyzer ( сейчас это часть VTune )
Re[3]: Статистика по потокам внутри своей программы.
От: x64 Россия  
Дата: 19.08.14 10:46
Оценка:
А>Что, неужели никак?

Можно совершенно легально получить кол-во переключений контекста потока и множить его на среднее время, затрачиваемое на переключение, это же для статистики только? Ну или похукай переключалку контекстов и меряй там что тебе нужно, но... чота это что-то я тут уже херню советую.
Re: Статистика по потокам внутри своей программы.
От: kolobok0  
Дата: 21.08.14 22:24
Оценка:
..
А>Считаю сколько времени процессор в Idle, а сколько в других потоках.

когда то давно на не вытесняющей оси делал похожее — высчитывал общую загрузку железа.
не скажу насколько поможет в вытесняющих осях, но... смысл следующий..
вы засекаете временной интервал при отдаче управления другим потокам. в не вытесняющей это будет переключение всех не спящих ниток.
в вытесняющей — у вас добавляется квантование таймером. Для маленьких осей вектор решения = Idle поток. Обычно на него вешается
подобная механизация. А вот в больших братах — типа форточек, может не прокатить такой фокус. имхо конечно же.

ЗЫ
И ещё инфа...
Была на просторах инета статья про смещения форточек в сторону реал-тайм осей(натыкался в году 2006 где то). Область — компьютерные игры. Я так думаю, что там можно найти инфу по нюансам планировщика виндоуз.
Re[4]: Статистика по потокам внутри своей программы.
От: Аноним  
Дата: 23.08.14 06:43
Оценка:
Здравствуйте, x64, Вы писали:

А>>Что, неужели никак?

x64>Можно совершенно легально получить кол-во переключений контекста потока ... это же для статистики только?
Получилось очень криво.
Действительно нужно _только_ для статистики.
Но статистика "железная" и эмуляторная получилась уж очень разная.
В железе (FreeRTOS) есть свой "хук" который вызывается при каждом переключении потоков.
Само тело программы уже считает сколько времени было затрачено в потоках.
Дальше телеметрическими методами можно вытягивать все это.
В принципе, получилось и этим способом. Но уж очень отличаются значения в железе и на эмуляторе.

x64>похукай переключалку контекстов и меряй там что тебе нужно

Что-то мне подсказывает, что это именно то, что мне нужно.
Только я не предполагал, что решение может быть такое "тяжелое". Думал, что есть более легкие методы внутри одного процесса.
На какой API надо поставить хук?
Re[5]: Статистика по потокам внутри своей программы.
От: x64 Россия  
Дата: 23.08.14 14:31
Оценка:
А>На какой API надо поставить хук?

В винде это не так просто, нет никакой "API", которая переключает контексты, тебе нужно будет похукать код ядра, но 64-битное ядро защищено PG, поэтому сие тупо невозможно, если только не похукать загрузчик ОС, как в буткитах, но на 8 винде придётся что-то придумать с Secure Boot, так что... Тебе оно точно надо? Если только на 32-битной системе сделать, там ядро не защищено ни чем, начни с изучения исходников ядра Server 2003 SP1 aka Windows Research Kit (WRK), а также исходников антируткитов (например, Process Hunter, там есть кое-что на эту тему), которые хукают в т.ч. и переключалку контекстов, чтобы обнаруживать скрытые потоки.
Re[3]: Статистика по потокам внутри своей программы.
От: breee breee  
Дата: 23.08.14 17:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Желание это проистекает из единообразной логики работы как оборудоения, так и симулятора.

А>На самом деле, при переключении потока еще делается несколько операций.

А>Что, неужели никак?


Ядро логирует переключения контекста при помощи ETW. Для того, чтобы анализировать эти события можно использовать xperf, либо если требуется это делать в собственном коде, то теоретически должно помочь ETW API.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.