首頁>Club>
3
回覆列表
  • 1 # 夜闌風靜細雨

    Acceptor與Connector執行緒

    在伺服器端,bind一個埠後,會建立一個Acceptor執行緒來負責監聽工作。這個執行緒的工作只有一個:呼叫Java NIO介面在該埠上select connect事件,獲取新建的連線後,封裝成IoSession,交由後面的Processor執行緒處理。

    在客戶端,也有一個類似的,叫Connector的執行緒與之相對應。這兩類執行緒的數量只有1個,外界無法控制這兩類執行緒的數量。

    TCP實現的程式碼可以參考org.apache.mina.core.polling.AbstractPollingIoAcceptor的內部類Acceptor和org.apache.mina.core.polling.AbstractPollingIoConnector的內部類Connector。

    Processor執行緒

    Processor執行緒主要負責具體的IO讀寫操作和執行後面的IoFilterChain和IoHandler邏輯。Processor執行緒的數量N預設是CPU數量+1,可以透過配置引數來控制其數量。前面進來的IoSession會被分配到這N個Processor執行緒中。預設的SimpleIoProcessorPool的策略是session id絕對值對N取模來分配。

    每個Porcessor執行緒中都維護著一個selector,對它維護的IoSession集合進行select,然後對select的結果進行遍歷,逐一處理。像前面提到的,讀取資料,以事件的形式通知後面IoFilterChain;以及對寫請求佇列的flush操作,都是在這類執行緒中來做的。

    透過將session均分到多個Processor執行緒裡進行處理,可以充分利用多核的處理能力,減輕select操作的壓力。

  • 中秋節和大豐收的關聯?
  • 為什麼八大菜系裡沒有京菜?