C++ Academy · Les

Asynchrone I/O met epoll en kqueue

Schaal naar veel verbindingen met epoll op Linux en kqueue op BSD of macOS

Les 3 van 414 stappen

Asynchrone I/O met epoll en kqueue is een gratis C++ Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C++ Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C++ Academy bevat in totaal 4 lessen.

Waarom asynchrone I/O?

Met één thread per verbinding schaal je niet naar duizenden of miljoenen clients. Met asynchrone I/O kan één thread veel sockets afhandelen door te wachten tot een ervan klaar is om te lezen of te schrijven.

Linux: epoll

epoll is de schaalbare gebeurtenis-API van Linux. Voeg bestandsdescriptors toe aan een epoll-instantie en wacht op gebeurtenissen op een van deze descriptors.

#include <sys/epoll.h>
int epfd = epoll_create1(0);
epoll_event ev{};
ev.events = EPOLLIN;
ev.data.fd = sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, sock, &ev);

Wachten op gebeurtenissen

epoll_wait blokkeert totdat er gebeurtenissen beschikbaar zijn en retourneert daarna de gereedstaande descriptors.

epoll_event events[64];
int n = epoll_wait(epfd, events, 64, -1);
for (int i = 0; i < n; ++i) {
    int fd = events[i].data.fd;
    handle_io(fd);
}

Edge-triggered versus level-triggered

Twee modi:

  • Level-triggered (standaard): epoll blijft rapporteren zolang een toestand geldt
  • Edge-triggered (EPOLLET): rapporteert alleen bij een toestandswijziging; je moet de socket elke keer volledig leeglezen

macOS en BSD: kqueue

kqueue is het BSD-equivalent van epoll en is ook beschikbaar op macOS. Conceptueel vergelijkbaar, maar met een andere API.

#include <sys/event.h>
int kq = kqueue();
struct kevent ev;
EV_SET(&ev, sock, EVFILT_READ, EV_ADD, 0, 0, nullptr);
kevent(kq, &ev, 1, nullptr, 0, nullptr);

Windows: IOCP

Windows gebruikt I/O Completion Ports (IOCP), een model op basis van voltooiing (melden wanneer iets klaar is) in plaats van het gereedheidsmodel van epoll en kqueue.

Niet-blokkerende sockets

Stel sockets in op niet-blokkerend met fcntl(fd, F_SETFL, O_NONBLOCK). Anders kunnen lees- en schrijfbewerkingen de volledige gebeurtenislus blokkeren.

Het patroon van de gebeurtenislus

Een lus die voor altijd blijft draaien:

  1. Wacht op gereedstaande gebeurtenissen
  2. Voer voor elke gebeurtenis I/O uit totdat de bewerking zou blokkeren
  3. Herhaal

Veel clients afhandelen

Eén epoll-thread kan tienduizenden gelijktijdige verbindingen afhandelen: het C10K-probleem. Moderne systemen gaan tot miljoenen.

Veelvoorkomende valkuilen

Let op het volgende:

  • Vergeten de niet-blokkerende modus in te stellen
  • Edge-triggered gebruiken zonder de socket leeg te lezen
  • Gesloten bestandsdescriptors niet uit de epoll-verzameling verwijderen
  • Bufferlekken per verbinding

Wrappers op hoger niveau

Zelf een epoll-lus schrijven is foutgevoelig. Gebruik libuv, libevent of Boost.Asio voor productiecode: deze verbergen platformverschillen en bieden geteste I/O-lussen.

Asynchrone I/O versus threads

Asynchrone I/O is beter schaalbaar, maar moeilijker te schrijven. Voor servers met enkele duizenden verbindingen is één thread per verbinding eenvoudiger. Kies op basis van de verwachte belasting.

Korte controle

Wat is het verschil tussen de modi edge-triggered en level-triggered in epoll?

Samenvatting

Asynchrone I/O schaalt naar zeer veel gelijktijdige verbindingen door veel sockets in één thread af te handelen. Linux gebruikt epoll, BSD en macOS gebruiken kqueue en Windows gebruikt IOCP. Stel sockets in op niet-blokkerend. Gebruik voor productie een bibliotheek (Asio, libuv, libevent) in plaats van de gebeurtenislus zelf te programmeren.

Gratis beginnen

Leer C++ met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
51
Lessen
203

Veelgestelde vragen

Is de les “Asynchrone I/O met epoll en kqueue” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad C++ Academy, waaronder “Asynchrone I/O met epoll en kqueue”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus C++ Academy bevat in totaal 4 lessen.

Wat leer ik in “Asynchrone I/O met epoll en kqueue”?

Schaal naar veel verbindingen met epoll op Linux en kqueue op BSD of macOS Je oefent met C++ Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met C++ Academy te beginnen?

Ervaring vooraf is niet nodig. C++ Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Asynchrone I/O met epoll en kqueue”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over C++ Academy?

Ja. Elke les over C++ Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. De BSD Sockets API in C++
  2. Een TCP-echoserver bouwen
  3. Asynchrone I/O met epoll en kqueue
  4. Boost Asio gebruiken voor moderne asynchrone I/O
← Terug naar C++ Academy