Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Igor Sysoev                          2:5020/400     29 Jan 2003  19:32:29
 To : Alex Korchmar
 Subject : Re: epoll
 -------------------------------------------------------------------------------- 
 
 Alex Korchmar <alx@e-moe.ru> wrote:
 
 > Igor Sysoev <is@rambler-co.ru> wrote:
 > IS> Hда, господа. А epoll-то ещё хуже, чем я думал.
 > чем хуже-то? "чем windows"? ;-)
 
 Чем я думал. А думал я скверно. Теперь думаю прескверно.
 
 Hадо сказать, что с тех пор, когда я последний раз смотрел epoll,
 он несколько сэволюционировал. Hо в использовавшемся в бенчмарках
 ephttpd-0.2.tar.gz всё ещё старый интерфейс.
 
 Вместо struct pollfd теперь используется struct epoll_event.
 Она передаётся epoll_ctl(), тогда как раньше вместо неё передавалась маска
 типа POLLIN|POLLOUT|POLLERR|POLLHUP. В struct epoll_event есть
 union epoll_data_t для opaque данных.
 
 В http://groups.google.com/groups?selm=b08ofh%2420b5%241%40park-mail.park.ramble
 r.ru
 я был не прав по части удаления событий. Там описан вариант для /dev/poll.
 В epoll события удаляются и модифицируются проще - операциями EPOLL_CTL_DEL
 и EPOLL_CTL_MOD. Также могу добавить, что epoll не требует удаления
 дескриптора перед закрытием. Это что касается неучтённых плюсов.
 А теперь перейдём к неучтённым минусам.
 
 Для медленных клиентов epoll будет слать события про освбодившееся место
 в буфере на каждый (или около того) переданный пакет. А в kqueue есть
 NOTE_LOWAT, которая позволяет указать интересующий нас размер свободного
 места и событий будет меньше. Hо это ещё цветочки, а ягодки вот где -
 в epoll оказалась одна неприятная особенность. Поскольку epoll работает
 только с изменениями, поэтому, если на момент добавления дескриптора
 интересующие нас события уже имеются в наличии, то epoll_wait() нам
 о них не сообщит. То есть, допустим, мы accept()нули сокет в веб-сервере,
 а затем добавили его в epoll. Если на момент добавления в epoll нам уже
 пришёл пакет, то epoll_wait() нам о нём не сообщит. Hужно или делать read(),
 который может вернуть EAGAIN, если пакета ещё нет, или делать poll().
 Вот такой удобный интерфейс. Замечу, что с точки зрения интерфейса ничто
 не мешает при добавлении реагировать на уже имеющиеся события.
 По крайней мере, kqueue при EV_CLEAR это делает.
 
 Таким образом, если kqueue, по словам Линуса - это классический пример
 овер-дизайна (который, тем не менее, прекрасно работает, хорошо
 масштабируется и расширяется в некоторых пределах), то epoll - классический
 пример не только недодизайна, но и недоимплементации.
 -- 
 Игорь Сысоев
 http://sysoev.ru
 --- ifmail v.2.15dev5
  * Origin: Rambler Office news site (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 epoll   Igor Sysoev   28 Jan 2003 17:07:41 
 Re: epoll   Alex Korchmar   29 Jan 2003 01:43:38 
 Re: epoll   Valentin Nechayev   29 Jan 2003 10:32:06 
 Re: epoll   Igor Sysoev   29 Jan 2003 19:32:29 
 Глюк пpи пеpеключении с тектовой консоли в иксы по ctrl+alt+F7   Aleksey Skurihin   03 Feb 2003 23:48:48 
 Re: Глюк пpи пеpеключении с тектовой консоли в иксы по ctrl+alt+F7   Valentin Nechayev   10 Feb 2003 00:13:11 
Архивное /ru.linux/2934326981996.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional