Epoll - Epoll
epoll
je Linuxové jádro systémové volání pro škálovatelný mechanismus oznámení událostí I / O, který byl poprvé představen ve verzi 2.5.44 Linuxové jádro.[1] Jeho funkcí je sledovat více deskriptorů souborů a zjistit, zda je na kterémkoli z nich možný vstup / výstup. Má nahradit starší POSIX vyberte (2)
a hlasování (2)
systémová volání, k dosažení lepšího výkonu v náročnějších aplikacích, kde je počet sledovaných deskriptory souborů je velký (na rozdíl od starších systémových volání, která fungují v Ó (n) čas, epoll
působí v Ó(1 krát[2]).
epoll
je podobný FreeBSD je kqueue
, v tom, že se skládá ze sady uživatelský prostor funkce, z nichž každá bere a deskriptor souboru argument označující konfigurovatelný objekt jádra, proti kterému spolupracují. epoll
používá a červeno-černý strom (RB-strom) datová struktura pro sledování všech deskriptorů souborů, které jsou aktuálně sledovány.[3]
API
int epoll_create1(int vlajky);
Vytvoří epoll
objekt a vrátí jeho deskriptor souboru. The vlajky
parametr umožňuje upravit chování epoll. Má pouze jednu platnou hodnotu, EPOLL_CLOEXEC
. epoll_create ()
je starší varianta epoll_create1 ()
a je zastaralé od linuxového jádra verze 2.6.27 a glibc verze 2.9.[4]
int epoll_ctl(int epfd, int op, int fd, struktur epoll_event *událost);
Řídí (konfiguruje), které deskriptory souborů jsou sledovány tímto objektem a pro které události. op
může být PŘIDAT, ZMĚNIT nebo ODSTRANIT.
int epoll_wait(int epfd, struktur epoll_event *Události, int maximální události, int Časový limit);
Čeká na kteroukoli z událostí zaregistrovaných u epoll_ctl
, dokud nenastane alespoň jeden nebo dokud neuplyne časový limit. Vrátí události, ke kterým došlo Události
, až do maximální události
najednou.
Spouštěcí režimy
epoll
poskytuje obojí spuštěno hranou a spuštěno na úrovni režimy. V režimu spouštěném hranou volání na epoll_wait
se vrátí, pouze když je nová událost zařazena do fronty s epoll
objekt, když je v režimu spouštěném na úrovni, epoll_wait
se vrátí, dokud bude podmínka platit.
Například pokud a trubka registrován u epoll
přijal data, volání na epoll_wait
se vrátí a signalizuje přítomnost dat ke čtení. Předpokládejme, že čtečka spotřebovala pouze část dat z vyrovnávací paměti. V režimu spuštěném na úrovni další volání na epoll_wait
se vrátí okamžitě, pokud vyrovnávací paměť kanálu obsahuje data ke čtení. V režimu spouštěném hranou však epoll_wait
se vrátí pouze po zapsání nových dat do kanálu.
Kritika
Bryan Cantrill poukázal na to epoll
měl chyby, kterým se dalo vyhnout, kdyby se poučil od svých předchůdců: porty pro dokončení vstupu / výstupu, porty událostí (Solaris) a kqueue.[5] Velkou část jeho kritiky však oslovil epoll
je EPOLLONESHOT
a EPOLLEXCLUSIVE
možnosti. EPOLLONESHOT
byla přidána ve verzi 2.6.2 hlavní řady linuxového jádra, vydané v únoru 2004. EPOLLEXCLUSIVE
byla přidána ve verzi 4.5 vydané v březnu 2016.[6]
Viz také
Reference
- ^ "epoll (7) - Linuxová manuální stránka". Man7.org. 17. 04. 2012. Citováno 2014-03-01.
- ^ Oleksiy Kovyrin (2006-04-13). "Použití epoll () pro asynchronní programování v síti". Kovyrin.net. Citováno 2014-03-01.
- ^ https://idndx.com/2014/09/01/the-implementation-of-epoll-1/
- ^ Láska, Robert (2013). Programování systému Linux (Druhé vydání.). O'Reilly. 97, 98. ISBN 978-1-449-33953-1.
- ^ https://www.youtube.com/watch?v=l6XQUciI-Sc&t=57m
- ^ "Epoll je zásadně zlomený 1/2". idea.popcount.org. 20. 2. 2017. Citováno 2017-10-06.