epoll小结

2023-11-19

1.select和poll模型为什么会慢。
    假如有100w用户和一个进程保持tcp连接,而每一个时刻只有几十个活跃的连接,也就是说,每一个时刻进程只需要处理这100w连接中的一小部分。那么如何高效的处理?进程是否在每次询问操作系统收集有事件发生的tcp连接时,把这100w个连接告诉操作系统,然后由操作系统来找出发生的连接?select和poll正是这么做的。
    这里有个明显的问题,就是在某一时候,进程收集有事件的连接时,其实这100w连接中的大部分都没有事件发生。因此每次收集事件时,都把这100w连接的套接字告诉操作系统,然后由操作系统内核寻找这些连接上是否发生事件,将会是巨大的浪费。
2.epoll对象和事件关系
    每个epoll对象对应一个eventpoll结构体。这个结构体中包含保存监听事件的红黑树字段和满足条件的双向链表字段。详见深入理解nginx的312页。
    所有添加到epoll中的事件都会与设备(网卡)驱动程序建立回调函数,也就是说,相应事件发生时会调用这里的回调函数。这个回调方法在内核中叫做ep_poll_callback,它会把就绪的事件放到上面的rdlist链表中。
    当调用epoll_wait检查是否有发生事件的连接时,只是检查eventpoll对象中的rdlist双向链表是否由epitem元素而已。如果rdlist链表不为空,则把这里的事件复制到用户态内存中,同时将事件数量返回給用户。因此epoll_wait效率相当的高。epoll_ctl向epoll对象中添加修改删除事件时,从rbr红黑树中查找事件也非常快,也就是说,epoll时非常高效的,他可以轻易的处理百万级别并发连接。
3.如何使用epoll
epoll使用下面三个系统调用为用户提供服务。
(1)epoll_create系统调用
epoll_create在c库的原型如下:
    int epoll_create(int size);
epoll_create返回一个句柄,之后epoll的使用都将依靠这个句柄来标示。参数size是告诉epoll所要处理的大致事件数目。不再使用epoll时,必须调用close关闭句柄。
(2)epoll_ctl系统调用
原型如下:
    int epoll_ctl(int epfd,int op,int fd,struct epoll_event *event);
epoll_ctl向epoll对象中添加、修改、删除感兴趣的事件,返回0标示成功,否则返回-1,此时需要根据errno错误码判定错误类型。epoll_wait方法返回的事件必然是通过epoll_ctl添加到epoll中的。参数epfd是epoll_create返回的句柄。
    epfd:epoll_create返回值。
    fd:待检测的连接套接字。
    op:操作
    event:告诉epoll对什么样的事件感兴趣,它使用了epoll_event结构体,它使用了epoll_event结构体。
    struct epoll_event{
        uint32_t events;
        epoll_data_t data;
    };
    events:代表感兴趣事件的类型,如读、写等
    data成员是联合。
    typedef union epoll_data{
        void *ptr;
        int fd;
        uint32_t u32;
        uint64_t u64;
     }epoll_data_t;
(3)epoll_wait
 在c库原型如下:
    int epoll_wait(int epfd,struct epoll_event *events,int maxevents,int timeout);
    
    收集在epoll监控的事件已经发生的事件,如果epoll没有事件发生,则最多等待timeout毫秒返回。epoll_wait返回值表示当时发生的事件个数,如果返回0,则表示本次调用中没有事件发生,如果-1表示出现错误。
    epfd:epoll描述符
    events:则是分配好的epoll_event结构体数组,epoll将会把发生的事件复制到events数组中(events不可以是空,内核只负责把数据复制到这个events数组中,不会帮助我们在用户态中分配内存。内核这种做法效率很高)。
    maxevents:表示本次可以返回的最大事件数目,通常maxevents参数与分配的events数组大小相当。
    timeout:表示没有检测到事件发生时最多等待的时间。如果timeout=0,则表示epoll_wait在rdlist为空时,立刻返回,不需等待。
4.epoll俩种工作模式:LT/ET
    LT(level triggered)是epoll缺省工作方式,并且同时支持block和no-block socket。在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不做任何的操作,内核还是会继续通知你。
    ET(edge-triggered)是高速工作方式,只支持no-block socket,它的效率要比LT更高。ET和LT的却别在于,当一个新的事件到来时,ET模式下当然可以从epoll_wait调用中获取到这个事件,可是如果这次没有把这个事件对应的套接字缓冲区处理完,在这个套接字没有新的事件在此到来时,在ET模式下时无法再次从epoll_wait调用中获取这个事件的。而LT模式相反,只要一个事件对应的套接字缓冲区还有数据,就总能从epoll_wait中获取事件
epoll的优点:
1.支持一个进程打开大数目的socket描述符。
    select最不能忍受的一点是打开的FD数量是有限制的,由FD_SETSIZE设置,默认是2048.对于那些需要支持的上万连接数目的IM服务器来说显然太少。这时候你一定是选择修改这个宏然后重新编译内核,不过资料也同时指出这样会带来网络效率的下降。不过epoll没有这个限制,它所支持的FD上限是最大可以打开文件数目,这个数字一般远大于2048。举个例子,在1GB内存的机器上大约是10w,和内存大小相关。
2.IO效率不随FD数目增加线性下降。
    传统的select/poll另外致命的缺点是当拥有大集合的套接字,常常只有部分套接字是活跃的,但是select/poll每次会线性扫描全部集合,导致效率的线性下降。但是epoll不存这个问题,它只会对活跃的socket进行操作--这是因为内核实现中epoll是根据每个fd上的callback函数实现的。那么只有活跃的socket才会主动的去调用callback函数,因为空闲的套接字则不会。
3.使用mmap加速内核与用户空间的消息传递
    这点实际上涉及到epoll的具体实现。无论select/poll还是epoll都需要将内核把FD消息传递給用户空间,如何避免不必要的内存拷贝很重要,在这点上,epoll是通过内核与用户空间映射同一块内存实现的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

epoll小结 的相关文章

  • 软件质量保证与测试技术实验报告(二)黑盒测试用例设计

    1 实验名称 黑盒测试用例设计 2 实验目的 学会用等价类划分法和边界值法设计测试用例 进行功能测试 3 实验内容 题目1 NextDate程序的功能是按年 月 日的顺序输入一个日期 输出为输入日期后一天的日期 请使用等价类和边界值法对Ne
  • windows内核驱动开发(WDK环境搭建)

    去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 WDK Windows drivers Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了 下面直接下载步
  • JESD204B(RX)协议接口说明。

    解释一下Vivado IP协议中的Shared Logic in Example 与 Shared Logic in Core 首先 什么是Shared Logic 字面意思很好理解 就是共享逻辑 主要包括时钟 复位等逻辑 当选择Share
  • grafana elasticsearch es 创建变量variable时,query里的查询语句是对的,但是预览没有数据

    问题 图中的query输入框中输入正确 并且es中有rulename字段 rulename也有值 但是此处预览里没有值 按F12看了grafana的请求体和响应体才发现 rulename是text类型的 不能进行聚集 所以这里查不到数据 解
  • -离散数学-期末练习题解析

    一 选择题 二 填空题 三 计算题 四 简答题 五 证明题 六 应用题 一 选择题 下列句子中 是命题 A 2是常数 B 这朵花多好看啊 C 请把们关上 D 下午有会吗 A 命题是能判断真假的陈述句 B是感叹句 C是祈使句 D是疑问句 令p
  • sqlserver开启sql登录方式!

    安装sqlserver的时候只有windows登录 但有时也要用到sqlserver登录的方式 总不可能重新安装sqlserver吧 1 先用windows登录sqlserver 依次单击 安全性 gt 登录名 gt sa 右键打开sa的属
  • Android_UI开发总结(一):RadioButton与RadioGroup使用

    关于RadioButton与RadioGroup的API详解 gt https www cnblogs com Im Victor p 6238437 html 下面记录在使用RadioButton和RadioGroup中遇到的三点问题 1
  • MPLS原理和配置实验

    一 MPLS背景 90年代初 互联网流量快速增长 而由于当时硬件技术的限制 路由器采用最长匹配算法逐跳转发数据包 成为网络数据转发的瓶颈 快速路由技术成为当时研究的一个热点 在各种方案中 IETF确定MPLS协议作为标准的协议 MPLS采用
  • Linux内存地址管理

    文章目录 系统内存布局 内核地址的低端和高端内存概念 低端内存 高端内存 地址转换和MMU Linux中的四级分页模型 虚拟地址字段 页表处理 将虚拟地址转换物理地址 Linux系统中的每个内存地址都是虚拟的 它们不直接指向任何物理内存地址

随机推荐

  • 陷波滤波器消除周期噪声python_50Hz 工频电磁场干扰的消除方案

    50Hz 工频电磁场干扰是硬件开发中难以避免的问题 特别是敏感测量电路中 工频电磁场会使测量信号淹没在工频波形里 严重影响测量稳定度 故消除工频电磁场干扰是敏感测量电路设计中不可逃避的挑战 PT100 是当前应用最为广泛的测温方案 各位工程
  • C语言进阶题——坐标移动

    C语言进阶题 坐标移动 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 A10 S20 W10 D30 X A
  • Go项目部署及所遇问题

    小聊 本次小白给大家带来Golang项目部署操作以及个人所遇问题和解决它们的方法 依然是一边实操演示一边写文稿 如遇相似问题却存有疑惑可留言 开发环境是Window 部署环境是Linux 开发工具为GoLand 部署服务器为阿里云 1 打包
  • [工业互联-4]:工业有线互联总线之IO-Link

    目录 第1章 IO link概述 1 1 IO Link在哪了 1 2 什么是IO link 1 3 IO link的主要优势 1 4 IO Link的发展 第2章 IO link网络的组成 2 1 概述 2 2 IO Link主站模块 M
  • mysql重连次数_doctrine实现自动重连mysql数据库机制

    这篇文章主要介绍了doctrine实现自动重连mysql数据库机制 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 不知道大家有没有碰到就是mysql有的时候会八小时不使用的话自动断开连接 这样会导致我们的请求失
  • Java数据结构---顺序表(增删改查详细实现)

    1 什么是顺序表 在程序中 经常需要将一组 通常是同为某个类型的 数据元素作为整体管理和使用 需要创建这种元素组 用变量记录它们传进传出函数等 一组数据中包含的元素个数可能发生变化 可以增加或删除元素 对于这种需求 最简单的解决方案便是将这
  • 通过js在ul中插入10000个li,点击li打印出li的序号

    第一种 直接ul插入 花费了119ms 164ms window onload function let now new Date let ul document querySelector ul for let i 0 i lt 1000
  • android 蓝牙聊天室之官方例子

    2013 09 05 android 蓝牙聊天室之官方例子 蓝牙开发的大致流程 1 蓝牙权限 Java代码
  • 解决mac端TypeError: transpileDependencies.map is not a function

    运行环境 问题详情 解决方案 在我使用yarn安装包的时候是正常安装的 可是在yarn serve的时候提示了如下错误 这个时候需要在vue config js中加入这个配置 transpileDependencies 与devServic
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • open3d安装的诸多问题

    本文大概介绍一下再安装open3d包过程中遇到的诸多问题 问题1 在pycharm的设置中在线安装失败报错 ERROR Could not find a version that satisfies the requirement open
  • sklearn总篇

    one hot 化
  • 感应(异步)电机磁场定向控制电流环PI控制参数设计

    电机控制系列文章 感应 异步 电机磁场定向控制MATLAB Simulink建模 感应 异步 电机磁场定向控制速度环PI控制参数设计 目录 电机控制系列文章 前言 一 并联型PI与串联型PI 二 被控对象模型 三 电流环闭环传递函数 四 电
  • 【cc3.x】顶点着色器和片元着色器小记

    cc3 x cocos creator3 x 的着色器demo有点少 而且讲的不是很清晰 我这种业余自学小白学的真的很艰难 不过好赖算是啃的差不多了 所以有了这则小记 权当备忘录了 首先顶点着色器 上一段代码 CCProgram vs pr
  • js时间戳转成日期 需要解决各国时区问题的方法

    时间戳转日期格式 param Number timestamp 时间戳 export function formatterTimeYMDHM timestamp if timestamp return const localDate new
  • 永恒之蓝MS17010复现

    MS17010复现 靶机win7 192 168 41 150 攻击kali 192 168 41 147 扫描 通过auxiliary scanner smb smb ms17 010模块扫描虚拟机是否存在ms17010漏洞 存在 拿sh
  • 数学专题-算法-矩阵-拟合

    Author Mikeliu 2020 Date 2020 03 08 10 32 13 LastEditTime 2020 03 12 09 26 47 LastEditors Mikeliu 2020 Description usr b
  • java: 程序包XXX不存在

    今天新导入的maven项目 一启动idea报各种包不存在 各种符号不存在 我是使用以下方法解决的 你可以尝试看看 在File Settings Build Execution Deployment Build Tools Maven Run
  • 寒假集训——八

    寒假集训 七十六 字符串 1 创建字符串 2 字符集 3 字符串常用方法 4 json格式字符串 七十七 数字常用方法 Math对象 七十八 Date 1 new Date 2 时间对象常用方法 七十九 定时器 倒计时定时器 八十 BOM
  • epoll小结

    1 select和poll模型为什么会慢 假如有100w用户和一个进程保持tcp连接 而每一个时刻只有几十个活跃的连接 也就是说 每一个时刻进程只需要处理这100w连接中的一小部分 那么如何高效的处理 进程是否在每次询问操作系统收集有事件发