IO assíncrono com epoll e kqueue
Escale para muitas ligações com epoll no Linux e kqueue em BSD ou macOS
IO assíncrono com epoll e kqueue é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Por que usar E/S assíncrona?
Uma linha de execução por conexão não escala para milhares ou milhões de clientes. A E/S assíncrona permite que uma única linha de execução trate muitos soquetes, aguardando que qualquer um deles fique pronto para leitura ou escrita.
Linux: epoll
epoll é a API de eventos escalável do Linux. Adicione descritores de arquivo a uma instância de epoll e aguarde eventos em qualquer um deles.
#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);Aguardando eventos
epoll_wait bloqueia até que haja eventos disponíveis e então retorna os descritores prontos.
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);
}Disparo por borda vs. disparo por nível
Há dois modos:
- Disparo por nível (padrão) — epoll continua informando enquanto uma condição permanecer ativa
- Disparo por borda (
EPOLLET) — informa apenas quando o estado muda; você precisa esvaziar completamente o soquete a cada vez
macOS e BSD: kqueue
kqueue é o equivalente de epoll no BSD e também está disponível no macOS. Conceitualmente, é semelhante, mas usa uma API diferente.
#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
O Windows usa portas de conclusão de E/S (IOCP) — um modelo baseado em conclusão (notifica quando termina), em vez do modelo baseado em prontidão de epoll/kqueue.
Soquetes não bloqueantes
Configure os soquetes como não bloqueantes com fcntl(fd, F_SETFL, O_NONBLOCK). Caso contrário, leituras e escritas podem bloquear todo o laço de eventos.
O padrão do laço de eventos
Um laço que executa indefinidamente:
- Aguarde eventos prontos
- Para cada evento, realize E/S até que ela fosse bloquear
- Repita
Tratando muitos clientes
Uma única linha de execução com epoll pode tratar dezenas de milhares de conexões simultâneas — o problema C10K. Os sistemas modernos chegam a milhões.
Armadilhas comuns
Fique atento a:
- Esquecer de configurar o modo não bloqueante
- Usar o disparo por borda sem esvaziar o soquete
- Não remover os descritores de arquivo fechados do conjunto do epoll
- Vazamentos de buffers por conexão
Abstrações de nível mais alto
Escrever um laço de epoll manualmente é propenso a erros. Use libuv, libevent ou Boost.Asio em código de produção — essas bibliotecas abstraem as diferenças entre plataformas e fornecem laços de E/S testados.
E/S assíncrona vs. linhas de execução
A E/S assíncrona é mais escalável, mas mais difícil de escrever. Para servidores com alguns milhares de conexões, o modelo de uma linha de execução por conexão é mais simples. Escolha com base na carga esperada.
Verificação rápida
Qual é a diferença entre os modos de disparo por borda e por nível no epoll?
Recapitulação
A E/S assíncrona escala para uma concorrência massiva ao tratar muitos soquetes em uma única linha de execução. O Linux usa epoll, BSD/macOS usam kqueue e o Windows usa IOCP. Configure os soquetes como não bloqueantes. Em produção, use uma biblioteca (Asio, libuv, libevent) em vez de implementar manualmente o laço de eventos.
Perguntas Frequentes
A aula “IO assíncrono com epoll e kqueue” é grátis?
Sim — o texto completo de “IO assíncrono com epoll e kqueue” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “IO assíncrono com epoll e kqueue”?
Escale para muitas ligações com epoll no Linux e kqueue em BSD ou macOS Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “IO assíncrono com epoll e kqueue”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- API de sockets BSD em C++
- Construir um servidor de eco TCP
- IO assíncrono com epoll e kqueue
- Usar Boost Asio para IO assíncrono moderno