Una pregunta frecuente: ¿Las operaciones asincrónicas crearán subprocesos?
Esta pregunta ha sido formulada muchas veces por otros en WeChat. Después de mucha deliberación, creo que es necesario responderla de manera unificada primero, déjame decirte mi respuesta: tal vez, tal vez no.
Para encontrar la respuesta, debemos comenzar con el marco subyacente del procesamiento asincrónico.
Asynchronous es un modelo de publicación-suscriptor desde el nivel de diseño. Después de todo, su capa inferior utiliza la cola de finalización de puerto, que puede reflejarse en los tres métodos proporcionados por el objeto kernel del puerto de finalización de IO.
Puede echar un vistazo rápido a la firma:
Este método vincula principalmente el identificador del archivo y el objeto del kernel del puerto de finalización de IO, donde NumberOfConcurrentThreads representa el límite superior del número máximo de subprocesos permitidos para ejecutarse en el puerto de finalización.
Mire la firma nuevamente:
La función de esta función es enviar un paquete a través del objeto del kernel al programa del dispositivo controlador, y este último interactúa con el hardware, como archivos.
Mire la firma:
Este método intenta extraer el paquete IO del objeto del kernel del puerto de finalización de IO. Si no se extrae, esperará indefinidamente hasta que se extraiga.
Una vez que tenga una idea de los tres métodos anteriores, veamos el diagrama de estructura:
Este diagrama es muy conciso y completo, pero solo se dibuja la cola de finalización del puerto. De hecho, hay tres más. Las colas relacionadas con los subprocesos IO son: cola de subprocesos en espera, cola liberada y cola suspendida. Expliquemos un poco.
Cuando el subproceso t1 llama a GetQueuedCompletionStatus, si no hay ninguna tarea en la cola de tareas q1 en este momento, t1 se atascará y ingresará automáticamente a la cola de subprocesos en espera cuando q1 ingrese a la tarea (entregada por el controlador). en un momento determinado, En este momento, el sistema operativo activará t1 para extraer la ejecución de la tarea de q1 y, al mismo tiempo, enviará t1 a la cola liberada.
En este momento existen dos formas.
Si es necesario forzar la detención de t1 cuando encuentra una suspensión o un bloqueo durante la ejecución, el sistema enviará el subproceso t1 a la cola de subprocesos en pausa. Si todos están en suspensión, NumberOfConcurrentThreads se convertirá en 0 y. Te encontrarás con una situación en la que no hay nadie disponible. ¿Qué debes hacer? Solo puede permitir que el sistema solicite más subprocesos del grupo de subprocesos para extraer tareas de la cola q1. En un momento determinado, la activación del subproceso en la cola de subprocesos se suspende y luego regresa a la cola liberada para continuar ejecutando tareas. Cuando la tarea Después de la ejecución, llame nuevamente al método GetQueuedCompletionStatus para esperar en la cola de subprocesos.
Por supuesto que hay un problema aquí. En un momento determinado, el número de subprocesos en la cola de subprocesos en espera excederá temporalmente el valor de NumberOfConcurrentThreads, pero el problema no es grande.
No importa si estás un poco confundido después de hablar de tantas teorías. A continuación, echaré un vistazo al código fuente de windbg y coreclr.
Para mi máquina, el objeto del kernel del puerto de finalización de IO permite hasta 12 subprocesos en ejecución de forma predeterminada. Cuando se encuentra en suspensión, vea si supera el límite de 12. El código anterior:
< p. > Según la imagen, se ha superado el límite de 12. ¿Son 30? Puedes usar windbg para ayudar a confirmar.A juzgar por la última línea, no hay nada de malo. De hecho, hay 30 subprocesos del puerto de finalización de IO.
Las llamadas operaciones que consumen mucho tiempo son generalmente una gran cantidad de serializaciones, cálculos complejos, etc. Aquí uso while (true) para simular, porque todos los subprocesos no han encontrado eventos de pausa, por lo que, en teoría, existe es no Superará el límite de 12. A continuación, modifique ligeramente el método GetString().
Comparando el tiempo en la imagen, es imposible superar el límite de 12 después de 30 segundos. Después de todo, estos subprocesos están en estado de ejecución y en la cola liberada, lo que también causa el problema. -llamado vergüenza de solicitudes que no responden.
Si comprende lo que dije anteriormente, ¿las operaciones asincrónicas crearán subprocesos? Pregunta, mi respuesta tal vez sea sí o no, depende de las dos lógicas de devolución de llamada mencionadas anteriormente.
Este artículo proviene de blogs.com/huangxincheng/p/16085461.html