深入了解NIO的優化實現原理

網絡 I/O 模型優化

? ?網絡通信中,最底層的就是內核中的網絡 I/O 模型了。隨著技術的發展,操作系統內核的網絡模型衍生出了五種 I/O 模型,《UNIX 網絡編程》一書將這五種 I/O 模型分為阻塞式 I/O、非阻塞式 I/O、I/O 復用、信號驅動式 I/O 和異步 I/O。每一種 I/O 模型的出現,都 是基于前一種 I/O 模型的優化升級。

? ?最開始的阻塞式 I/O,它在每一個連接創建時,都需要一個用戶線程來處理,并且在 I/O 操 作沒有就緒或結束時,線程會被掛起,進入阻塞等待狀態,阻塞式 I/O 就成為了導致性能 瓶頸的根本原因。

那阻塞到底發生在套接字(socket)通信的哪些環節呢?

? ?在《Unix 網絡編程》中,套接字通信可以分為流式套接字(TCP)和數據報套接字 (UDP)。其中 TCP 連接是我們最常用的,一起來了解下 TCP 服務端的工作流程(由于 TCP 的數據傳輸比較復雜,存在拆包和裝包的可能,這里我只假設一次最簡單的 TCP 數據

傳輸):

? ? 首先,應用程序通過系統調用 socket 創建一個套接字,它是系統分配給應用程序的一個 文件描述符; 其次,應用程序會通過系統調用 bind,綁定地址和端口號,給套接字命名一個名稱; 然后,系統會調用 listen 創建一個隊列用于存放客戶端進來的連接;最后,應用服務會通過系統調用 accept 來監聽客戶端的連接請求。 當有一個客戶端連接到服務端之后,服務端就會調用 fork 創建一個子進程,通過系統調用 read 監聽客戶端發來的消息,再通過 write 向客戶端返回信息。

非阻塞式 I/O

使用 fcntl 可以把以上三種操作都設置為非阻塞操作。如果沒有數據返回,就會直接返回一 個 EWOULDBLOCK 或 EAGAIN 錯誤,此時進程就不會一直被阻塞。

當我們把以上操作設置為了非阻塞狀態,我們需要設置一個線程對該操作進行輪詢檢查,這也是最傳統的非阻塞 I/O 模型。

零拷貝

? ?在 I/O 復用模型中,執行讀寫 I/O 操作依然是阻塞的,在執行讀寫 I/O 操作時,存在著多 次內存拷貝和上下文切換,給系統增加了性能開銷。

零拷貝是一種避免多次內存復制的技術,用來優化讀寫 I/O 操作。

? ? 在網絡編程中,通常由 read、write 來完成一次 I/O 讀寫操作。每一次 I/O 讀寫操作都需 要完成四次內存拷貝,路徑是 I/O 設備 -> 內核空間 -> 用戶空間 -> 內核空間 -> 其它 I/O 設備

? ? Linux 內核中的 mmap 函數可以代替 read、write 的 I/O 讀寫操作,實現用戶空間和內核 空間共享一個緩存數據。mmap 將用戶空間的一塊地址和內核空間的一塊地址同時映射到相同的一塊物理內存地址,不管是用戶空間還是內核空間都是虛擬地址,最終要通過地址映 射映射到物理內存地址。這種方式避免了內核空間與用戶空間的數據交換。I/O 復用中的 epoll 函數中就是使用了 mmap 減少了內存拷貝。

在 Java 的 NIO 編程中,則是使用到了 Direct Buffer 來實現內存的零拷貝。Java 直接在 JVM 內存空間之外開辟了一個物理內存空間,這樣內核和用戶進程都能共享一份緩存數 據。這是在 08 講中已經詳細講解過的內容,你可以再去回顧下。


推薦閱讀

技術總體方案設計思路

Introduction to UML

業務冪等性技術架構體系

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

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

相關文章

【前端】vue3性能優化方案

以下是Vue 3性能優化的系統性方案,結合核心優化策略與實用技巧,覆蓋渲染、響應式、加載、代碼等多個維度: ?? 一、渲染優化 精準控制渲染范圍 v-if vs v-show: v-if:條件為假時銷毀DOM,適合低頻切換場景&…

在MATLAB中使用自定義的ROS2消息

簡明結論: 無論ROS2節點和MATLAB運行在哪,MATLAB本機都必須擁有自定義消息源碼并本地用ros2genmsg生成,才能在Simulink里訂閱這些消息。只要你想讓MATLAB或Simulink能識別自定義消息,必須把消息包源碼(.msg等)拷到本機指定目錄&a…

spring重試機制

數據庫死鎖處理與重試機制實現指南 1. 業務場景 1.1 問題現象 高并發批量數據處理時頻繁出現數據庫死鎖主要發生在"先刪除歷史數據,再重新計算"的業務流程中原有逐條處理方式:list.forEach(item -> { delete(); calculate(); }) 1.2 死…

QEMU源碼全解析 —— 塊設備虛擬化(24)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(23) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! QEMU寫入一個文件的完整過程 前邊用了十來篇文章的篇幅,解析了QEMU啟動過程中的存儲…

java中static學習筆記

較重要知識點 static修飾的變量是共享的在類加載時創建可以不通過實例來訪問靜態方法只能訪問靜態的成員和方法;而非靜態的可以訪問靜態的和非靜態的。靜態方法一般用在通用的方法,這樣方便調用,不然一個通用的方法每一次調用都要創建實例&a…

快刀集(1): 一刀斬斷視頻片頭廣告

一刀流:用一個簡單腳本,秒殺視頻片頭廣告,還你清爽觀影體驗。 1. 引子 作為一個愛生活、愛學習、愛收藏高清資源的老碼農,平時寫代碼之余看看電影、補補片,是再正常不過的事。 電影嘛,要沉浸,…

spring中的@KafkaListener 注解詳解

KafkaListener 是 Spring Kafka 提供的一個核心注解,用于標記一個方法作為 Kafka 消息的消費者。下面是對該注解的詳細解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…

多區域協同的異地多活AI推理服務架構

🌐多區域協同的異地多活AI推理服務架構 #mermaid-svg-TTnpRKKC7k3twxhE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TTnpRKKC7k3twxhE .error-icon{fill:#552222;}#mermaid-svg-TTnpRKKC7k3twxhE .er…

極客時間:在 Google Colab 上嘗試 Prefix Tuning

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

Android設備推送traceroute命令進行網絡診斷

文章目錄 工作原理下載traceroute for android推送到安卓設備執行traceroutetraceroute www.baidu.com Traceroute(追蹤路由) 是一個用于網絡診斷的工具,主要用于追蹤數據包從源主機到目標主機所經過的路由路徑,以及每一跳&#x…

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數 文章目錄 thttpd服務安裝thttpd配置thttpd服務thttpd函數日志效果和文件附錄:開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADX…

Linux 內核內存管理子系統全面解析與體系構建

一、前言: 為什么內存管理是核心知識 內存管理是 Linux 內核最核心也最復雜的子系統之一,其作用包括: 為軟件提供獨立的虛擬內存空間,實現安全隔離分配/回收物理內存資源,維持系統穩定支持不同類型的內存分配器,最優…

鼠標的拖動效果

1、變量的設置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐標,相對于元素endX、endY:表示結束坐標,相對于元素box&…

SwaggerFuzzer:一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具

SwaggerFuzzer 🌐 一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具🚀 工具介紹:SwaggerFuzzer? 核心功能亮點🚀 快速使用🧰 支持參數 📌 項目結構📥 獲取與下載 🌐 一款自動化 …

文獻閱讀:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目錄 論文簡介動機:為什么作者想要解決這個問題?貢獻:作者在這篇論文中完成了什么工作(創新點)?規劃:他們如何完成工作?離線訓練階段:在線壓縮階段 理由:通過什么實驗驗證它們的工作…

【業務框架】3C-相機-Cinemachine

概述 插件,做相機需求,等于相機老師傅多年經驗總結的工具 Feature Transform:略Control Camera:控制相機參數Noise:增加隨機性Blend:CameraBrain的混合列表指定一個虛擬相機到另一個相機的過渡&#xff…

設計一個算法:刪除非空單鏈表L中結點值為x的第一個結點的前驅結點

目錄 單鏈表的存儲結構定義如下 快慢指針法 三指針法版本① 三指針法版本② 單鏈表的存儲結構定義如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指針法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:設置新建類模板

完整的頭文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷貝構造和賦值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

?**?CID字體?**? 和 ?**?Simple字體?**?

在PDF中,字體類型主要分為 ??CID字體?? 和 ??Simple字體?? 兩大類,它們的主要區別在于編碼方式和適用場景。以下是它們的詳細對比: ??1. CID字體(CID-keyed Fonts)?? CID(Character Identifie…

計組_導學

2025.05.31:老湯講408計組學習筆記 導學 第1章計算機系統概述:對計算機系統有全局的認識第2章總線系統:簡單且獨立,不會依賴其他內容,它是被依賴的第3章主存儲器:只有了解主存儲器的內部結構,才能理解在主存中是如何存儲二進制的第4章數據的表示與運算:各種編碼以及計算…