Netty--第一章(NIO基礎)
1. 三大元件簡介
Channel與Buffer
Java NIO系統的核心在於:通道(Channel)和緩衝區(Buffer)。通道表示開啟到 IO 裝置(例如:檔案、套接字)的連線。若需要使用 NIO 系統,需要獲取用於連線 IO 裝置的通道以及用於容納資料的緩衝區。然後操作緩衝區,對資料進行處理
簡而言之,通道負責傳輸,緩衝區負責儲存
常見的Channel有以下四種,其中FileChannel主要用於檔案傳輸,其餘三種用於網路通訊
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
Buffer有以下幾種,其中使用較多的是ByteBuffer
ByteBuffer
MappedByteBuffer
DirectByteBuffer
HeapByteBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
CharBuffer
1. 1、Selector
在使用Selector之前,處理socket連線還有以下兩種方法
使用多執行緒技術
為每個連線分別開闢一個執行緒,分別去處理對應的socke連線
這種方法存在以下幾個問題
- 記憶體佔用高
- 每個執行緒都需要佔用一定的記憶體,當連線較多時,會開闢大量執行緒,導致佔用大量記憶體
- 執行緒上下文切換成本高
- 只適合連線數少的場景
- 連線數過多,會導致建立很多執行緒,從而出現問題
- 使用執行緒池技術
1. 2、使用執行緒池,讓執行緒池中的執行緒去處理連線
這種方法存在以下幾個問題
- 阻塞模式下,執行緒僅能處理一個連線
- 執行緒池中的執行緒獲取任務(task)後,只有當其執行完任務之後(斷開連線後),才會去獲取並執行下一個任務
- 若socke連線一直未斷開,則其對應的執行緒無法處理其他socke連線
- 僅適合短連線場景
- 短連線即建立連線傳送請求並響應後就立即斷開,使得執行緒池中的執行緒可以快速處理其他連線
1. 3、使用選擇器
selector 的作用就是配合一個執行緒來管理多個 channel(fileChannel因為是阻塞式的,所以無法使用selector),獲取這些 channel 上發生的事件,這些 channel 工作在非阻塞模式下,當一個channel中沒有執行任務時,可以去執行其他channel中的任務。適合連線數多,但流量較少的場景
若事件未就緒,呼叫 selector 的 select() 方法會阻塞執行緒,直到 channel 發生了就緒事件。這些事件就緒後,select 方法就會返回這些事件交給 thread 來處理