E/S asíncrona con epoll y kqueue
Escale a muchas conexiones con epoll en Linux y kqueue en BSD o macOS.
E/S asíncrona con epoll y kqueue es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
¿Por qué utilizar E/S asíncrona?
Un subproceso por conexión no escala a miles o millones de clientes. La E/S asíncrona permite que un solo subproceso gestione muchos sockets, esperando a que cualquiera de ellos esté listo para leer o escribir.
Linux: epoll
Linux ofrece una API de eventos escalable. Añada descriptores de archivo a una instancia de epoll y espere eventos de cualquiera de ellos.
#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);Espera de eventos
epoll_wait se bloquea hasta que hay eventos disponibles y, después, devuelve los descriptores que están listos.
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);
}Activación por niveles frente a activación por flancos
Hay dos modos:
- Activación por niveles (predeterminado): epoll sigue notificando mientras se mantenga una condición
- Activación por flancos (
EPOLLET): solo notifica cuando cambia el estado; debe vaciar por completo el socket cada vez
macOS y BSD: kqueue
kqueue es el equivalente de epoll en BSD y también está disponible en macOS. Conceptualmente es similar, pero utiliza una 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
Windows utiliza puertos de finalización de E/S (IOCP), un modelo basado en la finalización (notifica cuando termina la operación) en lugar del modelo de disponibilidad de epoll y kqueue.
Sockets sin bloqueo
Configure los sockets en modo sin bloqueo con fcntl(fd, F_SETFL, O_NONBLOCK). De lo contrario, las lecturas y escrituras pueden bloquear todo el bucle de eventos.
Patrón del bucle de eventos
Un bucle que se ejecuta indefinidamente:
- Espere eventos listos
- Para cada evento, realice E/S hasta que la operación se bloquearía
- Repita el proceso
Gestión de muchos clientes
Un solo subproceso de epoll puede gestionar decenas de miles de conexiones simultáneas: es el problema C10K. Los sistemas modernos alcanzan millones.
Errores habituales
Preste atención a lo siguiente:
- Olvidar configurar el modo sin bloqueo
- Usar activación por flancos sin vaciar el socket
- No eliminar los descriptores cerrados del conjunto de epoll
- Filtraciones de búferes por conexión
Abstracciones de nivel superior
Escribir manualmente un bucle de epoll puede provocar errores. Utilice libuv, libevent o Boost.Asio en el código de producción: abstraen las diferencias entre plataformas y proporcionan bucles de E/S probados.
E/S asíncrona frente a subprocesos
La E/S asíncrona ofrece una mayor escalabilidad, pero es más difícil de escribir. Para servidores con unos pocos miles de conexiones, el modelo de un subproceso por conexión es más sencillo. Elija en función de la carga prevista.
Comprobación rápida
¿Cuál es la diferencia entre los modos de activación por flancos y por niveles en epoll?
Resumen
La E/S asíncrona escala a una concurrencia masiva al gestionar muchos sockets en un solo subproceso. Linux utiliza epoll, BSD y macOS utilizan kqueue, y Windows utiliza IOCP. Configure los sockets en modo sin bloqueo. En producción, utilice una biblioteca (Asio, libuv o libevent) en lugar de escribir el bucle de eventos manualmente.
Preguntas frecuentes
¿La lección «E/S asíncrona con epoll y kqueue» es gratis?
Sí — el texto completo de «E/S asíncrona con epoll y kqueue» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «E/S asíncrona con epoll y kqueue»?
Escale a muchas conexiones con epoll en Linux y kqueue en BSD o macOS. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «E/S asíncrona con epoll y kqueue»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- API de sockets BSD en C++
- Construcción de un servidor TCP de eco
- E/S asíncrona con epoll y kqueue
- Uso de Boost Asio para E/S asíncrona moderna