cover_image

netpoller原理分享

郭朝 LinuGo
2023年07月19日 11:25

Golang netpoller的原理早在很久以前研究过一次,当时写过一篇文章,最近部门正好有一次技术分享的名额,于是把这块知识就重温了一遍,做了一次关于netpoll的分享,也算是炒冷饭了,下面是分享的ppt内容。

图片

图片

图片


图片


图片

Golang网络库调用栈

图片

思考问题:当没有客户端请求时候函数会阻塞在Accept上面,此时的阻塞是发生了进程切换,让出CPU了吗?当客户端已经建立连接,但是没有发送数据时候,也会阻塞在Read上面,此时的阻塞又是怎么处理的?

图片

图片


图片



图片


图片


图片


图片


图片


图片


图片

线程之间的切换要进入内核态执行系统调用,而协程的切换是在用户态完成,相对来说更加节省资源

图片


图片


图片


图片



图片


图片

源码调用栈,红色部分代表内核态,黄色部分代表runtime部分代码。

从net.Listen进入

图片


图片

当没有客户端请求时候,accept函数会阻塞住(亮黄色部分代表代码切换到了G0调度栈)

图片


图片


图片


图片


图片


图片


图片

从总体来看还是比较枯燥的,因为主要还是一些理论知识和源码调用流程。感兴趣的小伙伴可以和一些netpoller相关的文章以及源码一起对比食用,现在相关的好文章还是挺多的,相信你定能理解这块知识点。


golang · 目录
上一篇ligomon下一篇巧用io.Pipe()优化内存占用情况
继续滑动看下一个
LinuGo
向上滑动看下一个