0Pricing
C++ Academy · Aula

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:

  1. Aguarde eventos prontos
  2. Para cada evento, realize E/S até que ela fosse bloquear
  3. 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

  1. API de sockets BSD em C++
  2. Construir um servidor de eco TCP
  3. IO assíncrono com epoll e kqueue
  4. Usar Boost Asio para IO assíncrono moderno
← Voltar para C++ Academy