2011-12-21 1 views
2

Функции epoll_wait, select и poll все обеспечивают таймаут. Однако с epoll он находится в большом разрешении 1 мс. Выберите & ppoll - единственный, обеспечивающий тайм-аут в миллисекундах.Почему epoll_wait обеспечивает огромный тайм-аут 1 мс?

Это означает, что в лучшем случае это будет делать другие вещи с интервалом в 1 мс. Я мог бы сделать много других вещей в течение 1 мс на современном процессоре.

Так что, чтобы делать другие вещи чаще, чем 1 мс, я на самом деле должен предоставить тайм-аут нуля (по сути, отключив его). И я, вероятно, добавлю свое собственное оружие где-нибудь в главном цикле, чтобы остановить его пережевывание слишком большого количества CPU.

Итак, вопрос в том, почему тайм-аут в милли, когда я думаю, что есть случай для более высокого разрешения.

+0

В этой статье представлена ​​дополнительная информация о временном разрешении select(), poll() и epoll_wait() и их взаимодействии с ядром. Я рекомендую прочитать его. http://lwn.net/Articles/296578/ –

ответ

2

Интерфейс epoll_wait только что унаследовал таймаут, измеренный в миллисекундах от poll. Хотя не имеет смысла poll менее чем за миллисекунду из-за накладных расходов на добавление вызывающего потока ко всем наборам ожидания, это имеет смысл для epoll_wait. Призыв к epoll_wait не требует когда-либо помещать вызывающий поток на более чем один набор ожидания, накладные расходы на вызовы очень низкие, и в очень редких случаях может иметь смысл блокировать менее чем за миллисекунду.

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

8

Поскольку вы находитесь на Linux, вместо предоставления нулевого значения тайм-аута и ручного использования в теле цикла, вы можете просто использовать API timerfd. Это позволяет создать таймер (с разрешением более 1 мс), связанный с файловым дескриптором, который вы можете добавить к набору контролируемых дескрипторов.

+0

Просто узнал о timerfd из вашего ответа. Ницца! – cheshirekow

 Смежные вопросы

  • Нет связанных вопросов^_^