高擴充套件的基於NIO的伺服器架構(二)

2021-06-19 05:51:51 字數 1456 閱讀 6551

接上文高擴充套件的基於nio的伺服器架構

reactor模式

如下圖所示,將不同事件的檢測分離開,當一種事件發生時乙個事件處理器eventhandler將通知與該事件處理相對應的專用工作執行緒

採用這種架構,連線的通道不得不註冊在乙個selector上。這樣才能通過呼叫register方法使通道有效。

未完待續

...

socketchannel channel = serverchannel.accept();

channel.configureblocking(false);

// register the connection

selectionkey sk = channel.register(selector, selectionkey.op_read);

...

為了達到檢測新事件的目的,selector類具備向已註冊channel所要它們的就緒事件的能力。通過呼叫select方法,selector類收集到了已註冊channel的就緒事件。在至少這些就緒事件中的乙個事件已經完成之前,select方法是處於阻塞狀態下的。這種情況下,select方法返回截至最後一次呼叫select方法時已經對i/o操作做好準備的連線的數量值。

已選擇的連線可以通過呼叫selector類的selectedkey方法被檢索到。selectedkey方法會返回selectionkey物件的乙個結果集,這些結果集保持了io事件的狀態和連線的channel的引用。

selector被dispatcher控制 。dispatcher是乙個單執行緒的類。與selector是組合關係。dispatcher類負責檢索事件以及調遣處理所消耗的排程事件的eventhandler。通過迴圈,dispatcher類呼叫selector類的select方法來等待新事件。當新的事件進來時,select方法返回,同時先關聯的channel通過呼叫selectedkeys方法被收回。

...

while (isrunning)

// writable event?

if (key.isvalid() && key.iswritable())

... }

...}

像準備寫或者準備讀這樣的事件,dispatcher會呼叫eventhandler來處理。eventhandler負責解碼請求資料,處理所需的服務活動,編碼相應資料。由於工作執行緒為等待新的請求而而浪費事件,可擴充套件性和吞吐量的瓶頸只取決於系統資源如cpu或記憶體。因為需要執行緒切換好同步,響應時間上會遜色於傳統的每個執行緒負責乙個連線的架構。而這種事件驅動方式的架構是用來減少同步,優化執行緒管理,因此,這方面的開銷忽略不計。

未完待續

基於NIO的伺服器模型

最簡單伺服器模型是thread per connection,即每個客戶端連線對於乙個專屬的工作執行緒,工作執行緒等待客戶端傳送資料 接收處理資料 返回響應資料然後繼續等待新的資料的到來,這種模型能夠保證很好的響應速度,但如果有大量併發連線會導致大量的工作執行緒,而且這些執行緒浪費了很多時間等待新資...

高併發伺服器(基於epoll)

本章節是用基本的linux unix基本函式編寫乙個完整的伺服器和客戶端例子,可在linux ubuntu 和unix freebsd 上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,把小寫變為大寫,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行...

linux c 高併發tcp伺服器架構

from epoll 接受資料到佇列,執行緒池處理佇列裡的資料 具體實現方式 只使用使用std的的資料結構,未使用boost thread pool.cpp include include include thread pool.h include thread process.h include ...