Estoy diseñando el ciclo de eventos para socket I/O asincrónico usando epoll/devpoll/kqueue/poll/select (incluyendo Windows-select).Diseño y problemas del ciclo de eventos asíncronos
que tienen dos opciones de realización, operación IO:
modono bloqueante, encuesta sobre EAGAIN
- llaves de vaso a modo de no bloqueo.
- Lectura/escritura en el zócalo.
- Si la operación se realiza correctamente, envíe la notificación de finalización al bucle de evento.
- Si obtengo EAGAIN, agregue el socket a "seleccionar lista" y encuestar.
modo de sondeo: sondeo y luego ejecutar
- Agregar zócalo para seleccionar lista y sondear la misma.
- esperar la notificación de que se puede escribir legible
- lectura/escritura
- notificación de finalización del anuncio al bucle de eventos de sucseeds
Para mí se parece a primera requeriría menos llamadas al sistema cuando se utiliza en modo normal , especialmente para escribir en el zócalo (los búferes son bastante grandes). También parece que sería posible reducir la sobrecarga en la cantidad de ejecuciones de "seleccionar" , especialmente cuando no tiene algo que se adapta bien como epoll/devpoll/kqueue.
Preguntas:
- ¿Hay alguna ventaja del segundo enfoque?
- ¿Hay algún problema de portabilidad con operaciones sin bloqueo en sockets/descriptores de archivos en numerosos sistemas operativos: Linux, FreeBSD, Solaris, MacOSX, Windows.
Notas: Por favor, no sugieren el uso de implementaciones evento de lazo/socket-api
No veo ninguna razón por la que no puede esperar para asignar memoria un hasta que sea necesario usando el primer enfoque. ¿Me estoy perdiendo de algo? – Ioan
Supongo que sí, pero en la práctica no está implementado de esa manera. En el primer caso, necesita el búfer disponible desde los pasos 2 a 4, en el segundo solo lo necesita en el paso 3. – karunski