Al hacer E / S asíncrona, ¿cómo determina el núcleo si se completa una operación de E / S?

Algunos antecedentes sobre por qué estoy preguntando esto. Hice esta pregunta hace unas horas.

Cuando una rutina rutinaria bloquea en E / S, ¿cómo identifica el planificador que ha dejado de bloquear?

cual tenia la respuesta

Todas las E / S deben realizarse a través de syscalls, y la forma en que las syscalls se implementan en Go, siempre se llaman a través de un código controlado por el tiempo de ejecución. Esto significa que cuando se llama a syscall, en lugar de simplemente llamarlo directamente (por lo tanto, ceder el control del subproceso al kernel), el tiempo de ejecución se notifica de la syscall que desea realizar, y lo hace en nombre de la rutina. Esto le permite, por ejemplo, hacer una llamada al sistema sin bloqueo en lugar de una de bloqueo (esencialmente decirle al núcleo, "haga esto, pero en lugar de bloquear hasta que esté hecho, regrese de inmediato y avíseme más tarde una vez que el resultado está listo"). Esto le permite continuar haciendo otro trabajo mientras tanto.

Entonces, desde mi punto de vista, lo que hace el planificador de golang es que se asegura de no perder el tiempo gastando en hilos esperando las operaciones de E / S. En cambio, de alguna manera difiere esa responsabilidad para el núcleo.

Sin embargo, quiero obtener una comprensión más profunda del proceso porque hay muchas cosas que no me quedan claras.

En este momento, esto es lo que entiendo, lo que podría estar completamente equivocado.

Realice una solicitud de E / S, como una solicitud GET a un servidor remoto dentro de goroutineGolang realiza una llamada al sistema para leer un flujo TCP, que es una operación de bloqueo, pero en lugar de esperar, le pide al núcleo que se le notifique cuando recibe la información. El planificador elimina ese bloqueo de goroutine de su colaCuando el kernel obtiene toda la información, lo reenvía al proceso de inicio y le permite al planificador saber cómo volver a agregar la rutina a su cola.

Lo que me cuesta entender es cómo se realiza la operación de E / S sin crear otro subproceso, y cómo el núcleo realmente "sabe" que se realiza la operación de E / S. ¿Es a través de encuestas o hay algún tipo de sistema de interrupción en su lugar?

Espero que esto tenga algo de sentido. Soy muy nuevo en los conceptos que son de este nivel bajo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta