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.

Zobacz też

Linki zewnętrzne