windows IOCP完成埠實用詳解

2021-08-17 13:55:46 字數 1313 閱讀 6712

1.  為什麼需要完成埠

網路通訊模型是編寫網路程式的乙個比較核心的模組,也直接影響著程式的效能,所以選擇合適的網路模型是非常有必要的。

iocp是一種網路通訊模型,但是在iocp出現之前已經有相關網路通訊模型在使用了,比較普遍的應該就是select模型,另外windows自己家也單獨實現了alertable i/o等。但是提到的select和alertable i/o都存在一些侷限,比如select模型其併發處理量受fdsetsize巨集大小限制,在windows平台上這個大小預設是64,當然也可以自己在包含select之前手動#define其值,但是如果在使用之前就定義乙個很大的值難免有點造成資源浪費,libevent就提供了一種自由的方法來使用select,這個在後面的文章中會詳細介紹。alertable i/o乙個缺陷是多執行緒之間無法達到負載均衡的,同乙個執行緒發出的io請求必須由同乙個執行緒來接收,即使其他執行緒閒著沒事幹。所以這不能充分利多核系統的強大資源。那麼iocp有沒有缺陷呢,當然也有,首先是使用起來不夠簡單明瞭,介面設計的不夠簡潔直觀。但是呢效能還是槓槓的。

上面簡單的說了iocp模型與其他模型的一些對比,另外一點很大的區別是,iocp模型是一種真正意義上的非同步通訊模型,具體啥是非同步啥是同步可以參考我之前的一篇文章。有一點需要說明的是,並不是所有網路通訊專案都必須要使用iocp模型,對於一些已知的連線數較少的網路程式,完全可以用select甚至是每個客戶端對應乙個執行緒這種方式。

2.  完成埠能做什麼

上面吹了一大波完成埠,那麼完成埠究竟能做什麼呢。

首先一點是:iocp會主動幫我們完成網路io資料複製。這一點其實也就是他與其他網路模型最直接的區別了,一般網路操作包括兩個步驟,以recv來說吧,如果是一般模型,那麼其第一步是通知等待的執行緒有資料可以讀取,這時候執行緒會呼叫recv或者recvfrom等函式將資料從讀緩衝區複製到使用者空間,然後再做下一步的處理,而iocp能幫我們的是,他會在核心中幫我們監聽那些我們感興趣的的事件,例如我們希望接收客戶端資料,那麼我們向完成埠投遞乙個讀事件,完成埠在監測有讀事件到來的時候會主動地去幫我們把資料從記憶體空間複製到使用者空間,然後通知我們過來取資料就ok了,這就是iocp提供的方便之處。

另外一點:iocp在內部管理執行緒,實現負載平衡。上面提到了windows的alertable i/o的負載均衡是他乙個弊端,那麼iocp是如何自己管理執行緒排程的呢,簡單的說就是以棧的方式進行管理,具體內容接下來一節會詳細描述。

3.  完成埠原理

先mark下,後續內容會繼續補上。

以上是windows iocp完成埠實用詳解的內容,更多 埠

詳解 完成

windows

實用 iocp 的內容,請您使用右上方搜尋功能獲取相關資訊。

完成埠模型

最近要做乙個網路方面的小東東,基於c s模式的。都說iocp可以使系統達到最佳的效能,因此我就比劃了兩下,獻醜了。抄書開始。從本質上說,完成埠模型要求建立乙個windows完成埠物件,該物件通過指定數量的執行緒,對重疊i o請求進行管理,以便為已經完成的重疊i o請求提供服務。首先要建立乙個i o完...

完成埠iocp和重疊埠

windows下的iocp和 linux下的epoll epoll我還沒有研究過 都是屬於socket 網路程式設計的範疇.不過其特色是 用固定很少的執行緒去管理成千上萬個socket連線.其相當於 非同步通訊 普通socket是同步,同步 可能要乙個執行緒乙個socket鏈結 去做,由於系統可以執...

完成埠的原理

完成埠 i o completion 非同步過程呼叫 apcs 問題 只有發完成埠 i o completion 的優點 不會限制 handle個數,可處理成千上萬個連線。i o completion port允許乙個執行緒將乙個請求暫時儲存下來,由另乙個執行緒為它做實際服務。併發模型與執行緒池 在...