Aula 18: Non-blocking I/O e epoll
I/O bloqueante é o padrão — read() espera até que os dados cheguem. Com O_NONBLOCK, read() retorna imediatamente com EAGAIN se não houver dados prontos. Mas como gerenciar milhares de FDs ao mesmo tempo? O epoll resolve exatamente isso — um event loop que nos avisa só quando um FD está pronto, em O(
I/O bloqueante é como ficar na fila do caixa esperando. Non-blocking é como dizer ao atendente 'me chama quando estiver pronto'. epoll é como um telefonista que gerencia milhares de ligações e só te repassa as que estão esperando sua resposta.
- non-blocking I/O
- Modo em que as chamadas de I/O (read, write, accept) não bloqueiam. Se não houver dados prontos, elas retornam -1 com errno=EAGAIN/EWOULDBLOCK. Ativado com a flag O_NONBLOCK.
- epoll
- Interface do Linux para monitorar eventos de I/O em um grande conjunto de file descriptors. É composta por epoll_create, epoll_ctl e epoll_wait. Retorna só os FDs prontos — O(1) contra O(n) do select.
- edge-triggered (ET)
- Modo do epoll em que um evento é reportado só uma vez — quando o FD passa de not-ready para ready. Exige ler até EAGAIN toda vez. Mais eficiente, mas mais complexo.
- level-triggered (LT)
- Modo padrão do epoll — o evento é reportado toda vez que epoll_wait é chamado enquanto o FD ainda está pronto. Mais simples que ET, mas pode causar busy-looping se não for tratado corretamente.
- event loop
- Um padrão de programação em que um programa espera por eventos e os trata um a um — um loop infinito que chama epoll_wait e dispara callbacks. O núcleo do Node.js, do Nginx e do Triton.