|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/2934326981996.html, оценка из 5, голосов 10
|