timeout в функции select Win32
От: biohumanoid  
Дата: 19.05.10 10:11
Оценка:
Windows XP, SP2, неблокирующий socket.
select не возвращает управление раньше чем через 15-16 миллисекунд.
если запросить 17мс — будет 31-32мсек.

Неужто планировщик ОС так плохо справляется ???
Linux 2.6 просто наура отрабатывает...

вырезки из кода:
=== проверил WinSock ===
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup (wVersionRequested, &wsaData );

=== TCP ===
sock = socket (AF_INET, SOCK_STREAM, 0);

=== неблокирующий ===
unsigned long one=1;
ioctlsocket (sock, FIONBIO, &one);

tv.tv_usec = 1;
tv.tv_sec = 0;
FD_ZERO (&readfd);
FD_ZERO (&writefd);
FD_ZERO (&exceptfd);
FD_SET (seq->sock, &readfd);

=== Есть что на чтение ? ====
res = select (seq->sock+1, &readfd, &writefd, &exceptfd, &tv);

возвращает управление через 15-16 мсек, ни разу раньше...
Re: timeout в функции select Win32
От: biohumanoid  
Дата: 19.05.10 10:21
Оценка:
Дополнение: MSVC 6.0
OFFTOPIC: в wine программа возвращает управление за 5-12 мсек...
Re[2]: timeout в функции select Win32
От: abrec Россия  
Дата: 19.05.10 10:30
Оценка: 3 (1)
Здравствуйте, biohumanoid, Вы писали:

B>Дополнение: MSVC 6.0

B>OFFTOPIC: в wine программа возвращает управление за 5-12 мсек...

http://sysinternals.kompjoefriek.nl/rip/www.sysinternals.com/Information/HighResolutionTimers.html
Re: timeout в функции select Win32
От: _stun_ Россия  
Дата: 19.05.10 11:11
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>Неужто планировщик ОС так плохо справляется ???


Точность таймера стоит поменять до одной миллисекунды ну и приоритет потока можно временно приподнять.
Re: timeout в функции select Win32
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.05.10 13:37
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>Windows XP, SP2, неблокирующий socket.

B>select не возвращает управление раньше чем через 15-16 миллисекунд.
B>если запросить 17мс — будет 31-32мсек.

B>Неужто планировщик ОС так плохо справляется ???

B>Linux 2.6 просто наура отрабатывает...

2.6 это не указание. Этой ветке много лет и там много совершенно разных версий. Указывайте точнее, если указываете.

B>возвращает управление через 15-16 мсек, ни разу раньше...


Встречный вопрос: а зачем Вам меньше?
The God is real, unless declared integer.
Re[3]: timeout в функции select Win32
От: biohumanoid  
Дата: 19.05.10 14:51
Оценка:
Здравствуйте, abrec, Вы писали:

A>http://sysinternals.kompjoefriek.nl/rip/www.sysinternals.com/Information/HighResolutionTimers.html

Рабиновичу и abrec зачет
Забыл что windows планировщик ориентируется только на прерывание таймера...

timeBeginPeriod/timeEndPeriod как то не сработал, или чего не понял.
http://www.progz.ru/forum/index.php?showtopic=31126

буду пробовать NtSetTimerResolution.

Здравствуйте, netch80, Вы писали:
A>2.6 это не указание. Этой ветке много лет и там много совершенно разных версий. Указывайте точнее, если указываете.
2.6.18, 2.6.26, 2.6.30
Все 2.6.x используют timer=250Hz (4ms).

A>Встречный вопрос: а зачем Вам меньше?

Надо. Современный процессор не опухнет и с 1000 вызовов планировщика.
Re[4]: timeout в функции select Win32
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.05.10 15:02
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>Здравствуйте, netch80, Вы писали:

A>>2.6 это не указание. Этой ветке много лет и там много совершенно разных версий. Указывайте точнее, если указываете.
B>2.6.18, 2.6.26, 2.6.30
B>Все 2.6.x используют timer=250Hz (4ms).

Видимо, это особенность конкретной машины. У меня бывает и 100 и 2000 в зависимости от железа (я уж молчу про NOHZ вариант)

A>>Встречный вопрос: а зачем Вам меньше?

B>Надо. Современный процессор не опухнет и с 1000 вызовов планировщика.

Он-то не опухнет, но если у Вас цель — просто заставить его работать ("сачкуешь, гад!"), то мне это непонятно. Точности порядка миллисекунды это уже soft realtime и нужно бывает редко.
The God is real, unless declared integer.
Re[5]: timeout в функции select Win32
От: biohumanoid  
Дата: 19.05.10 16:32
Оценка:
Здравствуйте, netch80, Вы писали:

N>Он-то не опухнет, но если у Вас цель — просто заставить его работать ("сачкуешь, гад!"), то мне это непонятно. Точности порядка миллисекунды это уже soft realtime и нужно бывает редко.


Задача — шлюз между асинхронной сетью (ethernet) и CAN bus.
Редко, но бывает нужно.

По сути есть советы ? Sleep'у помогло, select'у нет...
timeBeginPeriod не помог, остальное еще не пробовал.
Re[6]: timeout в функции select Win32
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.05.10 19:04
Оценка:
Здравствуйте, biohumanoid, Вы писали:

B>Здравствуйте, netch80, Вы писали:


N>>Он-то не опухнет, но если у Вас цель — просто заставить его работать ("сачкуешь, гад!"), то мне это непонятно. Точности порядка миллисекунды это уже soft realtime и нужно бывает редко.


B>Задача — шлюз между асинхронной сетью (ethernet) и CAN bus.

B>Редко, но бывает нужно.

B>По сути есть советы ? Sleep'у помогло, select'у нет...

B>timeBeginPeriod не помог, остальное еще не пробовал.

По сути — развести два треда, в одном select() и скармливание данных второму, второй уже использует высокоточные таймеры. И наоборот.
The God is real, unless declared integer.
Re[7]: timeout в функции select Win32
От: biohumanoid  
Дата: 20.05.10 05:11
Оценка:
Здравствуйте, netch80, Вы писали:

B>>По сути есть советы ? Sleep'у помогло, select'у нет...

B>>timeBeginPeriod не помог, остальное еще не пробовал.

N>По сути — развести два треда, в одном select() и скармливание данных второму, второй уже использует высокоточные таймеры. И наоборот.


Решено, timeBeginPeriod помог (не сразу заметил ftime даже с новым таймером хреново время отмеряет).
Копаю в сторону timeGetTime и GetSystemTimeAsFileTime (нужно абсолютное время, т.к. использую pthread_mutex_timedlock).

Отдельный поток — кака. Пусть потребитель заводит (я однопоточный, но thread-safe).

Всем спасибо !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.