Re[2]: Как побороть пропуск event'ов?
От: Valerio Россия linkedin.com/in/boronin
Дата: 02.12.03 09:11
Оценка: 31 (2)
добавлю к вопросу о real-time в окнах:
Re[4]: И снова о наболевшем !
Автор: Valerio
Дата: 22.09.03


а еще есть пока неустаревшая статья 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кГц частота небольшая, из-за чего такое может быть?
Re: Как побороть пропуск event'ов?
От: alexandrov_alex США  
Дата: 02.12.03 08:08
Оценка:
Здравствуйте, Аноним, Вы писали:

> Ситуация такая:

> С устройства поступают данные с частотой 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. Так что надо очередь организовывать.


А разве это как-то связано с планировщиком? В ядре происходит тоже самое, т.е. я из драйвера получаю эвент о том, что пришел пакет и ничего не теряется.
Re[3]: Как побороть пропуск event'ов?
От: alexandrov_alex США  
Дата: 02.12.03 11:42
Оценка:
Здравствуйте, Аноним, Вы писали:

> Здравствуйте, 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 ожидает (и это обычно делается). Это дает шанс вновь "проснувшемуся" потоку выполнится в первую очередь, видимо поэтому обычно "ничего не теряется".

Но это только шанс и нет никакой гарантии, что так будет всегда. Я тоже присоединяюсь к мнению коллег, что лучше переформулировать требования к задаче, например, отказавшись от требования регулярного получения упрвления в потоке с такой частотой.

C уважением,
Геннадий Майко.
Re[4]: Как побороть пропуск event'ов?
От: Andrew S Россия http://alchemy-lab.com
Дата: 02.12.03 15:20
Оценка:
А>Когда драйвер устанавливает event в signaled state, он может при этом временно поднять приоритет того потока, которое этот event ожидает (и это обычно делается). Это дает шанс вновь "проснувшемуся" потоку выполнится в первую очередь, видимо поэтому обычно "ничего не теряется".

А>Но это только шанс и нет никакой гарантии, что так будет всегда. Я тоже присоединяюсь к мнению коллег, что лучше переформулировать требования к задаче, например, отказавшись от требования регулярного получения упрвления в потоке с такой частотой.


Поддерживаю. Можно еще попробовать поднять приоритеты потоку и процессу, включить priority boost и т.п., но гарантии это все равно не даст, даже если на отдельно взятой системе при небольшой загрузке оной все и будет работать.
Т.о. надо либо переделывать драйвер, дабы использовать очереди событий i/o, либо отказываться от самой идеи выполнять такие задачи на не реал тайм системе.

Успехов.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Как побороть пропуск event'ов?
От: Аноним  
Дата: 02.12.03 16:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ситуация такая:

А>С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent.
А>В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?

Если устройство не буферизирует данные — то никак.
Если работает — то между тредами работаешь только через очередь и забираешь данные от устройства и обрабатываешь их во внешенм треде крупными блоками, например измерений по ~100 нормально будет.
Re[2]: Как побороть пропуск event'ов?
От: Аноним  
Дата: 03.12.03 12:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Ситуация такая:

А>>С устройства поступают данные с частотой 8кГц. Принимаю отдельной нитью. При приеме данных выполняю PulseEvent.
А>>В основной нити ожидаю с помощью WaitForSingleObjectEx. Проблема в том, что имеется потеря более 50% этих самых event'ов. Никакой обработки не делаю, просто считаю пакеты, 8кГц частота небольшая, из-за чего такое может быть?

А>Если устройство не буферизирует данные — то никак.

А>Если работает — то между тредами работаешь только через очередь и забираешь данные от устройства и обрабатываешь их во внешенм треде крупными блоками, например измерений по ~100 нормально будет.

Проблему прочувствовал, сделал на callback функциях. Всем большое спасибо за конструктивные ответы.
Re: Как побороть пропуск event'ов?
От: jaj  
Дата: 23.12.03 13:13
Оценка:
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кГц частота небольшая, из-за чего такое может быть?
... << RSDN@Home 1.1.0 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.