Asynkron I/O med epoll og kqueue
Skaler til mange tilkoblinger med epoll på Linux og kqueue på BSD eller macOS.
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:
- Vent på klare hendelser
- Utfør I/O for hver hendelse til operasjonen ville blokkert
- 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.
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
- BSD Sockets API i C++
- Bygging av en TCP-ekko-server
- Asynkron I/O med epoll og kqueue
- Bruk av Boost Asio for moderne asynkron I/O