图解 epoll 是如何工作的及epoll实现原理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本文包含以下内容:

  • epoll是如何工作的

本文不包含以下内容:

  • epoll 的用法
  • epoll 的缺陷

epoll实现原理由视频讲解:

C/C++ Linux服务器开发高级架构学习视频点击:C/C++Linux服务器开发/Linux后台架构师-学习视频教程

epoll原理剖析以及reactor模型应用

基于linux epoll网络编程细节处理


我实在非常喜欢像epoll这样使用方便、原理不深却有大用处的东西,即使它可能已经比较老了

select 和 poll 的缺点

epoll 对于动辄需要处理上万连接的网络服务应用的意义可以说是革命性的。对于普通的本地应用,select 和 poll可能就很好用了,但对于像C10K这类高并发的网络场景,select 和 poll就捉襟见肘了。

看看他们的API

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);
           
int poll(struct pollfd *fds, nfds_t nfds, int timeout);

它们有一个共同点,用户需要将监控的文件描述符集合打包当做参数传入,每次调用时,这个集合都会从用户空间拷贝到内核空间,这么做的原因是内核对这个集合是无记忆的。对于绝大部分应用,这是一种十足的浪费,因为应用需要监控的描述符在大部分时间内基本都是不变的, 也许会有变化, 但都不大.

epoll 对此的改进

epoll对此的改进也正是它的实现方式, 它需要完成以下两件事

  1. 描述符添加 --- 内核可以记下用户关心哪些文件的哪些事件.
  2. 事件发生 --- 内核可以记下哪些文件的哪些事件真正发生了, 当用户前来获取时, 能把结果提供给用户.

描述符添加

既然要有记忆, 那么理所当然的内核需要需要一个数据结构来记, 这个数据结构简单点就像下面这个图中的epoll_instance, 它有一个链表头,链表上的元素epoll_item就是用户添加上去的, 每一项都记录了描述符fd和感兴趣的事件组合event

 

事件发生

事件有多种类型, 其中POLLIN表示的可读事件是用户使用的最多的。比如:

  • 当一个 TCP 的socket收到报文,它会变得可读;
  • 当一个pipe受到对端发送的数据,它会变得可读;
  • 当一个timerfd对应的定时器超时,它会变得可读;

那么现在需要将这些可读事件和前面的epoll_instance关联起来。linux中,每一个文件描述符在内核都有一个struct file结构对应, 这个struct file有一个private_data指针,根据文件的实际类型,

Linux & IO多路转接】——epoll详解 epoll的功能一样跟select和poll一样,都是用来检测文件描述符中的事件是否就绪,当有事件就绪,可以通知给应用层,上层调用 read,recv,write,send 等类似接口就不会被阻塞 阅读详情

相关推荐

图解epoll原理

poll翻译过来是轮询的意思, 可以看到poll和epoll都有轮询的过程, 不同点在于:poll轮询的是所有的socket,而epoll只轮询就绪的socket。 epoll开发linux高性能服务器的必备技术至,epoll本质,是服务端程序员的必须掌握的知识。 本文主要是利用图文讲述了select的原理epoll相对于做出的优化,以及epoll的部分细节问题。 ...

一枚野生程序员 —— Tim 2714

linux网络编程epoll详解

epoll_create,epoll_ctl,epoll_wait,epoll的触发模式,边沿触发:edge-triggered (EPOLLET), 水平触发:level-triggered (EPOLLLT),epoll原理解析,中断和阻塞,socket接收网络数据,epoll的设计思路,epoll工作流程,就绪列表Rdlist,eventpoll,索引结构RBR。

weixin_40355471的博客 4974

深入理解NIO底层原理--epoll多路复用

在使用选择和轮询时,我们管理用户空间上的所有内容,并在每次调用时发送集合以等待。要添加另一个套接字,我们需要将其添加到集合中并再次调用select/poll。 epoll系统调用帮助我们创建和管理内核中的上下文。我们将任务分为3个步骤: 使用epoll_create在内核中创建上下文 使用epoll_ctl在上下文中添加或删除文件描述符 使用epoll_wait等待上下文中的事件 epoll底层逻辑 struct epoll_event events[5]; // 使用epoll_creat

wangzuojia001的博客 894

深入了解epoll模型(特别详细)

有的朋友可能对select也不是很了解啊,我这里稍微科普一下:网络连接,服务器也是通过文件描述符来管理这些连接上来的客户端,既然是供连接的服务器,那就免不了要接收来自客户端的消息。那么多台客户端,消息那么的多,要是漏了一条两条重要消息,那也不要用TCP了,那怎么办?前辈们就是有办法,轮询,轮询每个客户端文件描述符,查看他们是否带着消息,如果带着,那就处理一下;如果没带着,那就一边等着去。这就是select,轮询,颇有点领导下基层的那种感觉哈。

木牛的博客 605

epoll 底层实现总结

当一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关。eventpoll结构体如下所示: struct eventpoll{     ....     /*红黑树的根节点,这颗树中存储着所有添加到epoll中的需要监控的事件*/     struct rb_root  rbr;     /*双链表...

YMY_mine的博客 1308

Epoll图解

图解

m0_46104251的博客 194

深入理解 epoll:从文件描述符到事件驱动,一文彻底讲透内核级 I/O 多路复用

《深入理解epoll:从文件描述符到事件驱动》是一篇解析Linux内核I/O多路复用机制的深度技术文章。文章通过生动的快递柜类比,系统性地讲解了文件描述符(fd)的基础概念,并对比传统轮询方式的低效性,引出epoll的事件驱动模型。核心内容聚焦epoll的四大机制:红黑树管理监听列表、内核回调函数、就绪队列和唤醒机制,通过原创手绘图详细展示了epoll_create、epoll_ctl和epoll_wait的完整工作流程。文章特别强调epoll的"智能通知"本质在于"回调+就绪

大四在找工作,如果公司有需要的可以联系我13086825462@163.com 1083

BIO、NIO、AIO、多路复用IO的区别(图解)

原文地址:blog.csdn.net/lzb348110175/article/details/98941378学习之前,我们先来了解一下IO模型: ①同步阻塞IO(Block...

JAVA高级架构 579

epoll原理图解

流 I\O操作 阻塞 流 可以进行I\O操作的内核对象 文件、管道、套接字…… 流的入口:文件描述符(fd) 所有对流的读写操作,我们都可以称之为IO操作。 那么当一个流中再没有数据,read的时候,或者说 在流中已经写满了数据,再write,我们的IO操作就 会出现一种现象,就是阻塞现象 阻塞 非堵塞 阻塞等待: 空出大脑可以安心睡觉。(不占用CPU宝贵的时间片) 非阻塞,忙轮询: ...

小麦大大博客 2万+

Socket IO多路复用: epoll原理图解

目录 一、accept 创建新 socket 1.1 初始化 struct socket 对象 1.2 为新 socket 对象申请 file 1.3 接收连接 1.4 添加新文件到当前进程的打开文件列表中 二、epoll_create 实现 三、epoll_ctl 添加 socket 3.1 分配并初始化 epitem 3.2 设置 socket 等待队列 3.3 插入红黑树 四、epoll_wait 等待接收 4.1 判断就绪队列上有没有事件就绪 4.2 定义等待事件并关联当前

RToax 2212

图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的!

点击上方蓝字"开发内功修炼",关注并设为星标了解你的每一比特,用好你的每一纳秒进程在 Linux 上是一个开销不小的家伙,先不说创建,光是上下文切换一次就得几个微秒。所以为...

zhangyanfei01的专栏 1932

I/O多路复用 - select、poll、epoll讲解(epoll工作图解介绍+红黑树)

epoll实现机制与select/poll机制完全不同。epollLinux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。

m0_51429770的博客 3969

图解丨深度解密epoll背后的原理

1 简介 Epoll 是个很老的知识点,是后端工程师的经典必修课。这种知识具备的特点就是研究的人多,所以研究的趋势就会越来越深。当然分享的人也多,由于分享者水平参差不齐,也产生的大量错误理解。 今天我再次分享 epoll,肯定不会列个表格,对比一下差异,那就太无聊了。我将从线程阻塞的原理,中断优化,网卡处理数据过程出发,深入的介绍 epoll 背后的原理,最后还会 diss 一些流行的观点。相信无论你是否已经熟悉 epoll,本文都会对你有价值。 2 引言 正文开始前,先问大家几个问题。 ..

资料qun832218493 492

epoll详细工作原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34174105的博客 406

Linux epoll函数图解

看到一篇不错的文章《The method to epoll's madness》(作者:Cindy Sridharan)(原文链接)。 下面是摘录: epollstands forevent polland is a Linux specific construct. It allows for a process to monitor multiple file descriptors...

C君传 476

深入理解网络 I/O 多路复用:Epoll

该篇博文主要介绍的就是比较重要比较核心的多路复用模型 Epoll,先简略说明 Epoll 重要的三大函数:epoll_create、epoll_ctl、epoll_wait,在其中说到了 Epoll 事件接口:边沿触发(ET:edge-triggered)、水平触发(LT:level-triggered),提及到了 Epoll 内核中关键的源码部分,使用三大函数巧妙结合起来实现 epoll 高效的多路复用,在底层采用红黑树结构存储所有的 socket fd 信息,采用链表结构存储所有有事件状态的 socke

vnjohn 博主 > 主线分享后端领域业务设计知识、源码思想、架构设计 4746

Linux网络编程--epoll 模型原理详解以及实例

1.简介Linux I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。Linux 2.6内核中有提高网络I/O性能的新方法,即epollepoll是什么?按照man手册的说法是为处理大批量句柄而作了改进的poll。要使用epoll只需要以下的三个系统函数调用: epoll_create(2),epoll_ctl(2),epoll_wait(2)。

志存高远 1万+

图文详解Linux EPOLL

Linux EPOLL超详细解读,图文并茂,原文请关注知乎-晏舒,同作者

cxjczy1990的博客 1173
上一篇: 从底层原理出发,了解Linux内核之内存管理
下一篇: WebRTC学习—WebRTC详解
Linux服务器开发
博客等级 码龄7年 609粉丝 589原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值