0Pricing
C++ Academy · Lezione

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:

  1. Attenda gli eventi pronti
  2. Per ogni evento, esegua l'I/O finché l'operazione non rischia di bloccarsi
  3. 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

  1. API dei socket BSD in C++
  2. Costruire un server echo TCP
  3. I/O asincrono con epoll e kqueue
  4. Usare Boost Asio per l'I/O asincrono moderno
← Torna a C++ Academy