а еще есть пока неустаревшая статья 1995 года
[msdn]DLLs, Processes, and Threads Technical Articles
Real-Time Systems and Microsoft Windows NT
[/msdn]
_>Если не ошибаюсь, потоки в NT планируются с квантом 15 мс. Да даже если они будут планироваться через 1 мс, чего никогда не будет, то 8 кГц ты все равно все не поймаешь с помощью событий, так как твой поток может потерять управление на 1 мс, а за это время произойдет 8 PulseEvent. Так что надо очередь организовывать.
то, как планируются потоки в NT задается матрицей квантов в ядре (see Руссинович-Соломон, Inside Windows 2000), в зависимости от разных настроек и просто версии ОС (думаю, многие видели окошко в System->Advanced->Perfomance->Advanced->Processor scheduling: предпочтение программам или фоновым сервисам. )
детали по теме: Q259025 Description of Performance Options in Windows
и статья Examining and Adjusting Thread Priority ()
... << RSDN@Home 1.1.0 stable >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Как побороть пропуск event'ов?
От:
Аноним
Дата:
02.12.03 06:26
Оценка:
Ситуация такая:
С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent.
В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?
Здравствуйте, Аноним, Вы писали:
> Ситуация такая: > С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. > При приеме данных выполняю PulseEvent. В основной нити ожидаю с помощью > WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих > самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц > частота небольшая, из-за чего такое может быть?
Если не ошибаюсь, потоки в NT планируются с квантом 15 мс. Да даже если они будут планироваться через 1 мс, чего никогда не будет, то 8 кГц ты все равно все не поймаешь с помощью событий, так как твой поток может потерять управление на 1 мс, а за это время произойдет 8 PulseEvent. Так что надо очередь организовывать.
-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[2]: Как побороть пропуск event'ов?
От:
Аноним
Дата:
02.12.03 09:32
Оценка:
Здравствуйте, alexandrov_alex, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
>> Ситуация такая: >> С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. >> При приеме данных выполняю PulseEvent. В основной нити ожидаю с помощью >> WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих >> самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц >> частота небольшая, из-за чего такое может быть?
_>Если не ошибаюсь, потоки в NT планируются с квантом 15 мс. Да даже если они будут планироваться через 1 мс, чего никогда не будет, то 8 кГц ты все равно все не поймаешь с помощью событий, так как твой поток может потерять управление на 1 мс, а за это время произойдет 8 PulseEvent. Так что надо очередь организовывать.
А разве это как-то связано с планировщиком? В ядре происходит тоже самое, т.е. я из драйвера получаю эвент о том, что пришел пакет и ничего не теряется.
Здравствуйте, Аноним, Вы писали:
> Здравствуйте, alexandrov_alex, Вы писали: > > _>Здравствуйте, Аноним, Вы писали: >
??>>> Ситуация такая:
??>>> С устройства поступают данные с частотой 8кГц. Принимаю отдельной
??>>> нитью. При приеме данных выполняю PulseEvent. В основной нити ожидаю
??>>> с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря
??>>> более 50% этих самых event'ов. Никакой обработки не делаю, просто
??>>> считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть? > > _>Если не ошибаюсь, потоки в NT планируются с квантом 15 мс. Да даже если > они будут планироваться через 1 мс, чего никогда не будет, то 8 кГц ты > все равно все не поймаешь с помощью событий, так как твой поток может > потерять управление на 1 мс, а за это время произойдет 8 PulseEvent. Так > что надо очередь организовывать. > > А разве это как-то связано с планировщиком? В ядре происходит тоже самое, > т.е. я из драйвера получаю эвент о том, что пришел пакет и ничего не > теряется.
Связано. Код в драйвере, скорее всего, просыпается по прерыванию. Они всегда имеют высокий приоритет (вот они не зависят от планировщика). А вот поток, в котором ты ждешь событие совершенно не обязан выполняться постоянно. Ты попробуй запустить программу одновременно с другой какой-нибудь ресурсопотребляющей программой. Скорее всего, и в твоей "отдельной" нити события начнут теряться...
-- Всего хорошего!
-- Alex Alexandrov, e-mail: alex_alexandrov@fromru.com
Posted via RSDN NNTP Server 1.8 beta
It's kind of fun to do the impossible (Walt Disney)
Re[3]: Как побороть пропуск event'ов?
От:
Аноним
Дата:
02.12.03 12:18
Оценка:
Здравствуйте, Аноним, Вы писали:
_>>Если не ошибаюсь, потоки в NT планируются с квантом 15 мс. Да даже если они будут планироваться через 1 мс, чего никогда не будет, то 8 кГц ты все равно все не поймаешь с помощью событий, так как твой поток может потерять управление на 1 мс, а за это время произойдет 8 PulseEvent. Так что надо очередь организовывать.
А>А разве это как-то связано с планировщиком? В ядре происходит тоже самое, т.е. я из драйвера получаю эвент о том, что пришел пакет и ничего не теряется. :???:
--
Когда драйвер устанавливает event в signaled state, он может при этом временно поднять приоритет того потока, которое этот event ожидает (и это обычно делается). Это дает шанс вновь "проснувшемуся" потоку выполнится в первую очередь, видимо поэтому обычно "ничего не теряется".
Но это только шанс и нет никакой гарантии, что так будет всегда. Я тоже присоединяюсь к мнению коллег, что лучше переформулировать требования к задаче, например, отказавшись от требования регулярного получения упрвления в потоке с такой частотой.
А>Когда драйвер устанавливает event в signaled state, он может при этом временно поднять приоритет того потока, которое этот event ожидает (и это обычно делается). Это дает шанс вновь "проснувшемуся" потоку выполнится в первую очередь, видимо поэтому обычно "ничего не теряется".
А>Но это только шанс и нет никакой гарантии, что так будет всегда. Я тоже присоединяюсь к мнению коллег, что лучше переформулировать требования к задаче, например, отказавшись от требования регулярного получения упрвления в потоке с такой частотой.
Поддерживаю. Можно еще попробовать поднять приоритеты потоку и процессу, включить priority boost и т.п., но гарантии это все равно не даст, даже если на отдельно взятой системе при небольшой загрузке оной все и будет работать.
Т.о. надо либо переделывать драйвер, дабы использовать очереди событий i/o, либо отказываться от самой идеи выполнять такие задачи на не реал тайм системе.
Здравствуйте, Аноним, Вы писали:
А>Ситуация такая: А>С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent. А>В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?
Если устройство не буферизирует данные — то никак.
Если работает — то между тредами работаешь только через очередь и забираешь данные от устройства и обрабатываешь их во внешенм треде крупными блоками, например измерений по ~100 нормально будет.
Re[2]: Как побороть пропуск event'ов?
От:
Аноним
Дата:
03.12.03 12:32
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Ситуация такая: А>>С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent. А>>В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?
А>Если устройство не буферизирует данные — то никак. А>Если работает — то между тредами работаешь только через очередь и забираешь данные от устройства и обрабатываешь их во внешенм треде крупными блоками, например измерений по ~100 нормально будет.
Проблему прочувствовал, сделал на callback функциях. Всем большое спасибо за конструктивные ответы.
Note This function is unreliable and should not be used. It exists mainly for backward compatibility. For more information, see Remarks
Здравствуйте, <Аноним>, Вы писали:
А>Ситуация такая: А>С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent. А>В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?