2011-03-12 9 views
41

¿Por qué mucha gente dice E/S de puerto de finalización es el modelo rápido y agradable?
¿Cuál es ventajas y desventajas del puerto de finalización de E/S?ventajas de E/S del puerto de finalización y desventajas

Quiero saber algunos puntos que hacen más rápido IOCP de otro modelo.

Si puede explicarlo comparando otros modelos (select, epoll, multi thread/process tradicional), sería mejor.

+5

Para aquellos que todavía está interesado: [multiproceso E/S asíncrona y puertos E/LA - Dr. Dubb de] (http://www.drdobbs.com/cpp/multithreaded-asynchronous-io-io-comple/201202921) –

Respuesta

10

mediante el uso de IOCP, podemos superar el problema de "un hilo por cliente". Se sabe comúnmente que el rendimiento disminuye mucho si el software no se ejecuta en una verdadera máquina multiprocesador. Los hilos son recursos del sistema que no son ilimitados ni baratos.

IOCP proporciona una manera de tener unos pocos hilos (trabajadores de E/S) que manejen la entrada/salida de varios clientes "bastante". Los hilos están suspendidos y no usan los ciclos de la CPU hasta que haya algo que hacer.

También se puede leer alguna información en este libro agradable http://www.amazon.com/Windows-System-Programming-Johnson-Hart/dp/0321256190

+3

'OVERLAPPED' I/O supera" one-thread-per-client "muy bien gracias. Lo que IOCP trae a la mesa es (como has mencionado correctamente) compartir la carga entre múltiples hilos. Para la mayoría de las aplicaciones que usan E/S OVERLAPPED desde un solo subproceso es más simple y más eficiente. Solo los servidores de aplicaciones de alto volumen deben considerar IOCP. –

+4

@Ben: para ser sincero, encuentro que la programación de IOCP conduce a un estilo de programación más comprensible que el que se obtiene al usar E/S superpuestas. Esto es especialmente cierto si tiene múltiples operaciones en curso simultáneamente (como lo haría al copiar un archivo). –

+1

@Larry: No sé cómo manejas las E/S superpuestas, pero utilizo 'MsgWaitForMultipleObjectsEx' y las rutinas de finalización. Mismo estilo de programación de máquina de estado que IOCP y sin necesidad de sincronización de subprocesos. –

-2

I/puertos de finalización O son proporcionados por el O/S como asincrónica operación de E/S, lo que significa que se produce en el fondo (por lo general en hardware). El sistema no desperdicia ningún recurso (por ejemplo, subprocesos) en espera de que se complete la E/S. Cuando se completa la E/S, el hardware envía una interrupción al O/S, que luego activa el proceso/subproceso correspondiente para manejar el resultado. MAL: IOCP no requiere soporte de hardware (ver comentarios abajo)

Normalmente, un solo hilo puede esperar en un gran número de terminaciones de E/S en tanto se considera muy pocos recursos cuando E/S no ha regresado el I.

Otros modelos asíncronos que no están basados ​​en puertos de terminación de E/S generalmente emplean un grupo de subprocesos y los subprocesos esperan a que se complete la E/S, utilizando de ese modo más recursos del sistema.

La otra cara de la moneda es que los puertos de terminación de E/S generalmente requieren soporte de hardware, por lo que no son generalmente aplicables a todos los escenarios asíncronos.

+1

¿Qué soporte de hardware? No creo que el mecanismo de IOCP esté relacionado con el hardware. – Benjamin

+1

Async I/O no usa un grupo de subprocesos, alguna vez. Algunos frameworks ampliamente utilizados han puesto una envoltura de grupo de subprocesos alrededor de llamadas de E/S sincrónicas, pero eso no es una E/S asincrónica. –

+2

IOCP no requiere soporte de hardware. –

67

puertos de finalización de E/S son impresionantes. No hay mejor palabra para describirlos. Si algo en Windows se hizo bien, son puertos de finalización.

Se puede crear un número de hilos (no importa cuántos) y hacer que todo el bloque en un puerto de finalización hasta que un evento (ya sea uno que publique de forma manual, o un evento de a timer o E/S asíncrona , o lo que sea) llega. Luego, el puerto de finalización activará un hilo para manejar el evento, hasta el límite que haya especificado. Si no especificaste nada, asumirá "hasta la cantidad de núcleos de CPU", lo que es realmente agradable.

Si ya hay más subprocesos activos que el límite máximo, esperará hasta que uno de ellos finalice y luego pasará el evento al subproceso tan pronto como pase al estado de espera. Además, siempre activará los hilos en un orden LIFO, por lo que es probable que los cachés aún estén calientes.

En otras palabras, los puertos de terminación son una "encuesta para eventos" sin complicaciones y una solución de "llenar la CPU tanto como sea posible".

Usted puede lanzar el archivo de lectura y escritura en un puerto de finalización, tomas de corriente, o cualquier otra cosa que es temporizador de espera. Y, puede publicar sus propios eventos si lo desea.Cada evento personalizado tiene al menos un entero y un valor de puntero de datos (si usa la estructura predeterminada), pero no está limitado a eso, ya que el sistema aceptará felizmente cualquier otra estructura también.

Además, los puertos de terminación son rápidos, realmente muy rápidos. Érase una vez, necesitaba notificar un hilo de otro. Como sucedió, ese hilo ya tenía un puerto de finalización para E/S de archivo, pero no bombeó mensajes. Por lo tanto, me preguntaba si debería limitar el problema y usar el puerto de finalización para simplificar, aunque publicar un mensaje de texto sería mucho más eficiente. Estaba indeciso, así que hice una evaluación comparativa. Sorpresa, resultó que los puertos de terminación eran aproximadamente 3 veces más rápidos. Entonces ... más rápido y más flexible, la decisión no fue difícil.

+4

La espera de E/S en general se realiza muy bien en Windows, ya sea IOCP, superpuesta con eventos, superpuesta con rutinas de finalización o esperando todo lo anterior simultáneamente con un semáforo, finalización de un proceso secundario y mensajes de IU. –

+0

Le pregunté por qué los puertos de terminación son tan rápidos. * El despertar de la orden LIFO * es un punto que quería. Pero otras oraciones no son. De todos modos +1 para LIFO – Benjamin

+1

. Una cosa buena de saber es que incluso con ReadFile/WriteFile puede extender la estructura OVERLAPPED arbitrariamente. Simplemente incrústela en una estructura más grande y use CONTAINING_RECORD para recuperar sus datos adicionales. –

0

De acuerdo con mi experiencia, la desventaja del puerto de terminación de E/S puede ser la pantalla azul de la muerte con algunos adaptadores serie RS-232 debido a errores en los controladores.

Cuestiones relacionadas