VladimirH
Гость
|
|
« : 19-09-2003 09:35 » |
|
Известно, что для поддержки многопоточности операционная система постоянно переключает процессор на обработку очередного ждущего потока. А возможно ли потоку узнать, что его хотя бы один раз прерывали?
|
|
|
Записан
|
|
|
|
.
Молодой специалист
Offline
Пол:
|
|
« Ответ #1 : 19-09-2003 10:57 » |
|
VladimirH, вряд ли. ЛЮБОЙ поток всегда прерывается хотя бы на выполнение IRQ. Я не говорю уже, что там просисходит переключение аппаратного контекста процесса на контекст обработчика прерывания (см. описание процессора i386. На более старших моделях - все то же самое), в обработчике прерывание таймера происходит програмно-аппаратное переключение процессов в ядре ОСи, а даже оттуда эту инфу не выковырить, на мой взгляд...
|
|
|
Записан
|
|
|
|
Serega
Гость
|
|
« Ответ #2 : 19-09-2003 12:56 » |
|
А зачем это, возможно ты не там ищешь решение
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #3 : 19-09-2003 13:00 » |
|
Я так думаю, что сам факт того, что поток хоть раз прервали, установить можно. А почти всегда это будет, да - прервали.
|
|
|
Записан
|
Megabyte be with you!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #4 : 19-09-2003 13:28 » |
|
Конечно можно! У объекта поток есть счетчик переключений, который показывает сколько раз его вытесняли с процессора(его увеличивает планировщик при переключении потоков). Получить из юзер мода его можно через NtQuerySystemInformation для класса SystemProcessesAndTreadsInformation там у каждого процесса есть массив структур с инфой о потоках а там счетчик ContextSwitchCount, он увеличивается при каждом переключении потока. Подробнее в "Windows NT/2000 Native API".
|
|
|
Записан
|
|
|
|
VladimirH
Гость
|
|
« Ответ #5 : 19-09-2003 13:39 » |
|
А зачем это, возможно ты не там ищешь решение Ситуация следующая: для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter. А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #6 : 19-09-2003 13:53 » |
|
Так в инфе, выдаваемой NtQuerySystemInformation для потоков есть 100 наносекундные счетчики времени в режиме ядра и в режиме пользователя, используй их. В 9х этих ф-ций нет.
|
|
|
Записан
|
|
|
|
VladimirH
Гость
|
|
« Ответ #7 : 19-09-2003 14:06 » |
|
Так... Очень хорошо. Но, об'являю об'ект типа SystemProcessesAndTreadsInformation, получаю "undeclared identifier", лезу в MSDN - нет ничего про него, да и про NtQuerySystemInformation тоже ничего. Или я что не так делаю?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #8 : 19-09-2003 16:47 » |
|
NtQuerySystemInformation
Скорее всего в документации к DDK эта функция должна быть - еще хороший адрес http://msdn.microsoft.com
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Anonymous
Гость
|
|
« Ответ #9 : 22-09-2003 14:06 » |
|
По ссылке нашел, спасибо!
|
|
|
Записан
|
|
|
|
VladimirH
Гость
|
|
« Ответ #10 : 26-09-2003 09:28 » |
|
Похоже я поторопился. С сайта http://msdn.microsoft.com скачал и с'инсталлировал Platform SDK November 2001, но компиляция все равно не идет: согласно help-у на функцию NtQuerySystemInformation (на том же сайте), необходим файл Winternl.h, а на моем компе как не было его, так и сейчас нет. Что делать?
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #11 : 26-09-2003 09:46 » |
|
Во первых у меня в SDK есть Winternl.h. Во вторых- там по моему нет определения для SystemProcessesAndTreadsInformation, это недокументированно.
В третьих- Скачай с сайта книгу "Windows NT/2000 Native API" и возьми определение оттуда, а также все структуры. По моему создать свой заголовочный файл не проблема, по инету заголовочных файлов для недокументированных NT/ZW ф-ций до кучи.
И где ты нашел такой древний SDK, у меня валяется диск с SDK за май 2003, пришел по MSDN.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #12 : 26-09-2003 09:47 » |
|
Сообщение выше- мое. Опять автоматический вход не работает!
|
|
|
Записан
|
|
|
|
VladimirH
Гость
|
|
« Ответ #13 : 26-09-2003 10:06 » |
|
Древний SDK пришел от сисадмина(?!), а в остальном уже сам разберусь. Спасибо.
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #14 : 15-01-2004 15:13 » |
|
А зачем это, возможно ты не там ищешь решение Ситуация следующая: для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter. А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину. предел чувствительности функции QueryPerformanceCounter = 1 CPU clock
|
|
|
Записан
|
|
|
|
|