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

    文章

    7014

    浏览量

    88980
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62586
  • epoll
    +关注

    关注

    0

    文章

    28

    浏览量

    2952

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

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

收藏 人收藏

    评论

    相关推荐

    PCM1680 does not support a board-to-board interface不支持板对板的是怎么解读

    The PCM1680 does not support a board-to-board interface不支持板对板的是怎么解读
    发表于 12-11 07:31

    4G模组加解密艺术:通用函数的深度解读

    今天是对加解密通用函数的深度解读,我将详细讲解,建议收藏,不可错过。
    的头像 发表于 11-12 09:58 236次阅读
    4G模组加解密艺术:通用函数的<b class='flag-5'>深度</b><b class='flag-5'>解读</b>

    京准电钟解读:PTP时钟同步系统及应用是什么?

    京准电钟解读:PTP时钟同步系统及应用是什么?
    的头像 发表于 10-31 09:35 249次阅读
    京准电钟<b class='flag-5'>解读</b>:PTP时钟同步系统及应用是什么?

    FPGA做深度学习能走多远?

    ,共同进步。 欢迎加入FPGA威廉希尔官方网站 微信交流群14群! 交流问题(一) Q:FPGA做深度学习能走多远?现在用FPGA做深度学习加速成为一个热门,深鉴科技,商汤,旷视科技等都有基于FPGA做深度学习的项目
    发表于 09-27 20:53

    深度解读 VCXO VG7050CDN:可变晶体振荡器的卓越之选

    深度解读 VCXO VG7050CDN:可变晶体振荡器的卓越之选
    的头像 发表于 07-24 10:58 355次阅读

    解读MIPI A-PHY与车载Serdes芯片威廉希尔官方网站 与测试

    上一期,《汽车芯片标准体系建设指南》威廉希尔官方网站 解读与功率芯片测量概览中,我们给大家介绍了工信部印发的《汽车芯片标准体系建设指南》涉及到的重点芯片与测试领域解读,本期继续给大家做延展,我们解读的是MIPI A-PHY与车载Serdes芯
    的头像 发表于 07-24 10:14 2803次阅读
    <b class='flag-5'>解读</b>MIPI A-PHY与车载Serdes芯片威廉希尔官方网站
与测试

    ESP32 深度睡眠

    使用的是ESP32S2 idf 5.2.2 官方代码历程deep_sleep 进入深度睡眠 睡眠后功耗为1.9mA,一直降不下去。
    发表于 07-11 09:50

    为什么深度睡眠期间RTC定时器会丢失呢?

    RTC定时器在深度睡眠期间丢失是否是一种设计功能?我观察到以下内容(使用 SDK 1.3): The chip is awakened from deep sleep after a timer
    发表于 07-11 07:17

    解读PyTorch模型训练过程

    PyTorch作为一个开源的机器学习库,以其动态计算图、易于使用的API和强大的灵活性,在深度学习领域得到了广泛的应用。本文将深入解读PyTorch模型训练的全过程,包括数据准备、模型构建、训练循环、评估与保存等关键步骤,并结合相关数字和信息进行详细阐述。
    的头像 发表于 07-03 16:07 1053次阅读

    深度学习的典型模型和训练过程

    深度学习作为人工智能领域的一个重要分支,近年来在图像识别、语音识别、自然语言处理等多个领域取得了显著进展。其核心在于通过构建复杂的神经网络模型,从大规模数据中自动学习并提取特征,进而实现高效准确的预测和分类。本文将深入解读深度
    的头像 发表于 07-03 16:06 1442次阅读

    深度解析深度学习下的语义SLAM

    随着深度学习威廉希尔官方网站 的兴起,计算机视觉的许多传统领域都取得了突破性进展,例如目标的检测、识别和分类等领域。近年来,研究人员开始在视觉SLAM算法中引入深度学习威廉希尔官方网站 ,使得深度学习SLAM系统获得了迅速发展,并且比传统算法展现出更高的精
    发表于 04-23 17:18 1289次阅读
    <b class='flag-5'>深度</b>解析<b class='flag-5'>深度</b>学习下的语义SLAM

    深度解读广汽全固态电池威廉希尔官方网站

    4月12日,在“科技视界”广汽科技日活动上,广汽集团发布了被称为“全球动力电池领域竞争的威廉希尔官方网站 高地”的全固态动力电池威廉希尔官方网站 ,广汽埃安电池研发部负责人李进对此项威廉希尔官方网站 进行了解读
    的头像 发表于 04-15 09:15 545次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>解读</b>广汽全固态电池威廉希尔官方网站

    EMC威廉希尔官方网站 :基础概念到应用的解读

    EMC威廉希尔官方网站 :基础概念到应用的解读?|深圳比创达电子
    的头像 发表于 03-11 11:55 575次阅读
    EMC威廉希尔官方网站
:基础概念到应用的<b class='flag-5'>解读</b>?

    PSoC CAN不会从深度睡眠中醒来是怎么回事?

    亲爱的论坛:我们用 PSoC6 开发了嵌入式软件。 但是我们遇到了以下问题:在某些主板上,PSoC6 CAN无法从深度睡眠中醒来。 我们通过以下方法开发了深度睡眠和醒来过程: 第 1 步:关闭
    发表于 01-31 08:03

    DC电源模块的关键参数解读

    BOSHIDA DC电源模块的关键参数解读 BOSHIDA DC电源模块是一种电子设备,用于将交流电(AC)转换为直流电(DC)供电给其他电子设备。关键参数对于了解电源模块的性能和适用范围非常重要
    的头像 发表于 01-12 14:01 848次阅读
    DC电源模块的关键参数<b class='flag-5'>解读</b>