WinSock IOCP 模型總結(附一個帶緩存池的IOCP類)

来源:https://www.cnblogs.com/tanguoying/archive/2018/02/10/8439701.html
-Advertisement-
Play Games

IOCP全稱IOCP全稱I/O Completion Port,中文譯為I/O完成埠。IOCP是一個非同步I/O的Windows I/O模型,它可以自動處理I/O操作,併在I/O操作完成後將完成通知發送給用戶。 ...


前言

  由於篇幅原因,本文假設你已經熟悉了利用Socket進行TCP/IP編程的基本原理,並且也熟練的掌握了多線程編程技術,太基本的概念我這裡就略過不提了,網上的資料應該遍地都是。

  IOCP全稱IOCP全稱I/O Completion Port,中文譯為I/O完成埠。IOCP是一個非同步I/O的Windows I/O模型,它可以自動處理I/O操作,併在I/O操作完成後將完成通知發送給用戶。本文主要介紹基於IOCP的網路I/O操作(即socket的Accept、Send、Recv和Close等)。Windows提供了6種網路通信模型,分別是:

  1. 阻塞模型:accept、recv和send操作會阻塞線程,直到操作完成,極其低效。
  2. 選擇(select)模型:輪詢方式探測socket上是否有收發的操作,再調用accept、recv和send操作,核心是select()函數,比阻塞模型高效一點,缺點是一次只能探測64個socket,需要手動調用recv和send進行收發數據。
  3. 非同步選擇(WSAAsyncSelect)模型:利用Windows視窗消息機制響應socket操作,即當socket上有Accept、Send、Recv和Close操作發生時發送一條自定義消息給指定視窗,在視窗中響應socket操作,需要手動調用recv和send進行收發數據。與select模型相比,不需要輪詢方式探測socket,socket上有操作發生即發送通知給視窗視窗,缺點是需要一個視窗對象處理socket的消息,需要手動調用recv和send進行收發數據。
  4. 事件選擇(WSAEventSelect)模型:原理基本同WSAAsyncSelect模型,但是不需要視窗,利用事件(Event)機制來獲取socket上發生的I/O操作。缺點是一次只能等待64個事件,需要手動調用recv和send進行收發數據。
  5. 重疊 I/O(Overlapped I/O)模型:利用重疊數據結構(WSAOVERLAPPED),一次投遞一個或多個Winsock I/O請求,等這些請求完成後,應用程式會收到通知,用戶可以直接使用 I/O操作返回的數據。簡單的說:投遞一個WSASend請求和接受數據的緩衝區,系統在接收完成後在通知用戶,用戶可以直接使用收到的數據,WSASend操作同理。有兩種方式來管理重疊IO請求的完成情況(就是說接到重疊操作完成的通知):

    1). 事件對象通知(event object notification)

    2). 完成常式(completion routines) ,註意,這裡並不是完成埠

    優點是不用管收發過程,直接提供(發送時)/使用(接收時)數據。缺點是實現略複雜。
  6. IOCP(I/O Completion Port)模型:本文要介紹的模型,見下文。

  以上I/O模型由1-6理解難度依次提高,性能也相應地依次提高,我個人覺得重疊 I/O(Overlapped I/O)模型和IOCP(I/O Completion Port)模型並不是實現難度大,而是理解其運行機制的難度,5和6的使用比前面幾種所需代碼更少,更簡單。下麵開始正式介紹IOCP(I/O Completion Port)模型。

相關概念

  1、非同步通信

  我們知道外部設備I/O(比如磁碟讀寫,網路通信等)速度和CPU速度比起來是很慢的,如果我們進行外部I/O操作時線上程中等待I/O操作完成的話,此線程就會被阻塞住,相當於強迫CPU適應I/O設備的速度,這樣會造成極大的CPU資源浪費。我們沒必要線上程中等待I/O操作完成再執行後續的代碼,而是將I/O操作請求交給設備驅動去處理,我們線程可以繼續做其他事情,然後等待I/O操作完成的通知,大體的流程如下圖所示:

 

 

  

 

  (未完待續……)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 繼承使用繼承優化設計使用:將重覆的代碼抽取到父類中繼承的優點和實現優點:方便修改代碼減少代碼量 子類和父類關係是is-a的關係(可以有多個子類,但只能有一個父類) 如何使用繼承?class Pet {/公共的屬性和方法}class Dog extends Pet {/子類特有的屬性和方法}class ...
  • 一、巴什博弈(Bash Game) 有n個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取m個,最後取光者得勝。 顯然,如果n=m+1,那麼由於一次最多只能取m個,所以,無論先取者拿走多少個,後取者都能夠一次拿走剩餘的物品,後取者取勝。因此我們發現瞭如何取勝的法則: 如果n=(m+1)* ...
  • 明明一天都想著一會兒就更新,可是總是忘了,今天公司的項目上線倒是有點忙 這個月不是很順啊, 狗被金毛把腿咬了兩個洞,花錢不說,還不能洗澡,看著也怪心疼的, 摩托車忘了開U鎖就起步,導致鏈條蓋碎了, 公司加班太多缺少睡眠又莫名其妙的撞了頭,起了一個大包,裡外頭疼了好幾天, 沒有14薪了,只有13薪 看 ...
  • 接下來的幾篇博客,想記錄一下通過學習坦克大戰項目來循序漸進的學習Java基礎。主要是為了鞏固基礎知識,當然學習編程重要的還是多敲,問題通常是在敲代碼的過程中發現的,積累也是在敲代碼中尋求的經驗。這個坦克大戰項目是利用Java圖形界面來做的,比較簡陋。但是,在不斷的往裡面加功能的時候,可以學到很多知識 ...
  • 今天我給大家介紹的是python中的Number變數,與c++,java有些不同,下麵讓來為大家介紹: 在python中是不用聲明變數類型的,不過在使用變數前需要對其賦值,沒有值得變數是沒有意義的,編譯器也不會通過 一 : 整型 int: int 在python中的用法與c++大致是一樣的: a=1 ...
  • 上面測試,用了Junit 下邊枚舉 枚舉是什麼? 相當於 有點像單例模式,只造出一個對象供外界使用;這個枚舉一下造出好多個供使用,造出的對象不能改變 枚舉出來的ABCDE都是可以用類名.直接調用的對象,對象可以賦值,和調用其成員方法 ...
  • Java中成員訪問許可權 Java中的訪問許可權控制符有四個:作用域lxx__當前類____同一package___子孫類____其他package publiclxx___√lxx__lxx___√lxx__lxx__√lxx__lxx___√ protected___√lxx__lxx___√___ ...
  • ssh服務端 ssh客戶端 socket文件傳輸並校驗 服務端 socket文件傳輸並校驗 客戶端 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...