【发布时间】:2015-08-05 11:09:19
【问题描述】:
Golang 的 goroutine 为 goroutine (-programmer) 提供了一个阻塞 I/O 的接口。在幕后,运行时自然会使用某种非阻塞 I/O 来防止 OS 挂起 OS 线程,以便运行时可以在执行 I/O 时在 OS 线程之上运行另一个 goroutine。
运行时何时考虑执行的 I/O 以便重新调度 goroutine?
为了清楚起见,假设我有一个 net.TCPConn,我调用了 Write,我什么时候可以期望 goroutine 被重新安排?
conn, err := net.Dial("tcp", serverAddr)
conn.Write(buffer)
timestamp = time.Now()
那是什么时候可以使用时间戳?
- 缓冲区何时被复制到 golang 运行时?
- 缓冲区何时被复制到运行时和操作系统的内核空间?
- 缓冲区已复制到运行时、内核空间以及 NIC 的发送缓冲区时?
- 缓冲区何时通过网络/从 NIC 发送?
- 缓冲区何时被接收端 TCP 堆栈确认?
【问题讨论】:
-
这个article 可能有点过时,但可以很好地了解调度程序的工作原理。
-
完美!带我到morsmachine.dk/netpoller,它给了我答案。
标签: multithreading go io scheduling