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

    文章

    6792

    浏览量

    88724
  • 函数
    +关注

    关注

    3

    文章

    4276

    浏览量

    62303
  • epoll
    +关注

    关注

    0

    文章

    28

    浏览量

    2941

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    解读PyTorch模型训练过程

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

    深度解读广汽全固态电池技术

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

    EMC技术:基础概念到应用的解读

    EMC技术:基础概念到应用的解读?|深圳比创达电子
    的头像 发表于 03-11 11:55 498次阅读
    EMC技术:基础概念到应用的<b class='flag-5'>解读</b>?

    IGBT和模块的标准体系解读

    IGBT和模块的标准体系解读
    的头像 发表于 12-14 11:38 1137次阅读
    IGBT和模块的标准体系<b class='flag-5'>解读</b>

    MEMS加速计的参数应用和解读

    MEMS加速计的参数应用和解读
    的头像 发表于 12-01 15:59 894次阅读
    MEMS加速计的参数应用和<b class='flag-5'>解读</b>

    Epoll封装类实现

    关于epoll的原理,以及和poll、select、IOCP之间的比较,网上的资料很多,这些都属于I/O复用的实现方法,即可以同时监听发生在多个I/O端口(socket套接字描述符或文件描述符
    的头像 发表于 11-13 11:54 469次阅读

    epoll源码分析

    Linux内核提供了3个关键函数供用户来操作epoll,分别是: epoll_create(), 创建eventpoll对象 epoll_ctl(), 操作eventpoll对象
    的头像 发表于 11-13 11:49 950次阅读
    <b class='flag-5'>epoll</b>源码分析

    epoll的LT模式总结

    epoll的触发模式是个引发讨论非常多的话题,网络上这方面总结的文章也很多,首先从名字上就不是很统一,LT模式常被称为水平触发、电平触发、条件触发,而ET模式常被称为边缘触发、边沿触发等,这些都是从
    的头像 发表于 11-10 15:35 451次阅读

    epoll底层如何使用红黑树

    epoll和poll的一个很大的区别在于,poll每次调用时都会存在一个将pollfd结构体数组中的每个结构体元素从用户态向内核态中的一个链表节点拷贝的过程,而内核中的这个链表并不会一直保存,当
    的头像 发表于 11-10 15:13 664次阅读
    <b class='flag-5'>epoll</b>底层如何使用红黑树

    epoll的触发模式介绍

    前言 epoll的触发模式是个引发讨论非常多的话题,网络上这方面总结的文章也很多,首先从名字上就不是很统一,LT模式常被称为水平触发、电平触发、条件触发,而ET模式常被称为边缘触发、边沿触发等,这些
    的头像 发表于 11-10 14:54 592次阅读

    epoll的基础数据结构

    一、epoll的基础数据结构 在开始研究源代码之前,我们先看一下 epoll 中使用的数据结构,分别是 eventpoll、epitem 和 eppoll_entry。 1、eventpoll 我们
    的头像 发表于 11-10 10:20 743次阅读
    <b class='flag-5'>epoll</b>的基础数据结构

    epoll和select使用区别

    epoll 和select 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时
    的头像 发表于 11-09 14:14 1007次阅读
    <b class='flag-5'>epoll</b>和select使用区别

    epoll 的实现原理

    今儿我们就从源码入手,来帮助大家简单理解一下 epoll 的实现原理,并在后边分析一下,大家都说 epoll 性能好,那到底是好在哪里。 epoll 简介 1、epoll 的简单使用
    的头像 发表于 11-09 11:14 495次阅读
    <b class='flag-5'>epoll</b> 的实现原理

    epoll来实现多路复用

    本人用epoll来实现多路复用,epoll触发模式有两种: ET(边缘模式) LT(水平模式) LT模式 是标准模式,意味着每次epoll_wait()返回后,事件处理后,如果之后还有数据,会不断
    的头像 发表于 11-09 10:15 455次阅读
    用<b class='flag-5'>epoll</b>来实现多路复用