关于多路复用是结合的阻塞还是非阻塞的问题
来源:8-2 什么是非阻塞 IO?(二)

c9870884
2022-12-07
请问老师这里下面要讲的是go的netpoller的原理吗?老师这里说的是阻塞模型结合多路复用,为什么我看的另一篇博客是说的go netpoller采用的是非阻塞模型结合多路复用呢?
现在清楚为什么 netpoll 为什么一定要使用非阻塞 I/O 了吧?就是为了避免让操作网络 I/O 的 goroutine 陷入到系统调用从而进入内核态,因为一旦进入内核态,整个程序的控制权就会发生转移(到内核),不再属于用户进程了,那么也就无法借助于 Go 强大的 runtime scheduler 来调度业务程序的并发了;而有了 netpoll 之后,借助于非阻塞 I/O ,G 就再也不会因为系统调用的读写而 (长时间) 陷入内核态,当 G 被阻塞在某个 network I/O 操作上时,实际上它不是因为陷入内核态被阻塞住了,而是被 Go runtime 调用 gopark 给 park 住了,此时 G 会被放置到某个 wait queue 中,而 M 会尝试运行下一个 _Grunnable 的 G,如果此时没有 _Grunnable 的 G 供 M 运行,那么 M 将解绑 P,并进入 sleep 状态。当 I/O available,在 epoll 的 eventpoll.rdr 中等待的 G 会被放到 eventpoll.rdllist 链表里并通过 netpoll 中的 epoll_wait 系统调用返回放置到全局调度队列或者 P 的本地调度队列,标记为 _Grunnable ,等待 P 绑定 M 恢复执行。
1回答
-
Moody
2022-12-07
我觉得我俩说的不能算冲突,我的意思是在工程师编码的视角来看,Go net编程就像阻塞模型一样简单。而不是说Go就是阻塞模型。
012022-12-07
相似问题