netty nio模型

由於littleproxy 使用netty nio作爲網絡框架,線程模型令人眼花繚亂,不得不好好分析一下,其實和glib的gmainlooper以及Android 的threadLooper基本上是一個思路,就是使用任務隊列,poll模型來派發運行任務和io事件處理。

整體模型如下圖。
在這裏插入圖片描述

線程模型的最頂層是NIOEventLoopGroup數據結構, 該結構通過children數組維護多個EventLooper, 在nio模型中爲NIOEventLooper, 每一個NIOEventLooper對應一個線程,所以可以理解NIOEventLoopGroup爲一個線程池。

NIOEventLooper作爲一個線程,所做的操作就是最最核心的部分,在介紹這部分工作之前先介紹下它的核心數據結構。 其中scheduletTaskQueue用於維護用戶定時任務,taskQueue用於維護非定時任務, pool channel則爲用戶關心的io通道(java使用通道來表示一個可讀寫的文件描述符)。所以NIOEventLooper線程的核心工作就是運行scheduletTaskQueue,taskQueue中的任務,以及pool channels。 pool channels的過程要關注定時任務的超時和是否taskqueue中是否有新任務。 另外外部採用java的selector.weakup()來進行喚醒。

再介紹一下NIOChannel,對應途中AbstraceNIOChannel, 一個NIOChannel 對應一個IOChannge(java的NIOChannel,方便區分後面寫作javachannel),以及一個綁定的NIOEventLooper。也就是說該NIOChannel中的javachannel的poll操作都由該NIOEventLooper完成。

另外NIOChannel裏面有一個ChannelPipe數據結構,用於javachannel的讀寫鏈接等io事件的處理。

ChannelPipe裏面維護一個鏈表,每一項爲一個ChannelHandlerContext結構,該結構中的ChannelHandler用於執行具體的io事件處理。ChannelHandlerContext的EventLooper則是用於綁定處理該事件的線程,也就是在ChannelHandlerContext的EventLooper線程中使用ChannelHandler處理NIOChannel中javachannel的具體io事件。

這就是netty nio的整體模型。該模型更偏向線程模型的角度。

具體的使用還要和協議相關。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章