epoll
epoll
to wywołanie systemowe jądra Linuksa dla skalowalnego mechanizmu powiadamiania o zdarzeniach we/wy, wprowadzone po raz pierwszy w wersji 2.5.44 jądra Linuksa . Jego funkcją jest monitorowanie wielu deskryptorów plików w celu sprawdzenia, czy operacje we/wy są możliwe na którymkolwiek z nich. Ma zastąpić starsze wywołania systemowe POSIX select(2)
i poll(2)
, aby osiągnąć lepszą wydajność w bardziej wymagających aplikacjach, gdzie liczba obserwowanych deskryptorów plików jest duża (w przeciwieństwie do starszych wywołań systemowych, które działają w O ( n ), epoll
działa w czasie O (1).
epoll
jest podobny do kqueue
z FreeBSD , ponieważ składa się z zestawu funkcji przestrzeni użytkownika , z których każda pobiera argument deskryptora pliku oznaczający konfigurowalny obiekt jądra, przeciwko któremu współpracują. epoll
wykorzystuje strukturę danych drzewa czerwono-czarnego (RB-tree), aby śledzić wszystkie aktualnie monitorowane deskryptory plików.
API
int epoll_create1 ( flagi int );
Tworzy obiekt epoll
i zwraca jego deskryptor pliku. Parametr flags
umożliwia modyfikację zachowania epoll. Ma tylko jedną prawidłową wartość, EPOLL_CLOEXEC
. epoll_create()
jest starszym wariantem epoll_create1()
i jest przestarzały od wersji jądra Linuksa 2.6.27 i glibc w wersji 2.9.
int epoll_ctl ( int epfd , int op , int fd , struct epoll_event * zdarzenie );
Kontroluje (konfiguruje), które deskryptory plików są obserwowane przez ten obiekt i dla jakich zdarzeń. op
może być DODAJ, MODYFIKUJ lub USUŃ.
int epoll_wait ( int epfd , struct epoll_event * zdarzenia , int maxevents , int limit czasu );
Czeka na dowolne zdarzenie zarejestrowane za pomocą epoll_ctl
, dopóki nie wystąpi co najmniej jedno lub upłynie limit czasu. Zwraca zdarzenia, które wystąpiły w zdarzeniach
, aż do maksymalnej liczby zdarzeń
jednocześnie.
Tryby wyzwalania
epoll
zapewnia tryby wyzwalane zboczem i poziomem . W trybie wyzwalanym zboczem wywołanie epoll_wait
zwróci się tylko wtedy, gdy nowe zdarzenie zostanie umieszczone w kolejce z obiektem epoll
, podczas gdy w trybie wyzwalanym poziomem, epoll_wait
powróci tak długo, jak warunek będzie spełniony.
Na przykład, jeśli potok zarejestrowany w epoll
odebrał dane, wywołanie epoll_wait
powróci, sygnalizując obecność danych do odczytania. Załóżmy, że czytnik zużył tylko część danych z bufora. W trybie wyzwalanym poziomem kolejne wywołania epoll_wait
zostaną natychmiast zwrócone, o ile bufor potoku zawiera dane do odczytania. Jednak w trybie wyzwalanym zboczem epoll_wait
zwróci się tylko wtedy, gdy nowe dane zostaną zapisane w potoku.
Krytyka
Bryan Cantrill zwrócił uwagę, że epoll
miał błędy, których można było uniknąć, gdyby nauczył się od swoich poprzedników: porty zakończenia wejścia/wyjścia , porty zdarzeń (Solaris) i kqueue . Jednak duża część jego krytyki dotyczyła EPOLLONESHOT
i EPOLLEXCLUSIVE
firmy epoll
. EPOLLONESHOT
został dodany w wersji 2.6.2 głównej linii jądra Linuksa, wydanej w lutym 2004. EPOLLEXCLUSIVE
został dodany w wersji 4.5, wydanej w marcu 2016.