Lección 18: I/O no bloqueante y epoll
El I/O bloqueante es el comportamiento por defecto — read() espera hasta que hay datos. Con O_NONBLOCK, read() devuelve de inmediato con EAGAIN si no hay datos listos. Pero ¿cómo se gestionan miles de FDs simultáneamente? epoll resuelve exactamente esto — un event loop que nos notifica solo cuando u
El I/O bloqueante es como hacer fila para un boleto y esperar ahí. El no bloqueante es como decirle al vendedor 'llámame cuando esté listo'. epoll es como un operador de conmutador que gestiona miles de llamadas y solo te pasa las que esperan tu respuesta.
- I/O no bloqueante
- Modo en el que las llamadas de I/O (read, write, accept) no bloquean. Si no hay datos listos, devuelven -1 con errno=EAGAIN/EWOULDBLOCK. Se activa con la opción O_NONBLOCK.
- epoll
- Interfaz de Linux para monitorear eventos de I/O en un conjunto grande de descriptores de archivo. Se compone de epoll_create, epoll_ctl y epoll_wait. Devuelve solo los FDs listos — O(1) frente a O(n) de select.
- edge-triggered (ET)
- Modo de epoll en el que un evento se reporta una sola vez — cuando el FD pasa de no-listo a listo. Requiere leer hasta EAGAIN cada vez. Más eficiente pero más complejo.
- level-triggered (LT)
- Modo de epoll por defecto — el evento se reporta cada vez que se llama a epoll_wait mientras el FD sigue listo. Más simple que ET pero puede causar un busy-loop si no se maneja correctamente.
- event loop
- Un patrón de programación en el que un programa espera eventos y los maneja uno por uno — un bucle infinito que llama a epoll_wait y dispara callbacks. El núcleo de Node.js, Nginx y Triton.