Windows完成連接埠 IOCP模型(一)

來源:互聯網
上載者:User

標籤:orm   取消   socket   接收   mil   取出   ima   實現   status   

1 Windows完成連接埠基本介紹


2他是只能在Windows下的基於SOCKET事件管理的模型

3與select不同,select需要多次重設管理控制代碼,IOCP只要一次

4有事件後select需要操作擷取資料,而IOCP通知你的時候說明資料操作好了

5select管理控制代碼的數目有限,IOCP沒有限制

6IOCP支援多線程同時等待。


我的設計思路一個線程用來偵聽accept事件, 一個線程來偵聽SOCKET的IO事件,

大部分架構都是這樣, 其實可以只使用一個線程做非同步SOCKET就完全足夠了,現在

使用多線程來 就是看看這個IOCP的多線程用法,


在這之前先要瞭解下 非同步通訊 和 重疊I/O模型

非同步通訊機制: http://blog.51cto.com/blogger/draft/412685

重疊I/O模型: http://blog.51cto.com/12158490/2058180


我建議使用單線程 原因: 應為多個線程,拿到資料後,還是要發送到另外一個線程裡面去,

然後做成事件隊列, 也就是你線程拿到資料後, 還是要按隊列線程,進行邏輯處理,多線程沒意義。



2完成連接埠內部運行流程

完成連接埠的做法:事先開好幾個線程,你有幾個CPU我就開幾個,首先是避免了線程的環境切換,因為線程想要

執行的時候,總有CPU資源可用,然後讓幾個線程等著,等到有使用者請求到來的時候,就把這些請求都加入到一個

公用訊息佇列中, 然後這幾個開好的線程就排隊逐一去從訊息佇列中取出訊息並加以處理, 這種方式實現了

非同步通訊和負載平衡的問題,因為他提供了一種機制來使用幾個線程"公平的"處理來自多個用戶端的輸入/輸出

,並且線程如果沒事乾的時候,也會被系統掛起,不會佔用CPU



3WSAAsyncSelect或者WSAEventSelect和完成連接埠

WSAAsyncSelect或者WSAEventSelect兩種非同步模型, 這兩種模式一定沒有使用overlapped(重疊)機制,

就不能算是真正的非同步,可能是其內部維護了一個訊息佇列,這兩個模式雖然實現了非同步接收,卻不能非同步發送,

完成連接埠他是先把使用者資料接收回來後在通知使用者直接來取,而這兩種模式只會接到資料到達的通知,只能是由

應用程式自己去recv資料,效能上就發送了差異

要實現非同步通訊, 就要一個很強的I/O資料結構,叫重接結"Overtlapped",

Window所有非同步通信都是基於他,完成連接埠也不例外

就是執行I/O請求的時間與線程執行其他任務的事件是重疊(overlapped)的,


重疊結構是非同步通訊機制實現的一個核心資料結構,因為幾乎所有的網路操作例如發送/接收,都要用

WSASend()和WSARecv()代替,參數裡面都會要附帶一個重疊結構,因為重疊機構可以理解為是一個

網路操作的ID號,也就是說我們要利用重疊I/O提供的非同步機制的話,每一個網路操作都要有一個唯一的ID號,

因為進來系統核心,一看到有重疊的I/O的調用進來了,就會使用其非同步機制,並且作業系統就只能靠

這個重疊結構帶有的ID號來區分是哪一個網路操作了,然後核心裡處理完畢, 根據這個ID號,把對應的資料傳上去.




4完成連接埠基本的使用流程 

完成連接埠也分步驟的

1調用CreateIoCompletionPort()函數建立一個完成連接埠,而且在一般情況下,我們需要並且只需要

建立一個完成連接埠,把他的控制代碼儲存好, 之後只要使用這一個控制代碼就行了。

2根據和客戶的I/O操作最好是自己建一個背景工作執行緒

3接入Socket串連, 有兩種方式,1是和別的模型一樣,有一個獨立的線程,專門來accept用戶端的串連,

二是用效能更好的非同步AcceptEx()請求

4每當有用戶端進來的時候,還是調用CreateIoCompletionPort()函數,這裡不是建立完成連接埠,

而是把新連入的Socket控制代碼, 和你建立的完成連接埠綁定在一起。

5用戶端連入後,我們要向這個用戶端Socket提交一個請求,如接收檔案要調用WSARecv()然後系統

就會去執行接收資料的操作, 就不用我們管了。

6 然後就要調用GetQueuedCompletionStatus()(是一個阻塞函數)裡面是掃描連接埠的隊列裡是否有

網路通訊的請求存在(例如讀取資料,發送資料等),一旦有,就會將這個請求從完成連接埠的隊列取回來,

繼續執行本線程的後續代碼,處理完畢後, 必須要再次 投遞網路通訊請求(WSARecv),如此迴圈。




5AcceptEx和Accept的區別

AcceptEx和Accept最大的區別,就是取消了阻塞方式的accept調用,也就是說AccentEx也是通過

完成連接埠來非同步完成的。

這樣做的好處就是:如果短時間內用戶端並發串連請求不是很多,accept和AcceptEx在效能上區別不大,

雖然我們建立Socket只用一行SOCKET s =socket(...)一行代碼,但是系統內部建立一個Socket是相當

耗費資源的,因為Winsock2是分層的機構體系,建立一個Socket需要用到多個Provider之間進行處理,

最終形成一個可用的通訊端,總之,建立一個Socket的開心是相當高的。

AcceptEx比Accept強三點:

(1)最關鍵的是AcceptEx在用戶端連入之前,就把用戶端的Socket建立好了,也就是說,AcceptEx是先建立

Socket,然後發出的AcceptEx調用,也就是說,在進行用戶端的通訊之前,無論是否有用戶端連入,

Socket都是提前建立好的,而不需要想accept是在用戶端連入之後,在現場話費時間建立Socket,

(2)相比Accept只能阻塞方式建立一個連入的入口,對於大量的並發用戶端來講,是在是有點擠,

而AcceptEx可以在完成連接埠上投遞多個請求,還有用戶端連入的時候,就非常優雅而且從容.

(3)AcceptEx還有一個優點,就是投遞AccepEx的時候,收取用戶端發來的第一組資料,這是同時

進行的, 也就意味著,如果用戶端只是連入但不發送資料的話,我們就不會收到這個AccepeEx完成的通知,

非同步AcceptEx使用起來比accept要麻煩。



由於時間關係,在下篇部落格 會詳細介紹完成連接埠的用法

實現圖片中的功能






參考部落格地址 http://www.cnblogs.com/lancidie/archive/2011/12/19/2293773.html




Windows完成連接埠 IOCP模型(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.