Windows平臺網絡通信中的I/O操作的總結與類比

    此篇博客是我專門針對我的一本教科書進行的筆記整理。以前我一直採用的紙質的筆記本進行的記錄,現在將它們轉錄到博客上,也隨一下大流。

這篇文章是劉琰、劉龍等編著的由機械工業出版社出版的《Windows 網絡編程》(標準書號:ISBN 978-7-111-44196-0)  一書的第8章進行的筆記(總結)。

總覽:

    Windows平臺網絡通信的I/O模型共有7種:

1、阻塞模型;2、非阻塞模型;3、I/O複用模型;4、WSAAsyncSelect模型;5、WSAEventSelect模型;6、重疊I/O模型;7、完成端口模型。

   計算機的外設設備分爲以下三類:

   1,I/O類設備:爲慢速設備,常見如顯示器,鍵鼠,打印機,掃描儀等

   2,存儲類設備:爲快速設備,如硬盤。

   3,網絡通信類設備:速度介於慢速外設和快速外設之間,如調制解調器等。

溯源:(書上的原話)

使用網絡設備進行數據的發送與接收也面臨與傳統I/O操作類似的環節,網絡操作經常會面臨I/O事件的等待,這些等待事件大致可分爲以下幾類:

等待輸入操作:等待網絡中有數據可以被接收;

等待輸出操作:等待套接字實現中有足夠的緩衝區保存待發送的數據;

等待連接請求:等待有新的客戶建立連接或對等方斷開連接;

等待連接響應:等待服務器對連接的響應;

等待異常: 等待網絡連接異常或有帶外數據可被接收。

特別說明同步、異步、阻塞、非阻塞四個概念:

同步和異步兩個概念與消息的通知機制有關,自己等待消息是否被觸發叫同步,由觸發機制來通知消息處理者叫異步。

阻塞與非阻塞與消息的處理機制有關,在操作沒有完成前,函數不會立即返回則爲阻塞模式,立即返回則爲非阻塞模式。

同步不一定阻塞,也可以非阻塞,異步不一定非阻塞,也可以被阻塞。

應用程序將控制權交給內核,默認會阻塞,一直等到網絡事件滿足,操作被處理完成後,控制權返還給應用程序。

阻塞模型的評價:

    優點:常用,簡單直接;不足:多套接字時導致處理時間較長,程序執行效率降低。針對此問題有兩個解決思路:

思路一:使用多線程併發處理多個I/O請求。     思路二:異步、非阻塞處理多個I/O請求。


調用ioctlsocket()函數將套接字設置爲非阻塞模式。

非阻塞模型的評價:

    優點:應用程序進程可以做其他事情,還可以輪詢多個套接字,改串行等待爲並行等待;不足:不適用於對實時性要求較高的應用中。


I/O複用模型也稱爲select模型。(此處應該有着重符號!)

調用select()函數可以獲取一組指定套接字的狀態,以保證及時捕獲到最先滿足條件的IO事件,進而對select()函數中觀測的多個不同套接字上的不同網絡事件進行及時處理。

爲了對套接字集合進行操作,有四個參數宏比較有用:

FD_CLR(s,*set)     

FD_ISSET(s,*set)

FD_SET(s,*set)

FD_ZERO(*set)

select模型的評價:

    優點:單線程可以達到多線程類似的效果,  最多可以管理的套接字數量是1024個。適合定時精度要求高的應用。不足在於系統調用花銷。


WSAAsyncSelect模型又稱爲異步選擇模型,爲Windows的消息驅動機制而引入,MFC中的CSocket類也使用了它。

Windows操作系統的消息機制相關的內容此處不作贅述(難得打字)

調用WSAAsyncSelect()函數

異步選擇模型的評價:

    優點:消息機制支持。   不足:性能瓶頸。


WSAEventSelect模型依靠事件機制。

相關函數:

1,  WSACreateEvent()函數:    默認創建的事件對象處於人工重置和未授信的狀態。

2,WSAResetEvent()函數:將事件對象從事件被響應後的已授信狀態重置爲未授信狀態。

3,WSASetEvent()函數:將指定事件設置爲已授信狀態。

4,WSACloseEvent()函數:

5,核心函數:WSAEventSelect()函數

6,WSAWaitForMultipleEvents()函數:阻塞等待!

7,WSAEnumNetworkEvents()函數:枚舉網絡事件

WSAEventSelect模型評價:

    優點:不依賴於消息,不用有窗口;不足:等待的事件對象總數每次最多64個,受限。


重疊I/O模型的核心是一個重疊數據結構體:WSAOVERLAPPED,這個結構體中有成員可以和事件對象關聯起來。

相關函數:

1,WSAGetOverlappedResult()函數:查詢I/O操作的結果。

2,套接字創建函數:WSASocket();

3,數據發送,接收函數:WSASend()和WSASendTo() ,      WSARecv()和WSARecvFrom()

實際編程中,可以使用事件通知和完成例程兩種方式來管理重疊I/O操作,     完成例程就是一個函數指針,或者說是回調函數。

重疊I/O模型的評價:

   更佳的系統性能。


完成端口模型是Windows下伸縮性最好的I/O模型,同時也是最複雜的內核對象。因其內部提供了線程池的管理,從而提高了程序的並行處理能力。

如多人在線遊戲,大型即時通信系統,網吧管理系統以及企業管理系統。

循環服務器和併發服務器的區別:單線程與多線程(改進:線程池)

完成端口可看作是系統維護的一個隊列,之所以命名爲“完成端口”是因爲它是標識“操作完成”的事件通知。

相關函數:

1,完成端口對象的創建函數:CreateIoCompletionPort()

2,等待重疊I/O操作結果的函數:GetQueuedCompletionStatus()

完成端口模型的評價:

    完成端口模型是應用程序使用線程池處理異步I/O請求的一種機制,當應用程序需要管理上千個套接字時,利用完成端口模型往往可以達到最佳系統性能。

除了對套接字對象進行管理外,還可以應用於文件對象。


以上是對該書的第8章的一個知識點概括,純爲梳理備忘。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章