[計算機網絡]網絡I/O模型

歡迎來到啾啾的博客🐱。
這是一個致力于構建完善的Java程序員知識體系的博客📚,記錄學習的點滴,分享工作的思考、實用的技巧,偶爾也分享一些雜談💬。
歡迎評論交流,感謝您的閱讀😄。

引言

我們非常有必要了解I/O模型,以Java微服務為例,微服務架構中的網關Gateway與共享緩存Redis的核心設計的理解都離不開網絡I/O。

5種I/O模型

當一次網絡請求發生時,將會按順序經歷“等待數據從遠程主機到達緩沖區”和“將數據從緩沖區復制到應用程序網絡地址空間”兩個階段
根據實現這兩個階段的不同方法,人們把網絡I/O模型總結為兩類、五種模型:兩類是指同步I/O與異步I/O,五種是指在同步I/O中又劃分出阻塞I/O、非阻塞I/O、多路復用I/O、信號驅動I/O四種細分模型以及異步I/O模型。

這里劃重點,兩個階段🌟,后續5種I/O模型差異的理解基于這兩個階段的理解。
1——“等待數據從遠程主機到達緩沖區”,書中這個描述理解容易有問題,如果劃分成兩個階段,這個階段的“到達”應該是“等待數據從遠程主機到達緩沖區后,經由協議處理,用戶進程可以安全讀取的有效數據存在與內核緩沖區”。
到達緩沖區 = 數據到達——> 協議處理 ——> 數據就緒
2——“將數據從緩沖區復制到應用程序網絡地址空間”
![[Pasted image 20250327130528.png]]

根據UNIX網絡編程中的分類,I/O模型分為5種。

其中,同步與異步概念如下:

  • 同步
    調用端在發出請求之后,得到結果之前必須一直等待。
    比如日常代碼按順序執行就是異步,等待前一行代碼執行完成然后繼續下一行代碼。
  • 異步
    發出調用請求之后將立即返回,不會馬上得到處理結果,結果將通過狀態變化和回調來通知調用者。
    比如使用線程處理任務,主線程繼續執行當前任務,這種就是異步。

阻塞和非阻塞是針對請求處理過程而言,指在收到調用請求之后,返回結果之前,當前處理線程是否會被掛起。

以UDP recvfrom(接收數據并獲取發送方地址的核心函數)操作為例,五種I/O模型解釋如下。

阻塞I/O (Blocking I/O)

等待兩個階段操作都完成,即等待數據到緩沖區、等待數據從緩沖區復制到到應用程序網絡地址空間的操作都完成。
阻塞期間,線程會休眠,狀態切換開銷大。
比如Socket編程就是阻塞I/O。
![[Pasted image 20250327125156.png]]

非阻塞I/O(Non-blocking I/O)

線程定期檢查(輪詢)數據是否就緒(數據是否已經從完成主機到達緩沖區),減少一階段無效等待。
非阻塞I/O輪詢檢查本身也會消耗CPU資源,但可以避免線程休眠,適合一些很快就能返回結果的請求。

![[Pasted image 20250327125242.png]]

需要留意的是,二階段復制數據 copy_to_user的內存拷貝操作仍可能引起微秒級阻塞(取決于數據量大小)。

多路復用I/O(I/O Multiplexing)

單線程監控多個文件描述符。即單一線程處理多個請求,當有任意請求完成階段一進入就緒狀態,則為其執行階段二:開始復制數據。

![[Pasted image 20250327135551.png]]

其中監控多個文件描述符細分為select、poll、kqueue等不同實現。
雖然描述是單個線程的多路復用,但是一般并發處理的設計是“線程池+多路復用”。

信號驅動I/O(Signal-driven I/O)

內核通過信號(信號處理函數)通知就緒狀態。

信號驅動I/O和異步I/O的區別在于,信號驅動是通知階段一完成,可以開始階段二,異步則是通知階段二完成。

![[Pasted image 20250327140641.png]]

異步I/O(Asynchronous I/O)

全流程非阻塞,內核完成所有操作后通知。
異步I/O數據到緩沖區后,不需要由調用進程主動進行緩沖區復制數據到應用程序網絡地址空間的操作,而是復制完成后由操作系統向線程發送信號。

![[Pasted image 20250327141231.png]]

高并發選擇

模型阻塞階段用戶參與度典型應用場景
阻塞I/O全程阻塞被動等待簡單客戶端程序
非阻塞I/O數據拷貝階段主動輪詢低并發實時系統
I/O多路復用select阻塞,拷貝阻塞集中管理Web服務器(Nginx)
信號驅動I/O僅拷貝階段異步通知特殊設備監控
異步I/O無阻塞完全托管高性能服務器(Proactor模式)

在高并發場景下推薦使用I/O多路復用或異步I/O模型。
相較于其他I/O模型,這兩種模型沒有阻塞I/O模型的休眠成本、沒有非阻塞I/O模型的輪詢成本、也沒有信號I/O模型處理上下文切換的成本。
且多路復用I/O意味著在同樣的線程數下,線程池能處理更多的請求。
而異步I/O相較于多路復用I/O則減少了通知處理次數,且多個請求不用等待一個線程延遲更低。

關于高并發場景,細講還有多路復用優化、異步的io_uring高級特性,還有不同并發量級的選擇策略等。
多路復用瓶頸:就緒事件>線程池處理能力任務堆積怎么辦?
異步瓶頸:SQ(提交隊列)環大小限制批量提交規模(Linux io_uring默認4096 entries)
……
等等,I/O還有很多很多可以學習,本篇先到此為止,感謝您的閱讀。

推薦閱讀

【linux內核】五大經典IO模型(原理+動圖+代碼詳解)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74718.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue中使用JsonView進行JSON數據展示

前言 最近在開發公司的管理系統的操作日志模塊,要查看某條操作日志的請求參數,要將請求的參數以 JSON 格式的形式展示出來,于是用到了Vue-JSON-Viewer 這個插件。 一、Vue-JSON-Viewer 基礎入門 插件簡介 Vue-JSON-Viewer 是一個用于在Vue項…

vue vue3 走馬燈Carousel

背景: 在項目中需要展示多張圖片,但在頁面上只有一張圖片的有限位置,此時考慮使用輪播圖實現多張圖片的展示。element組件官網有走馬燈Carousel的組件詳細介紹。 實現效果: 官網鏈接:點擊跳轉 核心代碼: …

重學vue3(三):vue3基本語法及使用

組合式 API是vue3 的核心特性&#xff0c;替代 Vue2 的選項式 API&#xff0c;強調邏輯復用和代碼組織。基本語法如下&#xff1a; <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 響應式數據 const count ref(0); // 基本類…

Spring Boot分布式項目異常處理實戰:從崩潰邊緣到優雅恢復

當單體應用拆分成分布式系統&#xff0c;異常就像被打開的潘多拉魔盒&#xff1a;RPC調用超時、分布式事務雪崩、第三方接口突然罷工…在最近的電商大促中&#xff0c;我們的系統就經歷了這樣的至暗時刻。本文將用真實代碼示例&#xff0c;展示如何構建分布式異常處理體系。 一…

導出sql命令

除了之前提到的 \G 命令&#xff0c;以下是其他優化 MySQL 查詢結果顯示的方法&#xff0c;供你參考&#xff1a; --- ### 1. **使用 \T 命令導出結果到文件** - 在 MySQL 命令行中&#xff0c;使用 \T 文件名 可以將查詢結果以表格形式導出到指定文件&#xff0c;便于后續…

TDengine 3.3.2.0 集群報錯 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化時處于內網環境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 無法訪問 修復&#xff1a; vi /etc/hosts將buildkitsandbox映射為本機節點 外網環境下初始化時沒有該問題

深度解析 BPaaS:架構、原則與研發模式探索

在當今復雜多變的業務環境下&#xff0c;軟件開發面臨著諸多挑戰&#xff0c;如何有效地管理業務復雜性并實現系統的可擴展性成為關鍵。BPaaS應運而生&#xff0c;它作為一種創新的理念和架構模式&#xff0c;改變著企業研發的方式。本文將深入探討 BPaaS 是什么&#xff0c;以…

如何在linux中部署dns服務 主備dns (詳細全過程)

環境centos 7.9 主DNS&#xff1a;192.168.60.131 備DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200為例 首先是主dns #!/bin/bash# 檢查是否為 root 用戶 if [ "$(id -u)" ! "0" ]; thenecho "請使用…

操作系統導論——第13章 抽象:地址空間

一、早期系統 從內存來看&#xff0c;早期的機器并沒有提供多少抽象給用戶。基本上&#xff0c;機器的物理內存如圖13.1所示 操作系統曾經是一組函數&#xff08;實際上是一個庫&#xff09;&#xff0c;在內存中&#xff08;在本例中&#xff0c;從物理地址0開始&#xff09;&…

云端存儲新紀元:SAN架構驅動的智能網盤解決方案

一、企業存儲的"不可能三角"破局 1.1 傳統存儲架構的困局 性能瓶頸&#xff1a;NAS架構在1000并發訪問時延遲飆升300%容量限制&#xff1a;傳統RAID擴容需停機維護&#xff0c;PB級存儲擴展耗時超48小時成本矛盾&#xff1a;全閃存陣列每TB成本高達$3000&#xff0…

Android adb自身調試log開關

本文介紹下如何打開adb源碼中的debug log 1.adb源碼log是可以動態打開和關閉的&#xff0c;控制邏輯代碼如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…

Axure RP 9.0教程: 基于動態面板的元件跟隨來實現【音量滑塊】

文章目錄 引言I 音量滑塊的實現步驟添加底層邊框添加覆蓋層基于覆蓋層創建動態面板添加滑塊按鈕設置滑塊拖動效果引言 音量滑塊在播放器類APP應用場景相對較廣,例如調節視頻的亮度、聲音等等。 I 音量滑塊的實現步驟 添加底層邊框 在畫布中添加一個矩形框:500 x 32,圓…

rocky linux 與centos系統的區別

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的社區發行版&#xff0c;但兩者在目標定位、更新策略和社區管理上有顯著差異。以下是核心區別的詳細對比&#xff1a; 一、背景與定位 特性Rocky LinuxCentOS起源由 CentOS 聯合創始人…

洛谷題單1-B2002 Hello,World!-python-流程圖重構

題目描述 編寫一個能夠輸出 Hello,World! 的程序。 提示&#xff1a; 使用英文標點符號&#xff1b;Hello,World! 逗號后面沒有空格。H 和 W 為大寫字母。 輸入格式 無 輸出格式 無 輸入輸出樣例 #1 輸入 #1 無輸出 #1 Hello,World!方式-print() 代碼 class Solut…

網絡基礎-路由器和交換機工作配置

三、路由器和交換機的工作原理配置以及華為體系下的小型網絡的搭建 3.1路由基礎 3.1.1數據轉發 通過鏈路層交換機和網絡層路由器進行數據轉發 交換機&#xff08;鏈路層&#xff09;mac地址表的數據轉發路由器&#xff08;網絡層&#xff09; ip路由表的數據轉發 隔離廣播域…

愛普生SG-3031CMA有源晶振在汽車雷達中的應用

隨著自動駕駛技術的普及&#xff0c;汽車雷達已成為高級駕駛輔助系統&#xff08;ADAS&#xff09;和自動駕駛系統的核心感知組件。雷達模塊需要精確的時鐘信號來確保發射/接收時序的準確性、信號處理的同步性以及低功耗運行。這些系統對時鐘信號的穩定性、抗干擾性及環境適應性…

案例實踐 | 招商局集團以長安鏈構建“基于DID的航運貿易數據資產目錄鏈”

概覽 案例名稱 基于DID的航運貿易數據資產目錄鏈 業主單位 招商局集團 上線時間 2024年10月 用戶群體 供數用數企業和個人 用戶規模 集團內20企業 案例背景 招商局集團深入落實“促進數據高效流通使用、賦能實體經濟”精神&#xff0c;深化集團數字化水平&#xff0c…

【docker】docker-compose安裝RabbitMQ

docker-compose安裝RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目錄請勿修改&#xff09;2、啟動mq3、訪問mq4、查看服務器映射目錄5、踩坑5.1、權限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目錄請勿修改&#xff09; versi…

Maven工具學習使用(二)——Maven基礎用法

pom常見屬性說明 詳細見官方文檔說明 https://maven.apache.org/ref/3.8.6/maven-model/maven.html#class_releases <modelVersion>4.0.0</modelVersion> POM模型的版本 <groupId>org.apache.maven.plugins</groupId> 項目屬于哪個組&#xff…

藍橋杯高頻考點——二分(含C++源碼)

二分 基本框架整數查找&#xff08;序列二分的模版題 建議先做&#xff09;滿分代碼及思路solution 子串簡寫滿分代碼及思路solution 1&#xff08;暴力 模擬雙指針70分&#xff09;solution 2&#xff08;二分 AC&#xff09; 管道滿分代碼及思路樣例解釋與思路分析solution 最…