当前位置: 首页 > article >正文

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负载。
  • 适用场景:高频交易、实时通信、物联网等高并发低延迟场景。

相关文章:

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

在 Reactor 模式中使用 epoll_wait 实现低 CPU 占用率的核心原理是 ​事件驱动的阻塞等待机制&#xff0c;而非忙等待。以下通过分步骤解析其工作原理和性能优势&#xff1a; void network_thread() {int epoll_fd epoll_create1(0);epoll_event events[MAX_EVENTS];// 添加U…...

-JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期

#JavaEE-HTTP-Servlet& 路由 & 周期 参考&#xff1a; https://blog.csdn.net/qq_52173163/article/details/121110753 1 、解释 Servlet 是运行在 Web 服务器或应用服务器上的程序 , 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数…...

在本地Windows机器加载大模型并生成内容

本篇演示在本地机器下载和加载大模型并获取AI产生的内容。简单起见&#xff0c;使用的大模型是Qwen2.5-0.5B-Instruct&#xff0c;整个模型的所有文件不到1G。 Qwen2.5-0.5B-Instruct 是阿里巴巴云 QWen 团队基于 Transformer 架构开发的轻量级指令调优语言模型&#xff0c;专…...

热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

找树左下角的值 本题递归偏难&#xff0c;反而迭代简单属于模板题&#xff0c; 两种方法掌握一下 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 我们来分析一下题目&#…...

shopify跨境电商行业前景与规模

Shopify跨境电商行业前景与规模分析 一、行业背景 Shopify 是一个全球知名的电子商务平台&#xff0c;它为小型企业到大型企业提供了创建和管理在线商店的工具。近年来&#xff0c;随着全球化进程的加快以及互联网技术的发展&#xff0c;跨境电商已经成为国际贸易的重要组成部…...

【计算机网络】-计算机网络期末复习题复习资料

一、计算机网络体系结构&#xff08;800字&#xff09; 1. OSI参考模型 七层结构&#xff1a;物理层→数据链路层→网络层→传输层→会话层→表示层→应用层 各层核心功能&#xff1a; 物理层&#xff1a;比特流传输&#xff08;如RJ45、光纤接口&#xff09; 数据链路层&…...

游戏中的碰撞检测算法

参考博客Sort, sweep, and prune: Collision detection algorithms...

批归一化(Batch Normalization)与层归一化(Layer Normalization)的区别与联系

文章目录 一、Batch normalization 理论与应用1. 理论解释2. 数值例子 二、Layer normalization 理论与应用1. 理论解释2. 数值例子 三、Layer Normalization 和 Batch Normalization 的区别四、《Transformers without Normalization》笔记 一、Batch normalization 理论与应用…...

12届蓝桥杯—货物摆放

货物摆放 题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有 nn 箱货物要摆放在仓库&#xff0c;每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向&#xff0c;每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…...

c++进阶--哈希表的实现

大家好&#xff0c;今天我们来学习ubordered_set和unordered_map的底层哈希表。 目录 哈希表实现 1. 哈希概念 1.1 直接定址法 1.2 哈希冲突 1.3 负载因⼦ 1.4 将关键字转为整数 1.5 哈希函数 下面我们介绍几种哈希函数&#xff1a;1.5.1 除法散列法/除留余数法 1.…...

颠覆传统:SaaS 品牌如何通过 SEO 策略引爆市场!

SaaS 商业模式提供了令人难以置信的可扩展性和盈利能力——但前提是与正确的营销增长策略相结合。 SaaS 品牌知道&#xff0c;托管基于云的应用程序的成本会随着用户量的增加而降低&#xff0c;因此必须专注于订阅者的快速增长&#xff0c;以保持竞争力并降低成本。 许多 CMO…...

【数据库发展史】

数据库的发展历史可以追溯到20世纪50年代&#xff0c;随着计算机技术的进步和数据管理需求的演变&#xff0c;数据库系统经历了多个阶段的变革。以下是数据库技术的主要发展阶段&#xff1a; 1. 前数据库时代&#xff08;1950年代前&#xff09; 手工管理&#xff1a;数据通过…...

HTTP 核心知识点整理

1. HTTP 基础 ​定义&#xff1a;HTTP&#xff08;HyperText Transfer Protocol&#xff09;是应用层协议&#xff0c;基于 ​请求-响应模型&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信。​特点&#xff1a; ​无状态&#xff1a;每次请求独立&a…...

从AEC-Q100看车规芯片的可靠性设计要点

引言 随着汽车电子化、智能化的飞速发展&#xff0c;汽车电子控制系统对芯片的可靠性提出了极为严苛的要求。AEC-Q100是汽车电子委员会&#xff08;Automotive Electronics Council&#xff09;制定的车规级芯片可靠性标准&#xff0c;旨在确保芯片能够在复杂多变的汽车环境中…...

陕西安全员A证考试的报名流程是什么?

陕西安全员 A 证考试报名流程如下&#xff1a; 进入报名系统&#xff1a;登录陕西省建筑工程施工企业安全管理人员及特种作业人员考试报名系统。首次使用需点击 “特种作业人员注册”&#xff0c;进入个人注册界面。注册账号&#xff1a;输入身份证号、登录密码&#xff0c;并…...

特殊行车记录仪DAT视频丢失的恢复方法

行车记录仪是一种常见的车载记录仪&#xff0c;和常见的“小巧玲珑”的行车记录仪不同&#xff0c;一些特种车辆使用的记录仪的外观可以用“笨重”来形容。下边我们来看看特种车载行车记录仪删除文件后的恢复方法。 故障存储: 120GB存储设备/文件系统:exFAT /簇大小:128KB 故…...

PAT乙级1007

常规解法 #include <iostream> using namespace std;// 判断一个数是否为素数的函数 bool isprime(int a) {// 遍历 2 到 sqrt(a) 之间的数&#xff0c;判断 a 是否能被它们整除for (int i 2; i * i < a; i) {if (a % i 0) // 如果能整除&#xff0c;说明 a 不是素…...

数据库中不存在该字段

mybatisplus 定义的类中某些字段是数据库里面没有的&#xff0c;我们可用tablefield(existfalse)来注解&#xff0c;演示如下&#xff1a;...

吾爱出品,文件分类助手,高效管理您的 PC 资源库

在日常使用电脑的过程中&#xff0c;文件杂乱无章常常让人感到困扰。无论是桌面堆积如山的快捷方式&#xff0c;还是硬盘中混乱的音频、视频、文档等资源&#xff0c;都急需一种高效的整理方法。文件分类助手应运而生&#xff0c;它是一款文件管理工具&#xff0c;能够快速、智…...

关于瑞芯微开发工具(RKDevTool)刷机下载Boot失败原因的研究

昨天发了文章《网心云OEC/OEC-turbo刷机问题——刷机教程、救砖方法、技术要点及下载boot失败异常解决尝试》&#xff0c;其中有关于刷机各种问题的一些解决方法。 网心云OEC/OEC-turbo刷机问题——刷机教程、救砖方法、技术要点及下载boot失败异常解决尝试-CSDN博客文章浏览阅…...

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程)

web爬虫笔记:js逆向案例十一 某数cookie(补环境流程) 一、获取网页数据请求流程 二、目标网址、cookie生成(逐步分析) 1、目标网址:aHR0cHM6Ly9zdWdoLnN6dS5lZHUuY24vSHRtbC9OZXdzL0NvbHVtbnMvNy9JbmRleC5odG1s 2、快速定位入口方法 1、通过脚本监听、hook_cookie等操作可…...

浅谈 Vue3 中的设计模式

设计模式是软件开发中的一种最佳实践&#xff0c;它提供了解决特定问题的通用解决方案。通过合理运用设计模式&#xff0c;可以提高代码的可维护性、可扩展性和可读性。在 Vue3 的源码中&#xff0c;设计模式被广泛应用于各个模块中&#xff0c;充分体现了其在现代前端框架中的…...

Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战

Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战 引言 在分布式系统和本地服务通信中&#xff0c;进程间通信&#xff08;IPC&#xff09;与远程过程调用&#xff08;RPC&#xff09;是核心能力。本文将深入剖析 Unix Domain Socket&#xff08;UDS&#xff09;、IPC、RP…...

07_JavaScript函数作用域_递归

目录 一、作用域&#xff08;重点&#xff09; 二、变量的使用规则 &#xff08;重点&#xff09; 2.1 访问规则 2.2 赋值规则 三、递归函数 &#xff08;难点&#xff09; 了解 四、对象 4.1 对象的创建 一、作用域&#xff08;重点&#xff09; 什么是作用域 ? 作用…...

.gitignore使用指南

.gitignore使用指南 目录 什么是.gitignore为什么需要.gitignore如何创建.gitignore文件.gitignore文件的语法规则 忽略单个文件忽略目录忽略特定类型的文件不忽略特定文件或目录递归匹配 示例.gitignore文件注意事项更多特殊场景匹配规则 忽略多个特定后缀的文件忽略特定目录…...

Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)

1 主要目的 在Excel中&#xff0c;经常会遇到需要制作多级联动下拉菜单的情况&#xff0c;要求单元格内填写的内容只能从指定的多个选项中进行选择&#xff0c;并且需要设置多级目录&#xff0c;其中下级目录的选项内容要根据上级目录的填写内容确定&#xff0c;如下图所示&am…...

深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构

深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构 1. 引言 Spring Framework 是 Java 领域最流行的企业级开发框架之一&#xff0c;广泛用于 Web 开发、微服务架构、数据访问等场景。本文将深入解析 Spring Framework 5.1.8.RELEASE 的源码目录结构&#xff0c;帮助开…...

excalidraw画图工具——背景画布有无格子设置

服啦找了大半天&#xff0c;愣是没找到 toggle grid &#xff1a; 切换格子… Excalidraw的背景格子 只要右键&#xff0c;将这个勾取消就好了&#xff1f;...

计算机组成原理———I\O系统精讲<1>

本篇文章主要介绍输入输出系统的发展概况 一.输入输出系统的发展概况 1.早期阶段 该阶段的特点是I/O设备与主存交换信息都必须通过CPU 当时的I/O设备有如下几个特点&#xff1a; &#xff08;1&#xff09;每个I\O设备都必须配有一套独立的逻辑电路与CPU相连&#xff0c;用来…...

[数据结构] 动态顺序表应用

可扩容顺序表顺序表 SeqList.hSeqList.cTest.c 动态顺序表能够根据数据存储的需要动态地管理内存空间。 SeqList.h #include<stdio.h> #include<stdlib.h>//静态顺序表 //小了不够用&#xff0c;多了浪费 //#define N 10 //typedef int SLDatatype; //struct SeqL…...