Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
Всем привет! Хочу поделиться с общественностью некоторыми фактами из жизни функций, ожидающих на таймере (имеется в виду ядерный таймер). Информация относится к функциям Sleep, SleepEx, WaitForXXX, MsgWaitForXXX, функциям для работы с WaitableTimers и еще может какие пропустил :)
Иногда возникает дурацкая задача - отсчитывать интервалы с миллисекундным (а иногда и микросекундным) разрешением.
Возникают варианты:
1) использовать Sleep,SleepEx функции с указанием задержки в мсек, например Sleep(5)
2) создать таймер ядра с помощью CreateWaitableTimer и потом ждать его с помощью WaitForXXX
3) крутиться в цикле используя GetTickCount или какие-либо функции для получения времени (не самый лучший вариант, т.к. тупо грузит процессор)
4) еще какой-то способ, который я не вспомнил...

Для всех этих вариантов есть одна и та же подстава - разрешение системного таймера, которое на обычных машинах составляет 10 или 15 мсек (проверить можно с помощью ClockRes Руссиновича). С этим разрешением работает и сам планировщик, поэтому ожидать таймер ядра с помощью WaitForXXX также бесполезно, как и вызывать Sleep - все равно меньше 10-15 мсек не получится. Sleep(0) и WaitForXXX с нулевым ожиданием - отдельные случаи и к теме не относятся.

Есть два варианта выхода из этой ситуации - оба, честно говоря, не очень :(
Первый вариант: повышаем приоритет потока до высокого или реального и крутимся в цикле, используя QueryPerformanceCounter, предварительно получив разрешение высокоточного таймера с помощью QueryPerformanceFrequency. Высокоточный таймер реализован в отдельной микросхеме, его частота одна и та же практически на всех новых машинах и составляет порядка 3 580 000 отсчетов в секунду. Частота не зависит от каких-либо факторов и задается при старте машины.

Кстати не знаю насчет счетчика RDTSC, но могу предположить, что его изменение зависит от частоты работы процессора (по крайней мере это логичное предположение), поэтому можно нарваться на неправильную работу на мобильных системах с автоматическим изменением тактовой частоты.

Таким образом можно реализовывать микросекундные задержки с высокой точностью. Единственное, что надо учитывать, это возможность вытеснения нашего потока, например более приоритетным потоком ядра, что соответственно может добавить к ожиданию все те же несчастные 10-15 мсек. Но так как мы поднимаем приоритет, то такая ситуация маловероятна.

Второй вариант (по совместительству - грязный хак, используемый самим Microsoft :)) - использование функций из мультимедийной библиотеки winmm.dll timeBeginPeriod (uses MMSystem), которая позволяет изменить разрешение системного таймера вплоть до 1 миллисекунды. Минимальное и максимальное значения разрешения можно узнать с помощью timeGetDevCaps.
После изменения разрешения таймера все вышеописанные функции будут работать с новой точностью. Но здесь нас ждет одна неприятная подстава: изменение разрешения таймера влияет на всю систему в целом, т.е. на планировщик, в результате чего ОСь тратит больший процент времени на планирование потоков, что соответственно приводит к падению производительности.
Стоит также заметить, что после завершения приложения, изменившего разрешение таймера, система восстанавливает последнее значение. А вообще рекомендуется восстанавливать его самостоятельно с помощью timeEndPeriod.

Не очень понятно, зачем приложения типа QIP устанавливают максимальное разрешение системного таймера, тем самым заставляя систему напрягаться!!!

P.S. Надеюсь что не зря это писал и кому-то информация пригодится.
26 ноя 09, 12:02    [7981372]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
Да, совсем забыл, к этой же теме относятся также и Get/Wait/PeekMessage
26 ноя 09, 12:09    [7981434]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Вы забыли одну маленькую деталь
Операционные системы Windows НЕ ЯВЛЯЮТСЯ системами реального времени

С уважением, Vasilisk
26 ноя 09, 23:03    [7984944]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
defecator
Member

Откуда:
Сообщений: 39208
Микросекундные интервалы в винде получить можно, я вот тут уже поднимал тему:

https://www.sql.ru/forum/actualthread.aspx?tid=706737


------------------------
http://www.arm-pascal.ru
26 ноя 09, 23:14    [7984969]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
_Vasilisk_
Вы забыли одну маленькую деталь
Операционные системы Windows НЕ ЯВЛЯЮТСЯ системами реального времени

С уважением, Vasilisk


Абсолютно и полностью согласен!!! :) Поэтому и написал, что оба решения - не очень.
А при желании windows можно превратить в RTOS, но это будет уже не windows, да и поработать на ней в обычном порядке вряд-ли получится :) Но это уже совсем другая тема...
27 ноя 09, 10:53    [7986156]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
defecator, кстати, ты так и не написал результаты замеров при параллельно запущенных потоках с бесконечными циклами.
27 ноя 09, 10:55    [7986183]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
defecator
Member

Откуда:
Сообщений: 39208
Barmaley57

при желании windows можно превратить в RTOS, но это будет уже не windows, да и поработать на ней в обычном порядке вряд-ли получится :)


Очень хотелось бы обсудить именно эту тему.
Как превратить windows в RTOS ?
27 ноя 09, 10:57    [7986204]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
defecator
Barmaley57

при желании windows можно превратить в RTOS, но это будет уже не windows, да и поработать на ней в обычном порядке вряд-ли получится :)


Очень хотелось бы обсудить именно эту тему.
Как превратить windows в RTOS ?


Я вижу только одно - драйвер ядра, отключающий планирование, т.е. фактически монополизирующий процессор. При таком раскладе все ресурсы машины в твоих руках, кроме системы подкачки - она работать не будет, т.е. при ошибке страницы - сразу BSOD! Память надо пользовать только из неподкачиваемого пула.
В общем тут все от конкретной задачи зависит...
27 ноя 09, 11:01    [7986257]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
В принципе это уже ОФФТОП, но есть у меня старенький сканер HP, у которого сгорел порт USB. Так я его зацепил на LPT, а драйвер под LPT у него - жесть! Пока изображение сканируется - машина висит (причем даже мышь!). Вот такой драйвер и отключает планирование...
27 ноя 09, 11:07    [7986304]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
defecator
Member

Откуда:
Сообщений: 39208
А как же остальные дрова в винде ?
Они же при таком раскладе тоже не будут работать

------------------------
http://www.arm-pascal.ru
27 ноя 09, 11:07    [7986311]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
defecator
Member

Откуда:
Сообщений: 39208
Barmaley57
В принципе это уже ОФФТОП, но есть у меня старенький сканер HP, у которого сгорел порт USB. Так я его зацепил на LPT, а драйвер под LPT у него - жесть! Пока изображение сканируется - машина висит (причем даже мышь!). Вот такой драйвер и отключает планирование...


Ну, тоже ОФФТОП - у меня когда Flash зависает в Chrome, то тоже жесть - висит все, даже мышка. Только Ctrl+Alt+Del срабатывает, и то через пару секунд после нажатия.
27 ноя 09, 11:10    [7986342]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Barmaley57
Member

Откуда: Москва
Сообщений: 5746
defecator
А как же остальные дрова в винде ?
Они же при таком раскладе тоже не будут работать

------------------------
http://www.arm-pascal.ru


Не совсем так. Смотря до какога уровня твой драйвер поднимает IRQL. Если происходят события, IRQL которых выше, то их процедуры обработки будут спокойно запускаться. Собственно поэтому я и написал, что на windows это уже будет мало похоже. Да и синих экранов во время экспериментов можно столько посмотреть, сколько за всю жизнь бы не увидел :) Можно даже данные на харде запороть! Как говориться "welcome to VMWare"
27 ноя 09, 11:12    [7986361]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
defecator
Member

Откуда:
Сообщений: 39208
defecator
Ну, тоже ОФФТОП - у меня когда Flash зависает в Chrome, то тоже жесть - висит все, даже мышка. Только Ctrl+Alt+Del срабатывает, и то через пару секунд после нажатия.


Более того - все это безобразие происходит НА ДВУХПРОЦЕССОРНОМ компе, при этом КАЖДЫЙ ПРОЦЕССОР - ЧЕТЫРЕХЯДЕРНЫЙ. И винда 2008-я, типа, с измененным планировщиком.
Трындец.
27 ноя 09, 11:12    [7986373]     Ответить | Цитировать Сообщить модератору
 Re: Sleep, WaitForXXX и другие объекты, ожидающие на таймере  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62917
defecator
А как же остальные дрова в винде ?
Они же при таком раскладе тоже не будут работать

Они и не работают, я по крайней мере знаю один такой, оффициально документированый драйвер. Это BEEP
27 ноя 09, 11:13    [7986376]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить