Ao fazer E / S assíncrona, como o kernel determina se uma operação de E / S é concluída?

Alguns antecedentes sobre por que estou perguntando isso. Eu fiz essa pergunta há algumas horas

Quando uma goroutine bloqueia a E / S, como o planejador identifica que parou de bloquear?

que teve a resposta

Todas as E / S devem ser feitas por meio de syscalls e, da maneira como os syscalls são implementados no Go, eles sempre são chamados por meio de código que é controlado pelo tempo de execução. Isso significa que quando você chama um syscall, em vez de apenas chamá-lo diretamente (renunciando ao controle do encadeamento para o kernel), o tempo de execução é notificado do syscall que você deseja criar e o faz em nome da goroutine. Isso permite, por exemplo, executar um syscall sem bloqueio em vez de um bloqueio (essencialmente dizendo ao kernel: "por favor, faça isso, mas em vez de bloquear até terminar, retorne imediatamente e me avise depois que o resultado for"). está pronto"). Isso permite que ele continue fazendo outros trabalhos enquanto isso.

Portanto, pelo que entendi, o que o planejador golang faz é garantir que ele não fique parado, gastando tempo com threads aguardando operações de E / S. Em vez disso, de alguma forma adia essa responsabilidade para o kernel.

No entanto, quero ter uma compreensão mais profunda do processo, porque há muitas coisas que não estão claras para mim.

No momento, esse é meu entendimento, que pode estar completamente errado.

Faça uma solicitação de E / S, como uma solicitação GET, para um servidor remoto dentro da goroutineGolang faz um syscall para ler um fluxo TCP, que é uma operação de bloqueio, mas, em vez de esperar, solicita que o kernel seja notificado quando obtiver as informações. O planejador remove a goroutina de bloqueio de sua filaQuando o kernel obtém todas as informações, ele as encaminha para o processo de execução e permite que o planejador adicione a goroutine de volta à sua fila.

O que estou tentando entender é como a operação de E / S é feita sem criar outro encadeamento e como o kernel realmente "sabe" que a operação de E / S é feita. É por meio de pesquisas ou existe algum tipo de sistema de interrupção?

Espero que isso faça algum sentido. Eu sou muito novo em conceitos que estão nesse nível baixo.

questionAnswers(1)

yourAnswerToTheQuestion