複製鏈接
請複製以下鏈接發送給好友

完成端口

鎖定
完成端口是一個可以把完成端口看成系統維護的一個隊列,操作系統把重疊IO操作完成的事件通知放到該隊列裏,用於暴露 “操作完成”的事件通知。
中文名
完成端口
類    型
IT名詞
概念釋義
Windows的設計目的是一個安全的、健壯的操作系統,能夠運行各種各樣的應用程序來為成千上萬的用户服務。在處理大量用户併發請求時,如果採用一個用户一個線程的方式那將造成CPU在這成千上萬的線程間進行切換,後果是不可想象的。而IOCP完成端口模型則完全不會如此處理,它的理論是並行的線程數量必須有一個上限-也就是説同時發出500個客户請求,不應該允許出現500個可運行的線程。目前來説,IOCP完成端口是Windows下性能最好的I/O模型,同時它也是最複雜的內核對象。它避免了大量用户併發時原有模型採用的方式,極大的提高了程序的並行處理能力。
雖然説IOCP完成端口應用的範圍在於與IO相關的各種場合,但是就目前來看,IOCP完成端口主要用於網絡通信方面。例如:大型MMO遊戲(目前大型的MMO遊戲都採用了IOCP完成端口)、大型IM(即時通訊、實時傳訊)系統、 網吧管理系統、企業管理系統等等具有大量併發用户請求的場合。穩定、高效的IOCP完成端口通信模型幾乎成為開發這類系統的基礎。
完成端口的模型 完成端口的模型
重疊I、O
首先來看看重疊I/O(Overlapped I/O):
重疊I/O(Overlapped I/O)機制允許發起一個操作,然後在操作完成之後接受到信息。對於那種需要很長時間才能完成的操作來説,重疊IO機制尤其有用,因為發起重疊操作的線程在重疊請求發出後就可以自由的做別的事情了。
在WinNT和Win2000上,提供的真正的可擴展的I/O模型就是使用完成端口(Completion Port)的重疊I/O。
完成端口概述
接下來看看完成端口(Completion Ports )
其實可以把完成端口看成系統維護的一個隊列,操作系統把重疊IO操作完成的事件通知放到該隊列裏,由於是暴露 “操作完成”的事件通知,所以命名為“完成端口”(Completion Ports)。一個socket被創建後,可以在任何時刻和一個完成端口聯繫起來。
完成端口 完成端口
一般來説,一個應用程序可以創建多個工作線程來處理完成端口上的通知事件。工作線程的數量依賴於程序的具體需要。但是在理想的情況下,應該對應一個CPU創建一個線程。因為在完成端口理想模型中,每個線程都可以從系統獲得一個“原子”性的時間片,輪番運行並檢查完成端口,線程的切換是額外的開銷。在實際開發的時候,還要考慮這些線程是否牽涉到其他堵塞操作的情況。如果某線程進行堵塞操作,系統則將其掛起,讓別的線程獲得運行時間。因此,如果有這樣的情況,可以多創建幾個線程來儘量利用時間。
總之,開發一個可擴展的Winsock服務器並非十分困難的。主要是開始一個監聽socket,接收連接,並且進行重疊發送和接收的IO操作。最大的挑戰就是管理系統資源,限制重疊Io的數量,避免內存危機。遵循這幾個原則,就能幫助你開發高性能,可擴展的服務程序。
socket的接收緩衝,因為接收事件僅僅在AcceptEx調用中發生。保證每個socket都有一個接收緩衝不會造成什麼危害。一旦客户端/服務器在最初的一次請求(由AcceptEx完成)之後進行交互,發送更多的數據,那麼取消接收緩衝更是一個很不好的做法。除非你能保證這些數據都是在每個連接的重疊IO接收裏完成的 。