Golangs goroutines представляют собой интерфейс блокировки ввода-вывода для goroutine (-programmer). За кулисами во время выполнения естественно используется какой-то неблокирующий ввод-вывод, чтобы предотвратить приостановку OS-потока ОС, так что среда выполнения может запускать другой goroutine поверх потока ОС при выполнении ввода-вывода.Планирование ввода/вывода Goroutine
Когда выполняется время выполнения ввода-вывода, чтобы он мог перенести goroutine?
Чтобы было ясно, если у меня есть net.TCPConn
, на который я звоню Write
, когда я могу ожидать, что горутин будет перенесен?
conn, err := net.Dial("tcp", serverAddr)
conn.Write(buffer)
timestamp = time.Now()
То есть, когда я могу ожидать отметки времени?
- Когда буфер был скопирован во время выполнения golang?
- Когда буфер был скопирован во время выполнения и в пространство ядра ОС?
- Когда буфер был скопирован во время выполнения, пространство ядра и дополнительно к буферу отправки NIC?
- Когда буфер отправлен по сети/из сетевого адаптера?
- Когда буфер был подтвержден полученным концом TCP-стека?
Эта статья [https://morsmachine.dk/go-scheduler) может быть немного устаревшим, но дает хорошее представление о том, как работает планировщик. – thwd
Perfect !, отведите меня до https://morsmachine.dk/netpoller, который дал мне ответ. – Fredrik