2010-03-05 11 views
8

Usando un delegado puedo llamar a cualquier función de forma asincrónica. Según la documentación, entiendo que esto se hace poniendo en cola un elemento de trabajo para el grupo de subprocesos.diferencia entre las llamadas asíncronas y las llamadas asíncronas en io .net

Uno también puede hacer llamadas asíncronas a las funciones IO (como la lectura de sockets, archivos, páginas web, etc.). Creo (pero no estoy seguro) que esto NO genere un elemento de trabajo en el threadpool. Solo después de que se obtiene el resultado (o un error), se llama a la devolución de llamada desde un nuevo hilo en el grupo de hilos.

es correcta esta suposición? ¿O es una llamada IO asíncrona, también debajo de las cubiertas solo un hilo que se genera? Y si este es el caso, ¿cómo las llamadas asíncronas pueden ser mejores que las de desove (usando un grupo de subprocesos) y bloquear?

también: cuántas llamadas asíncronas se puede tener siendo tratado en un momento dado? En caso de que se use un threadpool, supongo que todo lo que quieras. Pero en el caso de llamadas asíncronas IO, ¿hay un límite? Y es así, ¿cómo sabes cuál es el límite?

Respuesta

7

asíncrono IO es mucho más complicado de lo que simplemente usar otro hilo del grupo de subprocesos.

Hay muchas técnicas diferentes dentro OS, que apoyan asíncrono IO:

1 de señalización un objeto de núcleo dispositivo

No es útil para la realización de múltiples solicitudes simultáneas de E/S en contra de un solo dispositivo. Permite que un hilo emita una solicitud de E/S y otro hilo para procesarlo.

2 Señalización de un objeto de núcleo evento

permite que múltiples solicitudes de E simultánea de E/S en contra de un solo dispositivo. Permite que un hilo emita una solicitud de E/S y otro hilo para procesarlo.

3 Uso alertable I/O

permite que múltiples solicitudes de E simultánea de E/S en contra de un solo dispositivo. El hilo que emitió una solicitud de E/S también debe procesarlo.

4 Uso de los puertos de finalización I/O

Permite múltiples peticiones I simultánea de E/S en contra de un solo dispositivo. Permite que un hilo emita una solicitud de E/S y otro hilo para procesarlo. Esta técnica es altamente escalable y tiene la mayor flexibilidad.

+0

@sergey: por lo que está diciendo en efecto, hay una diferencia. Entonces, ¿cuántas solicitudes de IO pueden estar pendientes en un momento dado? ¿Cuál es el punto dulce? ¿Es esto dependiente del IO dirigido o algo más? ¿Cómo puede uno saber? – Toad

+0

Respuesta simple: depende. Si usa puertos de finalización de IO (esta es la técnica más complicada pero más poderosa), el sistema operativo crearía la menor cantidad de subprocesos posible (depende de la configuración de su hardware) para manejar todas las tareas de IO activas. El uso de alertable IO requiere un hilo para! Cada! operaciones pendientes de IO. Es por eso que los puertos de copio IO son mucho más efectivos y escalables: puede manejar! Muchos! solicitudes simultáneas de IO con recursos mínimos. Creo que debería leer "Windows a través de C/C++" o "Programación de aplicaciones en el servidor" de Jeffrey Richter para comprender todo esto. ¡Es bastante duro! –

+0

@reinier Los límites se basan en todo, desde su número de CPU hasta su clave de licencia de Windows. Pero los límites no son importantes: siempre que utilice los métodos asíncronos que le proporciona el BCL, * usted sabe * obtendrá una mejor escalabilidad que si usted, por ejemplo. 'QueueUserWorkItem'. – bzlm

Cuestiones relacionadas