aio en osx: ¿está implementado en el kernel o con subprocesos de usuario?¿Otras opciones?

StackOverflow https://stackoverflow.com/questions/5902662

Pregunta

Estoy trabajando en mi pequeño marco de trabajo C ++ y tengo una clase de archivo que también debería admitir lectura y escritura asíncronas. La única solución además de usar e / s de archivos síncronos dentro de algunos subprocesos de trabajo que encontré es aio. De todos modos, estaba mirando alrededor y leí en alguna parte, que en Linux, aio ni siquiera está implementado en el kernel, sino con subprocesos de usuario. ¿Es lo mismo cierto para OSX? Otra preocupación es la funcionalidad de las devoluciones de llamada de aio, que tiene que generar un hilo adicional para cada devolución de llamada, ya que no puede asignar un determinado hilo o grupo de hilos para que se encargue de eso (las señales no son una opción para mí). Así que aquí están las preguntas que surgen de eso:

  • ¿Está implementado aio en el kernel de osx y, por lo tanto, es más probable que sea mejor que mi propia implementación con subprocesos?

  • ¿Puede el sistema de devolución de llamada, que genera un hilo para cada devolución de llamada, convertirse en un cuello de botella en la práctica?

  • Si no vale la pena usar aio en osx, ¿existen otras alternativas en unix? en cacao? en carbono?

  • ¿O debería simplemente emular la E / S asíncrona con mi propio grupo de subprocesos?

¿Cuál es su experiencia sobre el tema?

¿Fue útil?

Solución

Puede ver exactamente cómo se implementa AIO en OSX a la derecha aquí .

La implementación usa subprocesos del kernel, una cola de trabajos que cada subproceso muestra y ejecuta de forma bloqueada en una cola de prioridad en función de la prioridad de cada solicitud (al menos eso es lo que parece a primera vista).

Puede configurar el número de subprocesos y el tamaño de la cola con sysctl. Para ver estas opciones y los valores predeterminados, ejecute sysctl -a | grep aio

kern.aiomax = 90
kern.aioprocmax = 16
kern.aiothreads = 4

En mi experiencia, para que tenga sentido usar AIO, estos límites deben ser mucho más altos.

En cuanto a las devoluciones de llamada en subprocesos, no creo que Mac OS X lo admita. Solo realiza notificaciones de finalización a través de señales (ver fuente).

Probablemente podrías hacer un buen trabajo en tu propio grupo de subprocesos. Una cosa que podría hacer mejor que la implementación actual de Darwin es ordenar sus trabajos de lectura por ubicación física en el disco (consulte fcntl y F_LOG2PHYS), lo que incluso podría darle una ventaja.

Otros consejos

@Moka : Lamento decirle que está equivocado con la implementación de Linux, a partir del kernel 2.6 hay una implementación del kernel de AIO, que viene en libaio (libaio.h)

La implementación que no usa subprocesos de Kernel sino que usa subprocesos de usuario es POSIX.1 AIO, y lo hace de esa manera para hacerlo más portátil, ya que no todos los sistemas operativos basados en Unix admiten eventos de finalización a nivel de Kernel.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top