La Red de Conocimientos Pedagógicos - Conocimientos educativos - Una pregunta frecuente: ¿Las operaciones asincrónicas crearán subprocesos?

Una pregunta frecuente: ¿Las operaciones asincrónicas crearán subprocesos?

Otros en WeChat han hecho esta pregunta muchas veces. Creo que es necesario dar una respuesta unificada. Déjame decirte primero mi respuesta: tal vez, tal vez no.

Para encontrar la respuesta, debemos comenzar con el marco subyacente del procesamiento asincrónico.

Desde una perspectiva de diseño, asíncrono es un patrón de publicación-suscriptor. Después de todo, su capa inferior utiliza una 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 aproximado a la firma:

Este método vincula principalmente el identificador del archivo al objeto del kernel del puerto de finalización de IO, donde NumberOfConcurrentThreads representa el límite superior del máximo. Número 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 al controlador a través del objeto del kernel, y el controlador interactuará con el hardware, como los 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 recupera, esperará indefinidamente hasta que se recupere.

Con los conceptos de los tres métodos anteriores, veamos el diagrama de estructura:

Este diagrama es muy simple, pero solo se dibuja la cola de finalización del puerto. De hecho, hay tres colas relacionadas con los subprocesos IO, a saber: cola de subprocesos en espera, cola de liberación y cola de suspensión. A continuación, 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 una tarea (entregada por el controlador) ingresa a q1 en un momento determinado, el sistema operativo activará la ejecución de la tarea de t1 para extraer q1 y, al mismo tiempo, enviará t1 a la cola de liberación.

Existen dos formas en este momento.

Si t1 se ve obligado a detenerse cuando encuentra un estado de suspensión o bloqueo durante la ejecución, el sistema enviará el subproceso t1 a la cola de subprocesos suspendidos. Si todos duermen, NumberOfConcurrentThreads pasará a ser 0 y no habrá nadie disponible en este momento. ¿Qué debo hacer? Solo podemos pedirle al sistema que solicite más subprocesos del grupo de subprocesos para extraer tareas de la cola q1. En algún momento, la activación del hilo en la cola de hilos ha sido suspendida, por lo que regresa a la cola liberada para continuar ejecutando la tarea. Cuando se complete la tarea, llame nuevamente al método GetQueuedCompletionStatus para esperar en la cola de subprocesos.

Por supuesto, aquí hay un problema. En algún momento, la cantidad de subprocesos en la cola de subprocesos en espera excederá temporalmente NumberOfConcurrentThreads, pero esto no es un gran problema.

¿No es un poco tonto hablar de tantas teorías? No importa. A continuación, echaré un vistazo al código fuente de windbg y coreclr.

En mi máquina, el objeto del kernel del puerto de finalización de E/S permite hasta 12 subprocesos en ejecución de forma predeterminada. Mientras duerme, vea si supera el límite de 12, código:

En la imagen, ha superado el límite de 12. ¿Son 30? Puedes usar windbg para ayudar a confirmar.

A juzgar por la última línea, no pasa nada. En realidad, hay 30 subprocesos del puerto de finalización de IO.

Las llamadas operaciones que requieren mucho tiempo generalmente incluyen 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, no se excederá el límite de 12. A continuación, modificaré ligeramente el método GetString().

Comparando el tiempo en la imagen, el límite de 12 no se puede exceder después de 30 segundos. Después de todo, todos estos subprocesos están ejecutándose y en la cola de lanzamiento, lo que también crea la llamada situación embarazosa de solicitudes que no responden.

Si entiendo lo dicho anteriormente, ¿las operaciones asincrónicas crearán subprocesos? Mi respuesta a la pregunta es, tal vez sí, tal vez no, dependiendo de las dos lógicas de devolución de llamada mencionadas anteriormente.

Este artículo proviene de blogs.com/huangxincheng/p/16085461.html.