netpoller 原理分享

Golang netpoller 的原理早在很久以前研究過一次,當時寫過一篇文章,最近部門正好有一次技術分享的名額,於是把這塊知識就重溫了一遍,做了一次關於 netpoll 的分享,也算是炒冷飯了,下面是分享的 ppt 內容。

Golang 網絡庫調用棧

思考問題:當沒有客戶端請求時候函數會阻塞在 Accept 上面,此時的阻塞是發生了進程切換,讓出 CPU 了嗎?當客戶端已經建立連接,但是沒有發送數據時候,也會阻塞在 Read 上面,此時的阻塞又是怎麼處理的?

線程之間的切換要進入內核態執行系統調用,而協程的切換是在用戶態完成,相對來說更加節省資源

源碼調用棧,紅色部分代表內核態,黃色部分代表 runtime 部分代碼。

從 net.Listen 進入

當沒有客戶端請求時候,accept 函數會阻塞住(亮黃色部分代表代碼切換到了 G0 調度棧)

從總體來看還是比較枯燥的,因爲主要還是一些理論知識和源碼調用流程。感興趣的小夥伴可以和一些 netpoller 相關的文章以及源碼一起對比食用,現在相關的好文章還是挺多的,相信你定能理解這塊知識點。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zgMqJ77oqdht1Lihv46_Uw