I/O asincrono con epoll e kqueue
Gestisca molte connessioni con epoll su Linux e kqueue su BSD o macOS
I/O asincrono con epoll e kqueue è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Perché usare l'I/O asincrono?
Un thread per connessione non è scalabile fino a migliaia o milioni di client. L'I/O asincrono consente a un singolo thread di gestire molti socket, attendendo che uno di essi diventi leggibile o scrivibile.
Linux: epoll
epoll è l'API degli eventi scalabile di Linux. Aggiunga i descrittori di file a un'istanza di epoll e attenda gli eventi su uno qualsiasi di essi.
#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);Attesa degli eventi
epoll_wait si blocca finché non sono disponibili eventi, quindi restituisce i descrittori pronti.
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);
}Attivazione sul fronte e attivazione a livello
Esistono due modalità:
- Attivazione a livello (predefinita): epoll continua a segnalare l'evento finché la condizione persiste
- Attivazione sul fronte (
EPOLLET): segnala l'evento solo quando cambia lo stato; ogni volta deve svuotare completamente il socket
macOS e BSD: kqueue
kqueue è l'equivalente di epoll per BSD ed è disponibile anche su macOS. Il concetto è simile, ma l'API è diversa.
#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 usa le porte di completamento I/O (IOCP), un modello basato sul completamento (notifica al termine) anziché sul modello basato sulla disponibilità di epoll e kqueue.
Socket non bloccanti
Imposti i socket in modalità non bloccante con fcntl(fd, F_SETFL, O_NONBLOCK). Altrimenti le letture e le scritture possono bloccare l'intero ciclo degli eventi.
Il modello del ciclo degli eventi
Un ciclo che viene eseguito indefinitamente:
- Attenda gli eventi pronti
- Per ogni evento, esegua l'I/O finché l'operazione non rischia di bloccarsi
- Ripeta
Gestione di molti client
Un singolo thread epoll può gestire decine di migliaia di connessioni simultanee: è il problema C10K. I sistemi moderni arrivano a gestirne milioni.
Problemi comuni
Faccia attenzione a:
- Dimenticare di impostare la modalità non bloccante
- Usare l'attivazione sul fronte senza svuotare il socket
- Non rimuovere i descrittori chiusi dall'insieme epoll
- Perdere i buffer associati alle singole connessioni
Wrapper di livello superiore
Scrivere manualmente un ciclo epoll è soggetto a errori. Per il codice di produzione usi libuv, libevent o Boost.Asio: astraggono le differenze tra piattaforme e forniscono cicli di I/O collaudati.
Asincrono o thread
L'I/O asincrono è più scalabile, ma più difficile da scrivere. Per server con poche migliaia di connessioni, il modello con un thread per connessione è più semplice. Scelga in base al carico previsto.
Verifica rapida
Qual è la differenza tra le modalità di attivazione sul fronte e di attivazione a livello in epoll?
Riepilogo
L'I/O asincrono raggiunge una concorrenza elevatissima gestendo molti socket in un singolo thread. Linux usa epoll, BSD e macOS usano kqueue, mentre Windows usa IOCP. Imposti i socket in modalità non bloccante. In produzione, usi una libreria (Asio, libuv, libevent) invece di scrivere manualmente il ciclo degli eventi.
Domande Frequenti
La lezione «I/O asincrono con epoll e kqueue» è gratuita?
Sì — il testo completo di «I/O asincrono con epoll e kqueue» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «I/O asincrono con epoll e kqueue»?
Gestisca molte connessioni con epoll su Linux e kqueue su BSD o macOS Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «I/O asincrono con epoll e kqueue»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- API dei socket BSD in C++
- Costruire un server echo TCP
- I/O asincrono con epoll e kqueue
- Usare Boost Asio per l'I/O asincrono moderno