Asynkron I/O med epoll og kqueue
Skalér til mange forbindelser med epoll på Linux og kqueue på BSD eller macOS
Asynkron I/O med epoll og kqueue er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvorfor asynkron I/O?
En tråd pr. forbindelse skalerer ikke til tusindvis eller millioner af klienter. Asynkron I/O lader én tråd håndtere mange sockets ved at vente på, at en af dem kan læses fra eller skrives til.
Linux: epoll
Linux' skalerbare API til hændelser. Føj fildeskriptorer til en epoll-instans, og vent på hændelser på en af 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);Ventning på hændelser
epoll_wait blokerer, indtil der er hændelser tilgængelige, og returnerer derefter de deskriptorer, der er klar.
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);
}Kantudløst kontra niveauudløst
Der er to tilstande:
- Niveauudløst (standard) — epoll bliver ved med at rapportere, så længe en betingelse er opfyldt
- Kantudløst (
EPOLLET) — rapporterer kun ved en ændring af tilstanden; du skal tømme socketen helt hver gang
macOS og BSD: kqueue
kqueue er BSD's ækvivalent til epoll og findes også på macOS. API'et fungerer konceptuelt på samme måde, men er anderledes.
#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 bruger I/O Completion Ports (IOCP) — en fuldførelsesbaseret model (giv besked, når arbejdet er udført) i stedet for epoll/kqueues parathedsmodel.
Ikke-blokerende sockets
Indstil sockets til ikke-blokerende med fcntl(fd, F_SETFL, O_NONBLOCK). Ellers kan læsninger og skrivninger blokere hele hændelsesløkken.
Mønsteret for hændelsesløkken
En løkke, der kører for evigt:
- Vent på hændelser, der er klar
- Udfør I/O for hver hændelse, indtil den ville blokere
- Gentag
Håndtering af mange klienter
En enkelt epoll-tråd kan håndtere titusindvis af samtidige forbindelser — C10K-problemet. Moderne systemer kan håndtere millioner.
Almindelige faldgruber
Vær opmærksom på:
- At glemme at indstille ikke-blokerende tilstand
- Kantudløsning uden at tømme socketen
- Ikke at fjerne lukkede FD'er fra epoll-mængden
- Bufferlækager pr. forbindelse
Abstraktioner på højere niveau
Det er fejlbehæftet at skrive en epoll-løkke i hånden. Brug libuv, libevent eller Boost.Asio i produktionskode — de abstraherer forskellene mellem platforme og leverer testede I/O-løkker.
Asynkron I/O kontra tråde
Asynkron I/O skalerer bedre, men er sværere at skrive. Til servere med få tusinde forbindelser er en model med én tråd pr. forbindelse enklere. Vælg ud fra den belastning, du forventer.
Hurtigt tjek
Hvad er forskellen på kantudløste og niveauudløste tilstande i epoll?
Opsummering
Asynkron I/O skalerer til massiv samtidighed ved at håndtere mange sockets i én tråd. Linux bruger epoll, BSD/macOS bruger kqueue, og Windows bruger IOCP. Indstil sockets til ikke-blokerende. Brug et bibliotek (Asio, libuv, libevent) i produktion i stedet for selv at skrive hændelsesløkken.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Asynkron I/O med epoll og kqueue” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Asynkron I/O med epoll og kqueue”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Asynkron I/O med epoll og kqueue”?
Skalér til mange forbindelser med epoll på Linux og kqueue på BSD eller macOS Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Asynkron I/O med epoll og kqueue”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- BSD Sockets-API i C++
- Bygning af en TCP-echo-server
- Asynkron I/O med epoll og kqueue
- Brug af Boost Asio til moderne asynkron I/O