IO多路復用相關知識

select、poll、epoll

在傳入的性能差異是不是體現在,當有新的連接過來,此時需要將新的fd傳入到內核中,但是poll/select需要出入整個數組,而epoll方式只需要出入單個fd?

1. select/poll 的情況

  • 它們沒有內核中“長期保存的集合”

  • 每次調用 select()poll(),你都要把 整個數組/集合(所有要監控的 fd)重新傳給內核。

  • 不管你只是新增了 1 個連接,還是 100 個連接,調用時都要把全部 fd 拷貝一次。

    • 例如原來監控 1000 個 fd,現在來了一個新連接,數組變成 1001 個,調用時需要把這 1001 個 fd 整個傳到內核。
    • 所以每次調用開銷是 O(N),與當前總 fd 數成正比。

2. epoll 的情況

  • 內核里有一個持久化的數據結構(紅黑樹 + 就緒鏈表)來保存“我關心的 fd”。

  • 新連接到來時,只需 調用一次 epoll_ctl(ADD, fd) 把這個單個 fd 注冊進去,內核集合就更新了。

  • 后續的 epoll_wait 不需要再傳全集合,只返回就緒 fd。

    • 所以新增 fd 的代價是 O(1)(單次 syscall,處理一個 fd),而等待就緒事件的代價是 O(#ready)

3. 所以性能差異體現在

  • select/poll:每次 wait 都要把“全量數組”搬到內核,新增一個 fd 后,每次 wait 的拷貝量都會增加。
  • epoll:新增 fd 時只需要告訴內核“再加一個”,以后 wait 的時候不用每次重新拷貝整個集合。

一句話總結

是的,差異就在于:

  • select/poll → 新增一個連接后,后續每次調用都要傳 整個 fd 集合
  • epoll → 新增一個連接時,只需要傳 那個新 fd 一次,之后 wait 再也不用傳全集合。

使用水平觸發模式時,當被監控的 Socket 上有可讀事件發生時,服務器端不斷地從 epoll_wait 中蘇醒,直到內核緩沖區數據被 read 函數讀完才結束——這里蘇醒是什么意思

這個“蘇醒”其實是個形象的說法,指的是:
線程在調用 epoll_wait 時會進入阻塞睡眠狀態,當監控的 socket 上發生了指定事件(比如可讀)時,內核會把這個阻塞的線程喚醒,讓它從 epoll_wait 返回。


更精確的過程

  1. 你調用:

    int n = epoll_wait(epfd, events, maxevents, timeout);
    
    • 如果此時沒有任何 fd 就緒,當前線程就會進入 睡眠狀態,掛起在內核的等待隊列里。
  2. 當某個被監控的 fd 上發生事件(例如 socket 收到數據,可讀了):

    • 內核把這個事件加入 epoll 的“就緒隊列”。
    • 內核檢查有線程在 epoll_wait 上阻塞,就會喚醒這些線程
  3. 線程被喚醒后,epoll_wait 返回,你得到就緒事件。

    • 如果是 水平觸發(LT),只要緩沖區里還有沒讀完的數據,fd 就一直處于就緒狀態,下一次調用 epoll_wait 又會馬上返回(繼續“蘇醒”)。
    • 只有當你把數據讀干凈(read 返回 EAGAIN),fd 才會變成未就緒,下次 epoll_wait 才會重新睡眠。

“蘇醒”的本質

  • 內核通過 等待隊列(wait queue) 機制把阻塞的線程放眠。
  • 當事件發生時,內核調用 wake_up 把線程從等待隊列移出,讓調度器把它重新放到可運行隊列里。
  • 線程因此“蘇醒”,從 epoll_wait 返回。

用白話類比

  • 睡眠:線程打盹,等著內核叫醒。
  • 蘇醒:內核發現“喂,socket 來數據了!”,拍醒線程說“起來干活!”。
  • 水平觸發下的不斷蘇醒:只要桌子上還有沒吃完的飯(緩沖區里有數據),內核就會不停叫醒你;只有你把飯吃光(讀干凈),它才不再打擾你。

那epoll和Reactor之間的關系是什么?是不是Reactor基于epoll實現的

你問得很好 👍,這是很多人一開始都會混淆的地方。


1. epoll 是“機制”,Reactor 是“模式”

  • epoll:是 Linux 內核提供的 I/O 多路復用接口,是一種“系統調用機制”。它的職責就是:

    • 高效地監控一批 fd(socket)是否就緒;
    • 把就緒事件通知給用戶態程序。
      👉 屬于 操作系統層面的能力
  • Reactor:是一種 事件驅動編程模型/設計模式。它描述的是如何組織程序結構

    • 一個線程等待事件(epoll_wait 等),當有事件到來時,分發給對應的“事件處理器(Handler)”來處理。
      👉 屬于 應用層面的架構模式

2. 關系

  • Reactor 模式通常用 epoll 來實現(在 Linux 下)。

  • 但 Reactor 并不依賴 epoll,它也可以用 select、poll、kqueue(BSD)、IOCP(Windows) 等機制來實現。

  • 換句話說:

    • epoll = 內核提供的工具
    • Reactor = 用這個工具組織起來的一種設計模式

3. 舉例

比如一個典型的 Reactor 服務器流程:

while (true) {int n = epoll_wait(epfd, events, maxevents, -1); // 等待事件for (i = 0; i < n; i++) {if (events[i].data.fd == listen_fd) {// 有新連接 => 交給 Acceptoraccept_new_connection();} else {// 有數據可讀/可寫 => 交給對應的 Handlerhandler(events[i].data.fd);}}
}

這里:

  • epoll_wait 就是 內核機制
  • 整個 while 循環里“等待事件-分發-處理”的結構,就是 Reactor 模式

4. 總結

  • epoll操作系統提供的事件通知機制
  • Reactor一種事件驅動的編程模式
  • 在 Linux 里,Reactor 通常是 基于 epoll 來實現的,但在其他系統上也可能基于 poll、kqueue、IOCP 等。

哪些框架是基于Netty?

好問題 👍。Netty 本身就是一個 基于 Reactor 模式、封裝了 Java NIO/epoll 的高性能網絡通信框架。很多知名框架和中間件都直接或間接使用了 Netty 來處理底層網絡通信。


常見基于 Netty 的框架/中間件

RPC / 微服務框架

  • Dubbo(阿里開源的 RPC 框架,核心通信基于 Netty)
  • gRPC-Java(Google 的 RPC 框架,Java 實現底層默認用 Netty)
  • Motan(新浪微博開源的 RPC 框架)
  • SOFARPC(螞蟻金服開源的 RPC 框架,默認基于 Netty)

消息中間件

  • RocketMQ(阿里開源的分布式消息隊列,通信層用 Netty)
  • Kafka(部分組件)(核心基于 NIO,部分工具/生態里使用 Netty)
  • ActiveMQ Artemis(底層網絡層實現可選 Netty)

數據庫相關

  • Redis 的部分 Java 客戶端(如 Redisson 使用 Netty 管理連接池和通信)
  • Cassandra Java 驅動(使用 Netty 處理連接)
  • Elasticsearch Java 客戶端(低層 IO 使用 Netty)

網關 / 代理

  • Zuul 2(Netflix 開源 API Gateway,底層通信是 Netty)
  • Spring Cloud Gateway(基于 Spring WebFlux,而 WebFlux 默認基于 Reactor-Netty)
  • gRPC-Gateway Java 生態實現

Web 服務器 / HTTP 框架

  • Reactor Netty(Spring 官方提供的 Netty 封裝,Spring WebFlux 默認用它)
  • Vert.x(異步應用框架,默認底層用 Netty)
  • Play Framework(早期版本)(部分基于 Netty 的異步處理)

其他

  • Finagle(Twitter 開源的異步 RPC 框架,支持多協議,底層 Netty 實現之一)
  • HiveMQ(MQTT broker,基于 Netty 實現高并發連接)
  • Elasticsearch Transport 層(基于 Netty 處理節點間通信)

一句話總結

Netty = Java 世界的“網絡通信基石”。
凡是需要 高并發網絡通信 的 Java 框架/中間件,大概率都直接或間接用了 Netty,比如 Dubbo、RocketMQ、Spring Cloud Gateway、Elasticsearch、gRPC-Java

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

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

相關文章

【CF】Day139——雜題 (絕對值變換 | 異或 + 二分 | 隨機數據 + 圖論)

B. Meeting on the Line題目&#xff1a;思路&#xff1a;數形結合首先考慮如果沒有 t 的影響該怎么寫顯然我們就是讓最大時間最小化&#xff0c;那么顯然選擇最左端點和最右端點的中間值即可&#xff0c;即 (mi mx) / 2&#xff0c;那么現在有了 t 該怎么辦我們不妨考慮拆開絕…

在 Ubuntu 上安裝和配置 PostgreSQL 實錄

一、查看ubuntu版本 lsb_release -a postgresq盡量安裝在新的穩定版本的ubuntu上 二、安裝postgresql 2.1 直接安裝 sudo apt install postgresql 結果如下 2.2 使用PPA源安裝 Ubuntu官方源提供了PostgreSQL的PPA(Personal Package Archive),通過PPA源安裝可以確保獲取…

WebGIS三維可視化 + 數據驅動:智慧煤倉監控系統如何破解煤炭倉儲行業痛點

目錄 一、項目背景&#xff1a;煤炭倉儲管理的痛點與轉型需求 二、建設意義&#xff1a;從 “被動管理” 到 “主動掌控” 的價值躍遷 三、項目核心&#xff1a;技術架構與核心目標的深度融合 四、數據與技術&#xff1a;系統穩定運行的 “雙支柱” &#xff08;一&#x…

使用 Spring Security 實現 OAuth2:一步一步的操作指南

前言 OAuth 是一種授權框架&#xff0c;用于創建權限策略&#xff0c;并允許應用程序對用戶在 HTTP 服務&#xff08;如 GitHub 和 Google&#xff09;上的賬戶進行有限訪問。它的工作原理是允許用戶授權第三方應用訪問他們的數據&#xff0c;而無需分享他們的憑證。本文將指導…

VMware共享文件夾設置

啟用共享文件夾 編輯虛擬機設置-選項-共享文件夾&#xff0c;上面的選項選擇啟用下面點擊添加一個路徑&#xff0c;跟著向導走 設置共享文件夾在主機的路徑&#xff0c;和文件夾名稱添加完成后可以點擊這個共享文件夾條目&#xff0c;查看屬性虛擬機里安裝vm-tools sudo apt up…

華為云昇騰云服務

華為云&#xff0c;一切皆服務共建智能世界云底座面向未來的智能世界&#xff0c;數字化是企業發展的必由之路。數字化成功的關鍵是以云原生的思維踐行云原生&#xff0c;全數字化、全云化、AI驅動&#xff0c;一切皆服務。華為云將持續創新&#xff0c;攜手客戶、合作伙伴和開…

Axum 最佳實踐:如何構建優雅的 Rust 錯誤處理系統?(三)

引言 作為開發者&#xff0c;我們都經歷過這樣的場景&#xff1a;項目上線后&#xff0c;你打開日志監控&#xff0c;鋪天蓋地的 500 Internal Server Error 撲面而來。這些錯誤像個黑洞&#xff0c;吞噬著你的調試時間&#xff0c;你甚至不知道它們是從數據庫查詢失敗&#x…

MySQL高可用方案解析:從復制到云原生

MySQL 的高可用 (High Availability, HA) 方案旨在確保數據庫服務在硬件故障、軟件崩潰、網絡中斷或計劃維護時仍能持續可用&#xff0c;最小化停機時間&#xff08;通常目標為 99.9% 至 99.999% 可用性&#xff09;。以下是 MySQL 領域成熟且廣泛應用的幾種主流高可用方案&…

騰訊云語音接口實現會議系統

1.前言 在現代企業協作環境中&#xff0c;高效的會議管理是提升團隊生產力的關鍵。本文將深入解析一個完整的會議管理系統&#xff0c;涵蓋從會議創建到總結生成的完整生命周期。該系統構建一個基于AI技術的智能會議系統&#xff0c;實現會議全流程的智能化管理&#xff0c;包括…

【LeetCode 每日一題】1277. 統計全為 1 的正方形子矩陣

Problem: 1277. 統計全為 1 的正方形子矩陣 文章目錄整體思路完整代碼時空復雜度時間復雜度&#xff1a;O(m * n)空間復雜度&#xff1a;O(m * n)整體思路 這段代碼旨在解決一個經典的二維矩陣問題&#xff1a;統計全為 1 的正方形子矩陣個數 (Count Square Submatrices with …

【論文閱讀】MedResearcher-R1: 基于知識引導軌跡合成框架的專家級醫學深度研究員

論文鏈接&#xff1a;https://arxiv.org/pdf/2508.14880 【導讀】當通用大模型還在“背題庫”時&#xff0c;螞蟻集團聯合哈工大推出的 MedResearcher-R1 已把“臨床查房”搬進訓練場&#xff01;這篇 2025 年 9 月發布的論文&#xff0c;首次讓開源 32B 模型在醫學深度研究基準…

基于大語言模型的事件響應優化方案探索

程序員的技術管理推薦閱讀 當愿望遇上能力鴻溝&#xff1a;一位技術管理者眼中的團隊激勵思考 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f; 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f…

數字化浪潮下,傳統加工廠如何智能化轉型?

在制造業向高端化、服務化升級的今天&#xff0c;傳統加工廠正面臨前所未有的挑戰。訂單碎片化、人力成本攀升、設備OEE&#xff08;綜合效率&#xff09;長期低于50%、質量波動難以追溯……這些痛點不僅壓縮著企業利潤空間&#xff0c;更讓其在應對市場需求變化時顯得遲緩。當…

謂語動詞選擇指南

文章目錄謂語動詞的重要性謂語動詞類別一. 助動詞1. be&#xff08;am, is, are, was, were, been, being&#xff09;表示 存在、狀態、身份、特征。2. have&#xff08;have, has, had&#xff09;表示 擁有、經歷 或 完成時態的助動詞。3. do&#xff08;do, does, did&…

代碼隨想錄學習摘抄day7(二叉樹11-21)

一個樸實無華的目錄題型226.翻轉二叉樹思路&#xff1a;把每一個節點的左右孩子交換一下101. 對稱二叉樹思路&#xff1a;使用隊列來比較兩個樹&#xff08;根節點的左右子樹&#xff09;是否相互翻轉222.完全二叉樹的節點個數思路&#xff1a;本題直接就是求有多少個節點&…

Python+DRVT 從外部調用 Revit:批量創建樓板

今天繼續批量創建常用的基礎元素&#xff1a;樓板。這次以簡單的輪廓為矩形的樓板為例。讓我們來看一看如何讓Revit自動干活&#xff1a; from typing import List import math # drvt_pybind 支持多會話、多文檔&#xff0c;先從簡單的單會話、單文檔開始 # MyContext是在Pyt…

猿輔導數據分析面試題及參考答案

給定用戶成績表,編寫SQL查詢排名靠前的用戶(例如前10名),并說明rank()和dense_rank()的區別。 要查詢成績表中排名靠前的用戶(如前10名),需先明確排名依據(通常為成績降序),再通過排序和限制結果行數實現。假設用戶成績表名為user_scores,包含user_id(用戶ID)和s…

在樹莓派集群上部署 Distributed Llama (Qwen 3 14B) 詳細指南

項目地址&#xff1a;https://github.com/b4rtaz/distributed-llama 本文檔將指導您如何使用一個樹莓派5作為Root節點和三個樹莓派4作為Worker節點&#xff0c;共同搭建一個4節點的分布式LLM推理集群&#xff0c;并運行10.9GB的Qwen 3 14B模型。 中間要用到github和huggingface…

C++ 容器——unordered_xxx

自 C11 開始&#xff0c;STL 引入了基于 hash table 的 unordered_set、unordered_map 等容器&#xff0c;正如其名它們是無序容器。一定數量&#xff08;據說有測試數據是10000000&#xff09;元素時無序容器的性能要比對應的有序容器優。一、容器數據結構unordered_set、unor…

分布式常見面試題整理

一、分布式理論&#xff1a; CAP理論 分布式系統最多同時滿足一致性&#xff08;C&#xff09;、可用性&#xff08;A&#xff09;、分區容錯性&#xff08;P&#xff09;中的兩個&#xff0c;無法三者兼得。 BASE理論 對CAP中一致性和可用性的權衡&#xff0c;強調基本可用&a…