0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度解读epoll 的原理

Linux爱好者 来源:Linux内核那些事 作者:Linux内核那些事 2021-06-04 16:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

epoll 可以说是编写高性能服务端程序必不可少的技术,在介绍 epoll 之前,我们先来了解一下 多路复用I/O 吧。

多路复用I/O多路复用I/O:是指内核负责监听多个 I/O 流,当任何一个 I/O 流处于就绪状态(可读或可写)时都会通知进程,以便可以处理该 I/O 流上的数据。如 图1 所示:

b158838e-c482-11eb-9e57-12bb97331649.png

如 图1 所示,内核负责监听多个 I/O 流,当某些 I/O 流变为就绪状态,内核会把这些 I/O 流添加到就绪队列中,然后通知进程处理就绪队列中的 I/O 流。

与传统的阻塞型 I/O 相比,多路复用 I/O 的优点是可以同时监听多个 I/O 流,并且会把就绪的 I/O 流告知进程。

epoll原理介绍完多路复用 I/O,接下来开始介绍我们的主角:epoll。

Linux 系统中,有多种多路复用 I/O 的实现,比如 select 和 poll 等。而 epoll 也是多路复用 I/O 一种实现,与 select 和 poll 相比,epoll 在性能上有较大的提升。

红黑树

epoll 内部使用红黑树来保存所有监听的 socket,红黑树是一种平衡二叉树,添加和查找元素的时间复杂度为 O(log n),其结构如 图2 所示:

b1689602-c482-11eb-9e57-12bb97331649.png

epoll 通过 socket 句柄来作为 key,把 socket 保存在红黑树中。如 图2 所示,每个节点中的数字代表着 socket 句柄。

把监听的 socket 保存在红黑树中的目的是,为了在修改监听 socket 的读写事件时,能够通过 socket 句柄快速找到对应的 socket 对象。

就绪队列

另外,epoll 还维护着一个就绪队列,当 epoll 监听的 socket 状态发生改变(变为可读或可写)时,就会把就绪的 socket 添加到就绪队列中。如 图3 所示:

b172e3e6-c482-11eb-9e57-12bb97331649.png

当 socket 从网络中获取到数据后,会发生通知给 epoll,epoll 会将当前 socket 添加到就绪队列中,并且唤醒等待中的进程(也就是调用 epoll_wait 的进程)。

当 socket 状态发生变化时,会调用 ep_poll_callback 函数来通知 epoll,我们来看看这个函数的处理过程:

static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *key){ 。。. struct epitem *epi = ep_item_from_wait(wait); struct eventpoll *ep = epi-》ep; 。。. // 1) 把 socket 添加到就绪队列中 list_add_tail(&epi-》rdllink, &ep-》rdllist);

is_linked: // 2) 唤醒调用 epoll_wait() 而被阻塞的进程 if (waitqueue_active(&ep-》wq)) wake_up_locked(&ep-》wq); 。。. return 1;}

ep_poll_callback 函数的意图很清晰,主要完成两个工作:

把就绪的 socket 添加到就绪队列中。

唤醒调用 epoll_wait 函数而被阻塞的进程。

当进程被唤醒后,就会从就绪队列中,把就绪的 socket 复制到用户提供的数组中。如 图4 所示:

b17fa086-c482-11eb-9e57-12bb97331649.png

如 图4 所示,在调用 epoll_wait 时需要提供一个 events 数组来存储就绪的 socket。当 epoll_wait 返回后,用户就可以从events 数组中获取到就绪的 socket,并可对其进行读写操作。

总结本文主要通过图解的方式大概介绍了 epoll 的原理,但很多实现的细节只能通过阅读源码来了解。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7315

    浏览量

    93992
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66851
  • epoll
    +关注

    关注

    0

    文章

    28

    浏览量

    3277

原文标题:图解:epoll怎么实现的

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    HarmonyOSAI编程智能代码解读

    CodeGenie > Explain Code,开始解读当前代码内容。 说明 最多支持解读20000字符以内的代码片段。 使用该功能需先完成CodeGenie登录授权。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-02 16:29

    AI SoC #BK7258 AI能力和技术参数深度解读

    BK7258芯片AI能力深度解读 BK7258是博通集成推出的一款高集成度Wi-Fi 6+蓝牙5.4低功耗音视频SoC芯片,其AI能力通过硬件加速、算法优化及生态整合实现,覆盖边缘计算、端云协同两大
    的头像 发表于 06-20 09:44 5467次阅读
    AI SoC #BK7258 AI能力和技术参数<b class='flag-5'>深度</b><b class='flag-5'>解读</b>

    直播 | GB/T 45086与ISO11451标准深度解读研讨会笔记请查收!

    6月12日,《德思特GB/T 45086与ISO11451标准深度解读》线上研讨会圆满结束。感谢大家的观看与支持!在直播间收到一些观众的技术问题,我们汇总了热点问题并请讲师详细解答,在此整理分享给大家,请查收!
    的头像 发表于 06-18 11:06 832次阅读
    直播 | GB/T 45086与ISO11451标准<b class='flag-5'>深度</b><b class='flag-5'>解读</b>研讨会笔记请查收!

    革命性神经形态微控制器 ​**Pulsar**​ 的深度技术解读

    以下是对荷兰公司Innatera推出的革命性神经形态微控制器 ​ Pulsar ​ 的深度技术解读,结合其架构设计、性能突破、应用场景及产业意义进行综合分析: 一、核心技术原理:神经形态架构的突破
    的头像 发表于 06-07 13:06 1330次阅读
    革命性神经形态微控制器 ​**Pulsar**​ 的<b class='flag-5'>深度</b>技术<b class='flag-5'>解读</b>

    瑞萨365 深度解读

    技术架构、核心功能、行业影响及未来展望四个维度进行深度解读: 一、技术架构:融合硬件与设计软件的跨领域协作平台 瑞萨365基于Altium 365云平台构建,整合了瑞萨的半导体产品组合与Altium的设计工具链,形成从芯片选型到系统部署的全流程数字环境。其核心架构围绕 五
    的头像 发表于 06-06 09:58 1817次阅读
    瑞萨365 <b class='flag-5'>深度</b><b class='flag-5'>解读</b>

    苹果A20芯片的深度解读

    以下是基于最新行业爆料对苹果A20芯片的深度解读,综合技术革新、性能提升及行业影响三大维度分析: 一、核心技术创新 ​ ​ 制程工艺突破 ​ ​ 全球首款2nm芯片 ​:采用台积电N2(第一代2纳米
    的头像 发表于 06-06 09:32 2636次阅读

    ARM Mali GPU 深度解读

    ARM Mali GPU 深度解读 ARM Mali 是 Arm 公司面向移动设备、嵌入式系统和基础设施市场设计的图形处理器(GPU)IP 核,凭借其异构计算架构、能效优化和生态协同,成为全球移动
    的头像 发表于 05-29 10:12 3024次阅读

    Arm 公司面向 PC 市场的 ​Arm Niva​ 深度解读

    面向 PC 市场的 ​ Arm Niva ​ 深度解读 ​ Arm Niva ​ 是 Arm 公司为 PC 市场推出的核心计算平台,属于其“平台优先”战略的关键布局。作为 ​ Arm 计算
    的头像 发表于 05-29 09:56 1306次阅读

    Arm 公司面向移动端市场的 ​Arm Lumex​ 深度解读

    面向移动端市场的 ​ Arm Lumex ​ 深度解读 ​ Arm Lumex ​ 是 Arm 公司面向移动设备市场推出的新一代计算平台,隶属于其“平台优先”战略的核心布局。作为 ​ Arm 计算
    的头像 发表于 05-29 09:54 4055次阅读

    Arm 公司面向汽车市场的 ​Arm Zena​ 深度解读

    面向汽车市场的 ​ Arm Zena ​ 深度解读 Arm Zena 是 Arm 公司面向智能汽车领域推出的核心计算平台,属于其“平台优先”战略的关键布局。作为 Arm 计算子系统(CSS)在
    的头像 发表于 05-29 09:51 2082次阅读

    兆易创新人形机器人方案 深度解读

    三个维度展开深度解读: 一、核心产品型号与应用场景 (一)主控MCU:多场景精准适配 GD32H7系列(高性能计算) 代表型号 :GD32H75E(Cortex-M7内核,600MHz主频) 特性 : 双发射6级流水线架构+双精度浮点单元(FPU),支持复杂算法(如逆运动
    的头像 发表于 05-07 15:56 1283次阅读

    谷歌第七代TPU Ironwood深度解读:AI推理时代的硬件革命

    谷歌第七代TPU Ironwood深度解读:AI推理时代的硬件革命 Google 发布了 Ironwood,这是其第七代张量处理单元 (TPU),专为推理而设计。这款功能强大的 AI 加速器旨在处理
    的头像 发表于 04-12 11:10 2926次阅读
    谷歌第七代TPU Ironwood<b class='flag-5'>深度</b><b class='flag-5'>解读</b>:AI推理时代的硬件革命

    英伟达Cosmos-Reason1 模型深度解读

    。以下从技术架构、训练策略、核心能力及行业影响四方面展开深度解读: Cosmos-Reason 1:从物理 AI 常识到具体决策 物理 AI 系统需要感知、理解和执行物理世界中的复杂作。在本文中,我们提出了 Cosmos-Reason1 模型,该模型可以理解物理世界并通过
    的头像 发表于 03-29 23:29 2624次阅读

    深度解读 30KPA64A 单向 TVS:64V 击穿机制与高效防护策略

    深度解读 30KPA64A 单向 TVS:64V 击穿机制与高效防护策略
    的头像 发表于 02-24 13:52 615次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>解读</b> 30KPA64A 单向 TVS:64V 击穿机制与高效防护策略

    MOSFET参数解读

    SGT-MOSFET各项参数解读
    发表于 12-30 14:15 1次下载