Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Может ли поток узнать, что его прерывал Windows?  (Прочитано 15246 раз)
0 Пользователей и 1 Гость смотрят эту тему.
VladimirH
Гость
« : 19-09-2003 09:35 » 

Известно, что для поддержки многопоточности операционная система постоянно переключает процессор на обработку очередного ждущего потока. А возможно ли потоку узнать, что его хотя бы один раз прерывали?
Записан
.
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-09-2003 10:57 » 

VladimirH, вряд ли.
ЛЮБОЙ поток всегда прерывается хотя бы на выполнение IRQ. Я не говорю уже, что там просисходит переключение аппаратного  контекста процесса на контекст обработчика прерывания (см. описание процессора i386. На более старших моделях - все то же самое), в обработчике прерывание таймера происходит програмно-аппаратное переключение процессов в ядре ОСи, а даже оттуда эту инфу не выковырить, на мой взгляд...
Записан
Serega
Гость
« Ответ #2 : 19-09-2003 12:56 » 

А зачем это, возможно ты не там ищешь решение
Записан
Lex
Специалист

ru
Offline Offline

WWW
« Ответ #3 : 19-09-2003 13:00 » 

Я так думаю, что сам факт того, что поток хоть раз прервали, установить можно. А почти всегда это будет, да  - прервали. Улыбаюсь
Записан

Megabyte be with you!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 19-09-2003 13:28 » 

Конечно можно! У объекта поток есть счетчик переключений, который показывает сколько раз его вытесняли с процессора(его увеличивает планировщик при переключении потоков). Получить из юзер мода  его можно через NtQuerySystemInformation для класса SystemProcessesAndTreadsInformation там у каждого процесса есть массив структур с инфой о потоках а там счетчик ContextSwitchCount, он увеличивается при каждом переключении потока.
Подробнее в "Windows NT/2000 Native API".
Записан
VladimirH
Гость
« Ответ #5 : 19-09-2003 13:39 » 

Цитата: Serega
А зачем это, возможно ты не там ищешь решение

Ситуация следующая:
для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter.  А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 19-09-2003 13:53 » 

Так в инфе, выдаваемой NtQuerySystemInformation для потоков есть 100 наносекундные счетчики времени в режиме ядра и в режиме пользователя, используй их. В 9х этих ф-ций нет.
Записан
VladimirH
Гость
« Ответ #7 : 19-09-2003 14:06 » 

Так... Очень хорошо. Но, об'являю об'ект типа SystemProcessesAndTreadsInformation, получаю "undeclared identifier", лезу в MSDN - нет ничего про него, да и про NtQuerySystemInformation тоже ничего. Или я что не так делаю?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #8 : 19-09-2003 16:47 » 

Цитата

NtQuerySystemInformation


Скорее всего в документации к DDK эта функция должна быть - еще хороший адрес http://msdn.microsoft.com
Записан

А птичку нашу прошу не обижать!!!
Anonymous
Гость
« Ответ #9 : 22-09-2003 14:06 » new

По ссылке нашел, спасибо!
Записан
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
Главный специалист

ru
Offline Offline

« Ответ #12 : 26-09-2003 09:47 » 

Сообщение выше- мое. Опять автоматический вход не работает!
Записан
VladimirH
Гость
« Ответ #13 : 26-09-2003 10:06 » 

Древний SDK пришел от сисадмина(?!), а в остальном уже сам разберусь. Спасибо.
Записан
Anonymous
Гость
« Ответ #14 : 15-01-2004 15:13 » 

Цитата: VladimirH
Цитата: Serega
А зачем это, возможно ты не там ищешь решение

Ситуация следующая:
для оптимизации программ на предмет повышения быстродействия мною была написана программка, в исходный код которой в определенные места вставляешь два варианта какого-то алгоритма. Задается количество повторений этих алгоритмов и получаешь времена выполнения обоих вариантов. Причем, имеется возможность замерять времена используя как функцию GetThreadTimes, так и функцию QueryPerformanceCounter. Однако, GetThreadTimes не работает в 95-ом и 98-ом Windows, да и точность у нее хуже чем у QueryPerformanceCounter.  А у последней свой недостаток: не учитываются переключения на другие потоки. Поэтому хочется как-то зафиксировать факт переключения и, уменьшив количество повторений (в попытке избежать переключения), заново запустить тест. А просто так уменьшая количество повторений нарываешься на предел чувствительности функции QueryPerformanceCounter, вот и пытаюсь найти золотую середину.


предел чувствительности функции QueryPerformanceCounter = 1 CPU clock  Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines