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.mzph.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也剔除了状态栏与导…