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.