При выполнении асинхронного ввода-вывода, как ядро ​​определяет, завершена ли операция ввода-вывода?

Некоторые предыстории, почему я спрашиваю это. Я задал этот вопрос несколько часов назад

Когда блок ввода-вывода блокирует ввод-вывод, как планировщик определяет, что он прекратил блокировать?

у которого был ответ

Все операции ввода-вывода должны выполняться через системные вызовы, а так как системные вызовы реализованы в Go, они всегда вызываются через код, который контролируется средой выполнения. Это означает, что когда вы вызываете системный вызов, вместо того, чтобы просто вызывать его напрямую (таким образом отказываясь от управления потоком для ядра), среда выполнения уведомляется о системном вызове, который вы хотите сделать, и делает это от имени программы. Это позволяет ему, например, делать неблокирующий системный вызов вместо блокирующего (по сути, говоря ядру: «пожалуйста, сделайте это, но вместо того, чтобы блокировать, пока это не сделано, немедленно вернитесь и дайте мне знать позже, как только результат готов"). Это позволяет ему продолжать выполнять другую работу.

Поэтому, насколько я понимаю, планировщик golang делает так, чтобы он не зависал, тратя время на потоки, ожидающие операций ввода-вывода. Вместо этого он как-то переносит эту ответственность на ядро.

Тем не менее, я хочу получить более глубокое понимание процесса, потому что есть много вещей, которые мне неясны.

Прямо сейчас это мое понимание, которое потенциально может быть совершенно неверным.

Сделайте запрос ввода / вывода, например запрос GET, на удаленный сервер внутри goroutineGolang делает системный вызов для чтения потока TCP, который является операцией блокировки, но вместо ожидания он запрашивает у ядра уведомление, когда оно получает информацию. Планировщик удаляет эту блокирующую программу из своей очередиКогда ядро ​​получает всю информацию, оно перенаправляет его в процесс go и сообщает планировщику, что нужно добавить программу в свою очередь.

Что я пытаюсь понять, так это то, как операция ввода-вывода выполняется без создания другого потока, и как ядро ​​фактически «знает», что операция ввода-вывода выполнена. Это через опрос или есть какая-то система прерывания на месте?

Я надеюсь, что это имеет некоторое подобие смысла. Я очень плохо знаком с понятиями, которые так низки.

Ответы на вопрос(1)

Ваш ответ на вопрос