非阻塞IOserver型號

2021-09-07 02:25:24 字數 1356 閱讀 9006

讓我們來考慮乙個場景,你和百萬玩家的魔獸世界的忠實粉絲。時間之旅打每到週末boss。

假設我們的多-threaded果醬server作為遊戲server這是可行的?本場比賽首先分析server有什麼特點:

網遊必須是有乙個持久有狀態的連線,每個client都須要跟server存在乙個持久的連線。以便高速及時傳送訊息。而隨著併發使用者數量的新增,多執行緒堵塞server不可能為每個client分配乙個執行緒。

②  跟一般的應用server不同,cs結構的網路遊戲一般把複雜的邏輯處理放到了client。而在遊戲server端僅僅處理比較簡單的邏輯,甚至僅僅是傳遞訊息。像這樣簡單的邏輯我們居然給每個請求分配一條執行緒。這是不是嚴重脫離實際了?

③  網遊講求的是響應快,訊息交換及時,而且能進行雙向通訊。那必定須要頻繁請求跟響應,假如我們已經採用了長久連線。但server並非每次都有新資料,並不須要傳送給client,那我們還佔了一條執行緒,是不是太浪費了?

從以上幾點分析。像網遊這種場合,我們傳統的多執行緒server顯然已經力不從心。執行緒池能在一定程度上緩解頻繁的io呼叫帶來的資源占用,但池有一定的限制大小。在面對成千上萬的client請求大併發情況下。卻始終不是最佳方案。有沒有可能用乙個或少量的執行緒就能夠維護非常多持久連線呢?以下介紹一種新的server模型——非堵塞server模型。

非堵塞server模型最重要的乙個特點是,在呼叫某個介面後馬上返回,而不會堵塞等待。如圖2-6-2-1中所展示,當多個client向server請求時。server端會儲存乙個socket連線列表,然後有乙個專門的執行緒對這個列表進行輪詢。

假設發現某個socket有資料可讀。就呼叫該socket的對應的讀操作。反之,發現socket有資料可寫的話,就呼叫該socket的對應的寫操作;假設發現某個socket已經中斷,就呼叫socket關閉操作。為了有更好地效能。還能夠結合執行緒池,一旦檢測到有須要處理(讀資料、寫資料、關閉)的socket就啟動另外一條執行緒負責處理。

圖2-6-2-1 非堵塞server模型

這樣看來,無論多少個socket連線都能夠被一條執行緒管理起來。一條執行緒負責遍歷這些socket列表,處理再交給執行緒池,非常好地利用了堵塞的時間,處理能力得到提公升。

但這樣的模型涉及到遍歷全部的socket列表,同一時候須要處理資料的拼接。空暇時也占用較多cpu資源,仍然不適於大併發場景。再稍做改進——事件驅動模型。它的核心是事件驅動,執行緒遍歷的並不是socket列表。取而代之的是檢測事件。對檢測出來的事件進行逐一響應。極大提高了檢測效率。自然處理能力也更強。

阻塞 非阻塞

阻塞和非阻塞指 的是在接收和傳送時是否等待動作完成才返回 舉例 阻塞 block 是指,你撥通某人 的 但是此人不在,於是你拿著 等他回來,其間不能再用 非阻塞 nonblock 是指,你撥通某人 的 但是此人不在,於是你結束通話 待會兒再打。至於到時候他回來沒有,只有打了 才知道。即所謂的 輪詢 ...

阻塞非阻塞

阻塞和非阻塞 阻塞 可用在assign語句和always語句中,表示只要源訊號發生變化,目標訊號就立刻完成賦值操作,在always塊中,結果與語句順序有關,在always塊中是順序關係 非阻塞 只能用在always語句中,表示該語句結束時完成賦值操作,結果與語句順序無關,並行關係 可以這樣理解 阻塞...

阻塞 非阻塞 select epoll

著作權歸作者所有。首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們...