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

epoll

epoll 是 Linux 下的「高性能 IO 多路复用器」专门用来同时监听大量文件描述符socket、管道、设备等的读写事件不阻塞、CPU 占用极低。一、为什么要用 epoll传统的select/poll有致命缺陷监听上限低select 最多 1024 个每次都要遍历所有描述符连接多了极慢内核到用户空间数据拷贝频繁总结select/poll每次全量遍历、全量拷贝、效率低、有上限 → 高并发不行epoll内核事件驱动、只返回活跃连接、无上限 → 高并发神器缺陷2解释缺陷 1每次都要把整个 fd 集合从用户空间拷贝到内核你监听 1000 个 socket每次调用 select/poll都要把这 1000 个 fd 发给内核内核遍历一遍再把结果拷贝回来高并发下拷贝 遍历非常浪费 CPU。epoll 不需要拷贝内核里自己维护一个监听列表你只需要增删改不用每次全量重发。缺陷 2每次都要遍历所有 fd不管有没有事件比如你监听 10000 个连接只有 1 个 socket 有数据select/poll 仍然要把 10000 个全部扫描一遍连接越多越慢O (n) 复杂度。epoll 只返回有事件的 fd不用遍历O (1) 复杂度。缺陷 3select 有硬上限 1024源码里有个宏c运行#define __FD_SETSIZE 1024意味着一个 select 最多监听 1024 个 socket。想改就要重新编译内核非常麻烦。poll 没有上限但效率问题依然存在。epoll 无硬上限。缺陷 4无法告诉用户 “具体哪个 fd 就绪”select/poll 返回后你不知道谁就绪只能从头到尾循环检查一遍非常蠢。epoll 直接返回一个数组里面只有就绪的 fdselect /poll/epoll 核心对比图epoll 完美解决无上限监听只返回有事件的描述符不用遍历内核与用户空间共享内存零拷贝支持水平触发 LT边缘触发 ETLT 水平触发只要缓冲区还有数据就一直提醒你ET 边缘触发只有数据 “刚到来那一刻” 提醒你一次安卓源码里用哪个几乎全用 ET边缘触发比如InputReader 触摸事件Looper 消息循环Binder 线程网络框架原因减少唤醒次数 → 更少 CPU → 更流畅二、epoll 3 个核心 API1.epoll_create1()创建一个 epoll 实例返回epoll 文件描述符// 头文件 #include sys/epoll.h // 创建 epoll 实例Android 源码标准用法 int epoll_fd epoll_create1(EPOLL_CLOEXEC); // EPOLL_CLOEXEC进程 fork 后自动关闭这个 fd防止泄露2.epoll_ctl()增 / 删 / 改epoll 监听的文件描述符核心操作int epoll_ctl( int epfd, // epoll 实例 fd int op, // 操作类型ADD(添加)、DEL(删除)、MOD(修改) int target_fd, // 要监听的目标 fdsocket/管道等 struct epoll_event *event // 要监听什么事件 );操作类型EPOLL_CTL_ADD添加监听EPOLL_CTL_DEL删除监听EPOLL_CTL_MOD修改监听事件监听事件常用EPOLLIN目标 fd有数据可读EPOLLOUT目标 fd可以写数据EPOLLERR发生错误EPOLLET边缘触发高性能模式3.epoll_wait()阻塞等待事件发生返回有事件的 fd 列表三、数据结构struct epoll_eventepoll 用它来描述「要监听什么事件 关联数据」typedef union epoll_data { void *ptr; int fd; // 最常用存目标文件描述符 uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; // 要监听的事件EPOLLIN等 epoll_data_t data; // 用户数据一般存目标fd };四、完整可运行代码这是Android 源码中标准的 epoll 用法模板#include stdio.h #include stdlib.h #include sys/epoll.h #include unistd.h #include fcntl.h #include string.h // 最大同时处理事件数 #define MAX_EVENTS 10 int main() { // // 步骤1创建 epoll 实例 // // EPOLL_CLOEXEC子进程不继承防止fd泄露Android 强制要求 int epoll_fd epoll_create1(EPOLL_CLOEXEC); if (epoll_fd -1) { perror(epoll_create1 失败); exit(1); } printf(epoll 实例创建成功fd %d\n, epoll_fd); // // 步骤2创建一个测试用管道模拟要监听的IO // int pipe_fd[2]; if (pipe(pipe_fd) -1) { perror(pipe 创建失败); exit(1); } int read_fd pipe_fd[0]; // 读端 int write_fd pipe_fd[1]; // 写端 // // 步骤3配置要监听的事件 // struct epoll_event event; memset(event, 0, sizeof(event)); // 监听可读事件 边缘触发ETAndroid 高性能首选 event.events EPOLLIN | EPOLLET; // 把要监听的 fd 存进去epoll_wait 会返回给我们 event.data.fd read_fd; // // 步骤4将目标fd添加到epoll监听列表 // if (epoll_ctl( epoll_fd, // epoll 实例 EPOLL_CTL_ADD, // 操作添加监听 read_fd, // 要监听的fd event // 监听事件配置 ) -1) { perror(epoll_ctl 添加失败); close(epoll_fd); exit(1); } printf(成功添加 fd %d 到 epoll 监听\n, read_fd); // // 步骤5往管道写点数据触发可读事件 // const char *test_data hello epoll!; write(write_fd, test_data, strlen(test_data)); // // 步骤6循环等待事件Android 源码主循环逻辑 // struct epoll_event events[MAX_EVENTS]; // 存放触发的事件 while (1) { printf(\n等待事件中...\n); // 阻塞等待事件-1永久等待 int n epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (n -1) { perror(epoll_wait 失败); break; } // 遍历所有触发的事件只遍历有事件的极快 for (int i 0; i n; i) { int trigger_fd events[i].data.fd; // 拿到触发的fd uint32_t trigger_events events[i].events; // 触发的事件类型 // 判断是不是可读事件 if (trigger_events EPOLLIN) { printf(触发事件fd %d 有数据可读\n, trigger_fd); // 读取数据 char buf[1024]; ssize_t len read(trigger_fd, buf, sizeof(buf)-1); if (len 0) { buf[len] \0; printf(读取到数据%s\n, buf); } } } } // 关闭资源 close(read_fd); close(write_fd); close(epoll_fd); return 0; }五、Android 源码里真实的 epoll 用法1. Android Input 系统触摸 / 按键1. Android Input 系统触摸 / 按键源码路径frameworks/native/services/inputflinger/InputReader.cpp// 简化版源码 void InputReader::loopOnce() { // 用 epoll 监听所有输入设备触摸屏、按键 int eventCount epoll_wait(mEpollFd, mPendingEvents, MAX_EVENTS, -1); for (int i 0; i eventCount; i) { int fd mPendingEvents[i].data.fd; // 读取触摸/按键事件 InputDevice* device getDeviceByFd(fd); device-process(); } }2. Android init 进程系统启动核心源码路径system/core/init/epoll.cpp// init 进程用 epoll 监听所有子进程、设备、socket int Epoll::RegisterHandler(int fd, Handler* handler, uint32_t events) { epoll_event ev {}; ev.events events; ev.data.ptr handler; return epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, fd, ev); }六、2 种触发模式面试 源码必问1. 水平触发 LT默认只要 fd 有数据一直触发简单、不容易丢数据适合新手2. 边缘触发 ETAndroid 源码首选只有状态变化时才触发一次比如从无数据 → 有数据必须一次性读完所有数据性能极高Android 系统全用这个七、epoll 核心流程总结epoll_create1→ 创建 epoll 实例配置epoll_event→ 监听什么事件epoll_ctl(ADD)→ 把 fd 加入监听epoll_wait→ 阻塞等事件遍历返回的事件 → 处理读写epoll_ctl(DEL)→ 不需要时删除监听关闭 fd → 释放资源总结epoll 是 Android/Linux 高性能 IO 监听核心只靠 3 个 APIcreate1→ctl→waitAndroid 源码全用边缘触发 (ET)只处理有事件的 fd不浪费性能

相关文章:

epoll

epoll 是 Linux 下的「高性能 IO 多路复用器」,专门用来同时监听大量文件描述符(socket、管道、设备等)的读写事件,不阻塞、CPU 占用极低。 一、为什么要用 epoll? 传统的 select/poll 有致命缺陷: 监听…...

c语言之strok实现字符串分割

int main() {char* str_print = NULL;{char test1[] =...

DebToIPA终极指南:在iOS设备上实现.deb到.ipa的无缝格式转换

DebToIPA终极指南:在iOS设备上实现.deb到.ipa的无缝格式转换 【免费下载链接】DebToIPA Convert .deb apps to .ipa files, on iOS, locally 项目地址: https://gitcode.com/gh_mirrors/de/DebToIPA DebToIPA是一款革命性的iOS应用格式转换工具,让…...

Win11Debloat系统优化工具:让Windows 11回归高效本质的专业指南

Win11Debloat系统优化工具:让Windows 11回归高效本质的专业指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutt…...

解密900万图像:Open Images数据集在计算机视觉领域的革命性应用

解密900万图像:Open Images数据集在计算机视觉领域的革命性应用 【免费下载链接】dataset The Open Images dataset 项目地址: https://gitcode.com/gh_mirrors/dat/dataset 当计算机视觉研究者面临数据稀缺困境时,Open Images数据集如同一座数字…...

BiliTools AI视频总结:告别信息焦虑的终极学习助手

BiliTools AI视频总结:告别信息焦虑的终极学习助手 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 你是…...

3步解锁PS3蓝牙控制器:Windows无线游戏体验全面革新

3步解锁PS3蓝牙控制器:Windows无线游戏体验全面革新 【免费下载链接】BthPS3 Windows kernel-mode Bluetooth Profile & Filter Drivers for PS3 peripherals 项目地址: https://gitcode.com/gh_mirrors/bt/BthPS3 还在为PS3手柄在Windows上无法稳定连接…...

网络自动重连工具:告别频繁断网烦恼的终极解决方案

网络自动重连工具:告别频繁断网烦恼的终极解决方案 【免费下载链接】BIT-srun-login-script 北京理工大学深澜校园网登录脚本,以实现命令行登录或者断线重连等,仅提供登录功能 项目地址: https://gitcode.com/gh_mirrors/bi/BIT-srun-login…...

3步掌握网络资源嗅探:从视频号到直播流的全方位下载方案

3步掌握网络资源嗅探:从视频号到直播流的全方位下载方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在为无…...

OpenClaw隐私计算:千问3.5-27B本地处理敏感数据对比云端方案

OpenClaw隐私计算:千问3.5-27B本地处理敏感数据对比云端方案 1. 为什么医疗数据需要本地化处理 去年参与某医疗科研项目时,团队需要分析3万份患者电子病历。当我们将数据上传到某商业AI平台后,合规部门紧急叫停——即便已做脱敏处理&#x…...

2025 图形(蓝桥杯十六届C组程序题 C 题)

样例输入&#xff1a;4 5样例输出&#xff1a;20252025202520252025代码如下&#xff1a;#include <stdio.h> #include <string.h>void draw2025(int i,int w) {const char base[] "2025";int baselen strlen(base);for(int j 0;j < w;j){printf(&…...

Ryujinx核心功能全解析:在电脑上流畅体验Switch游戏的完整方案

Ryujinx核心功能全解析&#xff1a;在电脑上流畅体验Switch游戏的完整方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 作为一款用C#编写的实验性Nintendo Switch模拟器&#xff0c…...

小红书视频下载神器:三步搞定无水印批量下载,新手也能轻松上手

小红书视频下载神器&#xff1a;三步搞定无水印批量下载&#xff0c;新手也能轻松上手 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果…...

紧急!PHP网关CPU飙升至98%却无堆栈痕迹?锁定glibc malloc arena争用导致的工业级假死现象(现场抓取core dump实录)

第一章&#xff1a;紧急&#xff01;PHP网关CPU飙升至98%却无堆栈痕迹&#xff1f;锁定glibc malloc arena争用导致的工业级假死现象&#xff08;现场抓取core dump实录&#xff09;凌晨三点&#xff0c;某支付网关集群中多台PHP-FPM worker进程CPU持续飙至98%&#xff0c;但 g…...

Win11Debloat:轻量高效的Windows系统优化开源工具

Win11Debloat&#xff1a;轻量高效的Windows系统优化开源工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and custom…...

Snap.Hutao:Windows平台开源原神工具箱完整使用指南

Snap.Hutao&#xff1a;Windows平台开源原神工具箱完整使用指南 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao…...

[具身智能-306]:Token详解

Token&#xff08;中文定名为“词元”&#xff09;是人工智能时代&#xff0c;特别是大语言模型&#xff08;LLM&#xff09;中最核心的概念之一。它不仅是模型处理信息的最小单位&#xff0c;更是连接算力、数据与商业价值的“通用货币”。为了让你透彻理解 Token&#xff0c;…...

突破1k !具身智能中文教程项目火了

Datawhale干货 作者&#xff1a;李昀迪&#xff0c;every-embodied团队学完具身导航基础课&#xff0c;还是一头雾水不会动手实践&#xff1f;复现顶会代码&#xff0c;被复杂逻辑绕晕&#xff0c;摸不清算法流程&#xff1f;环境配置地狱、数据集超大、下载繁琐&#xff0c;想…...

Spring Boot 4.0首个RC2版本泄露文档流出(含Agent沙箱隔离机制与LLM可观测性插件API草案)

第一章&#xff1a;Spring Boot 4.0 Agent-Ready 架构全景概览Spring Boot 4.0 标志着 JVM 应用可观测性与运行时增强能力的重大演进。其核心设计目标是原生支持 Java Agent 的深度集成&#xff0c;无需修改业务代码即可实现字节码增强、指标采集、分布式追踪注入与实时诊断等功…...

3个维度解析开源工具Sketch Measure:设计规范自动化实践指南

3个维度解析开源工具Sketch Measure&#xff1a;设计规范自动化实践指南 【免费下载链接】sketch-measure Make it a fun to create spec for developers and teammates 项目地址: https://gitcode.com/gh_mirrors/sk/sketch-measure 副标题&#xff1a;如何通过Sketch …...

3步激活旧iOS设备:Legacy iOS Kit让经典设备重获新生

3步激活旧iOS设备&#xff1a;Legacy iOS Kit让经典设备重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 当…...

30分钟上手开源项目:黑苹果安装实战指南(新手到高手的进阶之路)

30分钟上手开源项目&#xff1a;黑苹果安装实战指南&#xff08;新手到高手的进阶之路&#xff09; 【免费下载链接】Hackintosh 国光的黑苹果安装教程&#xff1a;手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 如何在普通PC上体验…...

收藏!小白程序员必学:RAG轻松玩转大模型,告别幻觉知识库问答不再难!

本文详细介绍了RAG&#xff08;检索增强生成&#xff09;技术的核心定义与价值&#xff0c;它通过结合大语言模型与信息检索技术&#xff0c;有效解决大模型“幻觉”、知识过时、专属知识库无法接入等问题。文章拆解了RAG的全流程&#xff0c;包括数据预处理&#xff08;分片、…...

3步驯服性能野兽:Turbo Boost Switcher让系统稳定性提升40%

3步驯服性能野兽&#xff1a;Turbo Boost Switcher让系统稳定性提升40% 【免费下载链接】Turbo-Boost-Switcher Turbo Boost disabler / enable app for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/tu/Turbo-Boost-Switcher 问题溯源&#xff1a;解码Mac性能波…...

Win11Debloat终极指南:5分钟让你的Windows系统飞起来!

Win11Debloat终极指南&#xff1a;5分钟让你的Windows系统飞起来&#xff01; 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declu…...

不做产品,只做 Token 中转——卖 Token 到底怎么赚钱

&#x1f4a1; 本文是「小龙虾搞钱指南」系列第 4 篇。前两篇拆了 Polymarket 交易 Bot 和 Skill 经济变现 以及用 ai 实现股票快速跟踪&#xff0c;这篇聊一个更底层的生意——帮别人调 AI 的"中间商"&#xff0c;是怎么赚到钱的。有个平台叫 OpenRouter。它不需要花…...

Axure全界面本地化实战指南:从语言障碍到高效协作的解决方案

Axure全界面本地化实战指南&#xff1a;从语言障碍到高效协作的解决方案 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 定位本地…...

3步解决Windows系统臃肿问题,让电脑性能提升60%

3步解决Windows系统臃肿问题&#xff0c;让电脑性能提升60% 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and customiz…...

Python实战:四种图像平滑技术对比与代码实现

1. 图像平滑技术入门指南 第一次接触图像处理时&#xff0c;我被"椒盐噪声"这个词逗笑了 - 想象一下炒菜时不小心把盐和胡椒撒在照片上的场景。实际上&#xff0c;这种黑白杂点的专业术语就叫椒盐噪声&#xff0c;是图像处理中最常见的干扰类型之一。作为计算机视觉的…...

Honey Select 2终极增强指南:200+插件整合补丁一键优化游戏体验

Honey Select 2终极增强指南&#xff1a;200插件整合补丁一键优化游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》游戏体验不…...