Pregunta ¿Qué actividad de IO admite el administrador de GHC IO?


He estado leyendo sobre el nuevo administrador de IO en GHC, que utiliza notificaciones de eventos asíncronas y evita el bloqueo de E / S para lograr un alto rendimiento.

¿Qué actividades de IO son elegibles para la administración mediante el nuevo código IO asíncrono? ¿Lectura y escritura de archivos y actividad de la red? Acceso a la base de datos ¿Hay tipos de IO en los que el administrador tiene que recurrir al bloqueo?


32
2017-12-15 04:30


origen


Respuestas:


Cualquier descriptor de archivo que pueda ser manejado por epoll/kqueue es elegible. Las bibliotecas que desean un tratamiento asíncrono de E / S deben cooperar con el administrador de E / S mediante

  • hacer que los descriptores de archivos no sean bloqueados, y
  • llamando al threadWaitRead y threadWaitWrite funciones en GHC.Conc antes de volver a intentar una llamada al sistema que previamente devolvió EWOULDBLOCK.

Esto ya se ha hecho para el Handle y Socket tipos. Si usa, p. un enlace a una biblioteca de base de datos C le dará un comportamiento de bloqueo ya que esa biblioteca no cooperará con el administrador de E / S.


26
2017-12-16 07:55



Una respuesta algo satisfactoria:

El corazón del nuevo gerente GHC IO es kqueue()/epoll() bucle de evento. Por lo tanto, esperaría que todo lo que se puede construir además de esto sea elegible, si no ahora, luego. En particular, esto significa:

  • Archivo IO
  • Red IO

El código (lo miré hace algunos meses y las cosas podrían haber cambiado) también contiene soporte para registrar y ejecutar tiempos de espera de varios tipos a través de una cola de prioridad (búsqueda). Esto sugiere que la mayoría sleep-como las llamadas también pueden ser piggybacking en la interfaz.

Acerca del acceso a la base de datos: seguro, a menudo accede a la base de datos a través de un socket IO de red para llamar forkIO y hacer acceso a DB en un subproceso separado debería ser factible, rápido y seguro. La comunicación de datos al resto de la aplicación se puede hacer con uno de los medios de simultaneidad, Chan o STM.TChan.

No creo que existan tipos de IO en los que el administrador deba recurrir al bloqueo per se, pero me imagino que algunas bibliotecas pueden eludir al nuevo administrador de IO e ir directamente a la yugular. Ellos, por supuesto, bloquearán.


5
2017-12-15 15:08