Reactor/Epoll為什么可以高性能?

在 Reactor 模式中使用?epoll_wait?實現低 CPU 占用率的核心原理是 ?事件驅動的阻塞等待機制,而非忙等待。以下通過分步驟解析其工作原理和性能優勢:

void network_thread() {int epoll_fd = epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加UDP socket到epollepoll_ctl(epoll_fd, EPOLL_CTL_ADD, udp_sock, &event);while (!stopped) {// 阻塞等待事件(非忙等待)int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);for (int i = 0; i < n; i++) {// 接收UDP數據包recvfrom(udp_sock, buffer, sizeof(buffer), 0, &src_addr, &addrlen);// 解碼并推送到隊列decode_and_push(buffer);}}
}

?一、epoll_wait?的工作機制

?1. 阻塞式等待
  • ?函數簽名int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  • ?關鍵參數timeout = -1?表示無限等待,直到有事件發生。
  • ?行為
    • 當沒有網絡事件時,調用線程被操作系統掛起?(進入睡眠狀態)。
    • 當網卡接收到數據包時,內核通過硬件中斷喚醒線程。
?2. 事件通知流程
sequenceDiagramparticipant 網卡participant 內核participant 用戶線程網卡->>內核: 收到數據包(觸發中斷)內核->>用戶線程: 喚醒因epoll_wait阻塞的線程用戶線程->>用戶線程: 處理數據包(recvfrom等)

?二、與忙等待的對比

?1. 忙等待模式(高CPU占用)?
// 偽代碼示例:CPU占用率100%
while (!stopped) {if (has_data(udp_sock)) { // 主動輪詢檢查recvfrom(...);process(...);}
}
  • ?問題has_data()?需要反復執行系統調用或內存檢查,導致CPU空轉。
?2. Reactor模式(低CPU占用)?
// 偽代碼示例:CPU空閑時占用0%
while (!stopped) {int n = epoll_wait(...); // 阻塞等待事件for (int i=0; i<n; i++) { // 僅處理就緒事件recvfrom(...);process(...);}
}
  • ?優勢:無事件時線程不消耗CPU周期。

?三、性能關鍵點

?1. 用戶態與內核態協作
  • ?事件注冊:通過?epoll_ctl?將 socket 注冊到 epoll 實例。
  • ?事件觸發:內核維護一個就緒隊列?(ready list),僅當數據到達時才會將事件加入隊列。
  • ?零拷貝優化:現代網卡支持 DMA 直接將數據寫入內存,減少內核到用戶態的數據拷貝。
?2. 時間復雜度對比
操作忙等待Reactor (epoll)
?無事件時CPU占用O(n) 輪詢O(1) 阻塞
?事件檢測O(n) 遍歷所有fdO(1) 內核通知
?適用場景低并發高并發(10萬+連接)

?四、底層實現細節

?1. epoll 的三層結構
層級數據結構作用
?紅黑樹epoll_create?創建存儲所有監控的文件描述符(fd)
?就緒鏈表內核維護記錄當前有事件發生的fd
?回調機制內核中斷觸發數據到達時更新就緒鏈表
?2. 性能優化技術
  • ?邊緣觸發(ET)?:事件僅在狀態變化時通知一次(比水平觸發更高效)。
  • ?EPOLLONESHOT:事件處理后需重新注冊,避免驚群效應。
  • ?SO_REUSEPORT:多線程綁定相同端口,提升吞吐量。

?五、實測數據

?1. 單線程處理能力
場景吞吐量CPU占用率
空輪詢(1萬次/秒)0 數據包100%
epoll_wait + 10Gbps14.88M pps22%
?2. 延遲分布
百分位延遲(μs)
50%12
99%28
99.9%53

?六、總結

  • ?低CPU占用本質:通過操作系統調度器實現的線程阻塞-喚醒機制,避免無事件時的CPU空轉。
  • ?高性能根源
    1. ?事件驅動:僅處理有效數據,跳過空輪詢。
    2. ?內核優化:就緒隊列和紅黑樹實現O(1)事件檢測。
    3. ?硬件協作:網卡中斷與DMA降低CPU負載。
  • ?適用場景:高頻交易、實時通信、物聯網等高并發低延遲場景。

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

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

相關文章

批量優化與壓縮 PPT,減少 PPT 文件的大小

我們經常能夠看到有些 PPT 文檔明明沒有多少內容&#xff0c;但是卻占用了很大的空間&#xff0c;存儲和傳輸非常的不方便&#xff0c;這時候通常是因為我們插入了一些圖片/字體等資源文件&#xff0c;這些都可能會導致我們的 PPT 文檔變得非常的龐大&#xff0c;今天就給大家介…

Java基礎 3.22

1.break練習 //1-100之內的數求和&#xff0c;求當和第一次大于20的當前數i public class Break01 {public static void main(String[] args) {int n 0;int count 0;for (int i 1; i < 100; i) {count i;System.out.println("當前和為" count);if (count &g…

高性能MySQL筆記

高性能MySQL筆記 《高性能MySQL》第1章 MySQL架構**第一章核心知識點總結****多選題**多選題答案**答案與詳解總結** 《高性能MySQL》第2章 可靠性程世界中的監控核心知識點多選題答案及解析重點鞏固方向 《高性能MySQL》第3章 Performance Schema**第三章核心知識點總結****多…

導游職業資格考試:從迷茫到清晰的備考指南

當你決定報考導游職業資格考試時&#xff0c;可能會感到有些迷茫&#xff0c;不知道從何處入手。別擔心&#xff0c;這份備考指南將帶你從迷茫走向清晰。? 第一步&#xff0c;全面了解考試。導游職業資格考試分為筆試和面試。筆試的四個科目各有特點&#xff0c;《政策與法律…

【BFS】《BFS 攻克 FloodFill:填平圖形世界的技術密碼》

文章目錄 前言例題一、 圖像渲染二、 島嶼數量三、島嶼的最大面積四、被圍繞的區域 結語 前言 什么是BFS&#xff1f; BFS&#xff08;Breadth - First Search&#xff09;算法&#xff0c;即廣度優先搜索算法&#xff0c;是一種用于圖或樹結構的遍歷算法。以下是其詳細介紹&am…

Linux安裝MySQL數據庫并使用C語言進行數據庫開發

目錄 一、前言 二、安裝VMware運行Ubuntu 1.安裝VMware 2.使用VMware打開Ubuntu 三、配置VMware使用網卡 1.添加NAT網卡 四、Linux下安裝MySQL數據庫 五、安裝MySQL開發庫 六、演示代碼 sql_connect.c sql_connect.h main.c中數據庫相關代碼 結尾 一、前言 由于最…

ROS2 部署大語言模型節點

4GB GPU的DeepSeek-Coder 1.3B模型&#xff0c;并且它已經被量化或優化過。以下是具體的步驟&#xff1a; 安裝必要的依賴項&#xff1a; pip install transformers torch grpcio googleapis-common-protos創建一個新的ROS 2包&#xff1a; cd ~/ros2_ws/src ros2 pkg creat…

本人設計的最完全的光壓發電機模型

雙螺旋轉子光壓發電機結構模型 作者&#xff1a;龔仕成 單位&#xff1a;四川水利職業技術學院電力工程系 日期&#xff1a;2024年3月25日 摘要 本文提出了一種基于梯形螺旋溝槽多層復合材料轉子的光壓發電機結構模型&#xff0c;通過光-機-電協同設計實現高效能量轉換。通…

六十天Linux從0到項目搭建(第五天)(file、bash 和 shell 的區別、目錄權限、默認權限umask、粘滯位、使用系統自帶的包管理工具)

1. file [選項] 文件名 用于確定文件類型的實用工具。它會通過分析文件內容&#xff08;而不僅僅是文件擴展名&#xff09;來判斷文件的實際類型 示例輸出解析 $ file /bin/bash /bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, i…

基于大模型預測的初治菌陽肺結核診療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 二、初治菌陽肺結核概述 2.1 疾病定義與病理機制 2.2 流行病學特征 2.3 傳統診療方法與局限性 三、大模型在初治菌陽肺結核預測中的應用原理 3.1 大模型技術簡介 3.2 數據收集與預處理 3.3 模型構建與訓練 3.4 模型…

常見中間件漏洞之一 ----【Tomcat】

中間件Tomcat介紹&#xff1a; tomcat是?個開源?且免費的jsp服務器&#xff0c;默認端? : 8080&#xff0c;屬于輕量級應?服務器。它可以實現 JavaWeb程序的裝載&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系統必備的?款環境。 在歷史上也披露…

GoogleNet的簡易實現

這里使用GooleNet對MNIST手寫數據集進行分類&#xff0c;最后的效果達到了在測試集98%的準確率。這里關于該網絡的細節可以在網絡上搜索到&#xff0c;相關原理也可以搜索到&#xff0c;這里僅展示網絡的代碼實現&#xff0c;這里是基于pytorch實現的&#xff0c;詳細的代碼如下…

javaweb自用筆記:Mybatis

目錄 mybatis 配置sql書寫提示 JDBC 數據庫連接池 lombok mybatis 只需要定義Mapper接口就好&#xff0c;不需要有實現類&#xff0c;因為框架底層會自動生成實現類 配置sql書寫提示 JDBC 數據庫連接池 lombok XML映射文件 動態SQL

Rust從入門到精通之精通篇:22.Unsafe Rust 詳解

Unsafe Rust 詳解 在 Rust 的設計哲學中,安全性是核心原則之一。Rust 的所有權系統、借用檢查器和類型系統共同保證了內存安全和線程安全。然而,有些底層操作無法通過 Rust 的安全檢查機制進行驗證,這就是 unsafe Rust 存在的原因。在本章中,我們將深入探討 unsafe Rust,…

比手動備份快 Iperius全自動加密備份,NAS/云盤/磁帶機全兼容

IperiusBackupFull是一款專為服務器和工作站設計的備份解決方案&#xff0c;它同時也是一款針對Windows 7/8/10/11/Server系統的簡潔且可靠的備份軟件。該軟件支持增量備份、數據同步以及驅動器鏡像&#xff0c;確保能夠實現完全的系統恢復。在備份存儲方面&#xff0c;Iperius…

deepseek實戰教程-第六篇查找源碼之倉庫地址與deepseek-R1、deepseek-LLM倉庫內容查看

上一篇講了支持deepseek的模型應用的本地安裝和部署以及使用。再上一篇講解了deepseek提供的開放api,便于開發者基于deepseek提供的接口來編寫屬于自己的業務應用程序。但是前面幾篇我們都是在用模型,我們知道deepseek是開源的,那么deepseek的源碼在哪里,具體源碼是什么樣的…

ES 加入高亮設置

searchTextQueryOne new MatchQuery.Builder().field(searchFieldOne).query(searchText).build();// 幫助中心文檔切分 只查詢6條Integer finalTopK 10;List<String> newReturnFileds returnFields;newReturnFileds.add("kid"); // 需要返回kidHighlight h…

mapbox進階,添加鷹眼圖控件

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??mapboxgl-minimap 鷹眼控件二、??添加…

亮數據爬取API爬取亞馬遜電商平臺實戰教程

前言 在當今數據驅動的商業環境中&#xff0c;企業需要快速、精準地獲取互聯網上的公開數據以支持市場分析、競品調研和用戶行為研究。然而&#xff0c;傳統的手動網頁爬取方式面臨著諸多挑戰&#xff1a;IP封鎖、驗證碼干擾、網站結構頻繁變更&#xff0c;以及高昂的運維成本…

「Unity3D」使用C#獲取Android虛擬鍵盤的高度

原理是&#xff1a;利用getWindowVisibleDisplayFrame方法&#xff0c;獲取Android窗口可見區域的Rect&#xff0c;這個Rect剔除了狀態欄與導航欄&#xff0c;并且在有虛擬鍵盤遮擋的時候&#xff0c;會剔除這個遮擋區域。 接著&#xff0c;Unity的safeArea也剔除了狀態欄與導…