C++ Academy · leksjon

Asynkron I/O med epoll og kqueue

Skaler til mange tilkoblinger med epoll på Linux og kqueue på BSD eller macOS.

Leksjon 3 av 414 trinn

Asynkron I/O med epoll og kqueue er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hvorfor asynkron I/O?

Én tråd per tilkobling skalerer ikke til tusenvis eller millioner av klienter. Asynkron I/O lar én tråd håndtere mange sokler ved å vente på at en av dem skal bli klar for lesing eller skriving.

Linux: epoll

epoll er Linux’ skalerbare API for hendelser. Legg fildeskriptorer til en epoll-instans, og vent på hendelser på hvilken som helst av dem.

#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);

Vente på hendelser

epoll_wait blokkerer til hendelser er tilgjengelige, og returnerer deretter de klare deskriptorene.

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);
}

Kantutløst kontra nivåutløst

Det finnes to modi:

  • Nivåutløst (standard) – epoll fortsetter å rapportere så lenge en betingelse gjelder
  • Kantutløst (EPOLLET) – rapporterer bare ved endring av tilstand; du må tømme socketen helt hver gang

macOS og BSD: kqueue

kqueue er BSDs motstykke til epoll og er også tilgjengelig på macOS. Konseptuelt ligner det, men API-et er annerledes.

#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 bruker I/O Completion Ports (IOCP) – en fullføringsbasert modell (varsle når operasjonen er ferdig), i motsetning til epoll/kqueues klarhetsmodell.

Ikke-blokkerende sokler

Sett sokler til ikke-blokkerende modus med fcntl(fd, F_SETFL, O_NONBLOCK). Ellers kan lesing og skriving blokkere hele hendelsesløkken.

Mønsteret for hendelsesløkken

En løkke som kjører i det uendelige:

  1. Vent på klare hendelser
  2. Utfør I/O for hver hendelse til operasjonen ville blokkert
  3. Gjenta

Håndtere mange klienter

Én epoll-tråd kan håndtere titusenvis av samtidige tilkoblinger – C10K-problemet. Moderne systemer kan skalere til millioner.

Vanlige fallgruver

Vær oppmerksom på:

  • Å glemme å sette ikke-blokkerende modus
  • Kantutløst modus uten å tømme socketen
  • Å ikke fjerne lukkede FD-er fra epoll-settet
  • Bufferlekkasjer per tilkobling

Abstraksjoner på høyere nivå

Det er lett å gjøre feil når du skriver en epoll-løkke for hånd. Bruk libuv, libevent eller Boost.Asio i produksjonskode – de abstraherer plattformforskjeller og tilbyr testede I/O-løkker.

Asynkron I/O kontra tråder

Asynkron I/O skalerer bedre, men er vanskeligere å skrive. For servere med opptil noen få tusen tilkoblinger er én tråd per tilkobling enklere. Velg basert på belastningen du forventer.

Kort kontroll

Hva er forskjellen mellom kantutløst og nivåutløst modus i epoll?

Oppsummering

Asynkron I/O skalerer til svært mange samtidige tilkoblinger ved å håndtere mange sokler i én tråd. Linux bruker epoll, BSD/macOS bruker kqueue, og Windows bruker IOCP. Sett sokler til ikke-blokkerende modus. I produksjon bør du bruke et bibliotek (Asio, libuv, libevent) i stedet for å skrive hendelsesløkken selv.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Asynkron I/O med epoll og kqueue» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Asynkron I/O med epoll og kqueue», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Asynkron I/O med epoll og kqueue»?

Skaler til mange tilkoblinger med epoll på Linux og kqueue på BSD eller macOS. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Asynkron I/O med epoll og kqueue»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. BSD Sockets API i C++
  2. Bygging av en TCP-ekko-server
  3. Asynkron I/O med epoll og kqueue
  4. Bruk av Boost Asio for moderne asynkron I/O
← Tilbake til C++ Academy