2012-05-10 13 views
14

En Java o C# o en algunos otros idiomas, existen instalaciones IO sin bloqueo, por ejemplo, para sockets.¿Cómo se implementa IO sin bloqueo?

por lo que puedo dar a mis funciones de devolución de llamada a la IO no bloqueo y una vez que el IO no bloqueante recibe algo, llamaré a mi devoluciones de llamada.

Me pregunto cómo se implementan. Si creo IO no bloqueante, detrás de la escena, ¿Java o C# simplemente crean hilos de fondo para ellos? o el SO subyacente tiene soporte nativo para ellos?

+0

Véanse las observaciones aquí: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx. Parece utilizar un hilo de fondo, que se almacena en caché si se vuelve a utilizar el mismo contexto. – mellamokb

+0

@mellamokb dice que un contexto de ejecución se almacena en caché y se reutiliza, no dice nada acerca de un hilo. –

Respuesta

18

En Windows existe un apoyo para el sistema operativo subyacente no bloqueo de E/S, y CLR de Microsoft que se aprovecha de eso. Otras implementaciones de CLR (mono) probablemente también lo hagan, pero no estoy seguro. Al realizar asincronización de E/S en Microsoft CLR, no hay una correlación de 1 a 1 entre las operaciones de E/S asíncronas pendientes y los subprocesos (o al menos los subprocesos administrados) en espera de que se completen esas operaciones de E/S.

Ver http://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx para algunos detalles sobre los detalles de Win32 capas. Asimismo, la información sobre los puertos de finalización de E/S aquí: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx

Mi opinión es la siguiente:

  1. que comienzan una operación asincrónica de E/S en un poco de hilo aplicación.
  2. Si se ha hecho ya, se creará una cola (bueno, en realidad una construcción a nivel de kernel llamado un puerto de finalización de E/S, que se asocia con una cola en el espacio del núcleo de mi solicitud). En el mundo .NET, un hilo especialmente designado llamado subproceso de puerto de finalización de E/S comenzará a esperar las notificaciones de finalización de E/S en esa cola. Lo importante a tener en cuenta aquí es que puedo realizar cualquier número de solicitudes de E/S asincrónicas sin aumentar la cantidad de puertos de E/S de finalización.
  3. El sistema operativo notificará a la aplicación cuando se complete E/S al poner en cola un mensaje de finalización de E/S en la cola. El subproceso del puerto de terminación de E/S manejará ese mensaje invocando la devolución de llamada de finalización de E/S en mi aplicación .NET. Mientras tanto, si se completa otra E/S, los resultados se colocarán detrás de los resultados de procesamiento actuales.

Advertencias a lo anterior:

  1. estoy seguro de que tengo parte de este mal, pero creo que la esencia general de que es correcta. Eric o alguien puede entrar y corregirme donde estoy.

  2. En .NET hay múltiples hilos de puerto de finalización de E/S. No tengo idea de cómo asincronizar las solicitudes de E/S se asignan entre los diversos puertos de E/S de finalización. Esta puede ser una característica del sistema operativo (en donde E/S puede regresar a cualquier puerto que la aplicación haya abierto).

Para Java, estoy seguro de que depende de la implementación de JVM y del SO en particular. No lo sé lo suficientemente bien como para especular más allá de eso.

EDIT: actualización histórico, muchos más detalles here

+0

¿Qué quiere decir 'Para C# hay soporte de sistema operativo subyacente ...'. El sistema operativo no tiene conocimiento de eso.NET se está ejecutando en la parte superior y, en teoría, .NET puede ejecutarse en Windows y Linux (a través de mono). – Tudor

+0

@Tudor Voy a aclarar –

+0

Por favor, escriba con más detalles – Jack