select、poll、epoll简介

2023-05-16

select、poll、epoll都是IO多路复用机制,都可实现同时监听多个I/O事件的状态,多路复用就是通过一种机制监视多个描述符,一旦某个描述符读或者写就绪就能通知代码进行读写操作。本质他们都是同步I/O,都需要读写时间就绪后自己负责读写,并且读写过程阻塞,而异步IO实现不会自己读写和阻塞,会负责把数据从内核拷贝到用户空间

1.select和poll实现原理
select 基于轮询机制,在一段指定时间内,监听用户所感兴趣的文件描述符上的可读、可写和异常事件。
select缺点:
所能监视的文件描述符的数量有限制,sizeof(fd_set)=128,说明能监视的描述符的最大值为128*8=1024个
同时每次调用select都需要在内核遍历传递进来的所有fd,当fd很多时性能会下降
由于当有事件发生时,select返回后会修改三个事件集,所以,每次都需要把fd集合从用户区拷贝到内核区,当需要监视的fd数量增多时,性能会下降
适用场景:
适用于所监视的文件描述符数量较少的场景
poll差异:
只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构
poll优点:
没有fd数量的限制
不用每次都把fd集合从用户区拷贝数据到内核,它使用一个 struct pollfd结构体来维护fd

2.epoll实现原理
epoll基于os支持的I/O通知机制,epoll支持水平触发和边沿触发两种模式。epoll使用一组函数来完成,把用户关心的文件描述符上的事件放在内核的一个事件表中,无须向select、poll那样每次调用都要重复传入文件描述符集或事件集,但epoll需要用一个额外的文件描述符来表示内核中的这个事件表。
优点:
1.没有fd数量的限制,它所支持的fd上限是最大可以打开文件的数目,具体数目可cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大
2.epoll_ctl每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝,epoll保证了每个fd在整个过程中只会拷贝一次
3.epoll的解决方案不像select或poll一样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd。
适用场景:
当活动连接比较多的时候,epoll_wait的效率未必比select和poll高,因为此时回调函数被触发的过于频繁,因此epoll_wait适用于连接数量多,但活动连接较少的情况。
epoll对文件描述符的操作有两种模式:
LT(水平触发):这种模式是默认的工作模式,此时,epoll相当于效率较高的poll,
当往epoll内核事件表中注册一个文件描述符上的EPOLLET事件时,epoll将以ET模式来操作该文件描述符
ET(边沿触发):ET模式是epoll的高效工作模式,它在很大程度上降低了同一个epoll事件被重复触发的次数
参考:
1.select、poll、epoll之间的区别总结
2.一文搞懂select、poll和epoll

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

select、poll、epoll简介 的相关文章

  • 为列名创建动态选择获取值 - 在 SQL Server 中

    请帮助我创建一个选择 SQL 语句 其中的结果列名称是从原始表中的列值获取的 表名是Device Part 用户可以输入很多DeviceCode其中有许多动态PartTypeName PartTypeName 值为PartInfo 这可能有
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • 在 BEFORE INSERT 触发器中使用 IF EXISTS (SELECT ...) (Oracle)

    我的代码不起作用 Oracle 告诉我创建触发器时出现构建错误 显然我无法获得有关构建错误的更准确信息 我以前确实没有做过很多SQL 所以我对语法不太熟悉 我有一种预感 Oracle 不喜欢我的 IF EXISTS SELECT THEN
  • 选择前 n 个字符相等的行(MySQL)

    我有一张带有玩家句柄的桌子 如下所示 1 N Laka 2 N James 3 nor Brian 4 nor John 5 Player 2 6 Spectator 7 N Joe 从那里我想选择第一个 n 字符匹配的所有玩家 但我不知道
  • SQL Server - 将行连接到逗号分隔的列表中

    假设我有一个临时表 如下所示 Id Value 1 1 1 2 1 3 2 1 2 2 我希望我的桌子是这样的 Id ValueList 1 1 2 3 2 1 2 所以基本上我需要将我的值分组为逗号分隔的列表 我已经尝试过以下操作 SEL
  • chrome 中选择选项元素的额外填充

    我有一个选择元素 用户可以在其中选择分类和描述 仅在 Chrome 浏览器中 我有一个额外的填充 无法使用 padding 0 或其他 css 标签删除它 Chrome 的屏幕 https i stack imgur com m3iIb p
  • 如何重新加载 jquery dropkick 对象

    我使用一个简单的选择列表和 jquery dropkick 库来使其美观 现在我想在更改相应的选择元素后更改 dropkick 内容 出现了一个新选项 但只需调用 select dropkick 不起作用 而且好像不支持 只需从头开始重建那
  • 作为 UDF 结果的列上的 Where 子句

    我有一个用户定义的函数 例如myUDF a b 返回一个整数 我试图确保该函数仅被调用一次 并且其结果可以用作WHERE clause SELECT col1 col2 col3 myUDF col1 col2 AS X From myTa
  • 在一个查询中对同一个表进行多个 COUNT SELECT

    对于某些人来说 这可能看起来很简单 但我就是无法理解 我一遍又一遍地从同一个表中进行多个 MS SQL SELECT 查询 SELECT count Page as tAEC FROM someTable WHERE Page LIKE A
  • 直接从表中选择和视图之间的区别

    直接从表中选择数据或从视图中选择数据有什么区别 每一种的最佳用途是什么 根据微软的说法 如果你使用的话会有性能优势indexedSQL Server 2000 2005 2008 中的视图 索引视图可以通过以下方式提高查询性能1 可以预先计
  • 使用 Javascript 触发选择表单元素以显示其选项(打开下拉选项列表)

    这是标记
  • jQuery UI 1.8.17 和 selectmenu

    这个问题的答案可能会让我 doh 时刻 但是我在哪里可以找到一个可与较晚 ish jquery ui 版本一起使用的有效 selectmenu 插件 我从所有这些地方尝试过 但似乎都不起作用 http www filamentgroup c
  • 确定哪个信号导致了 EINTR?

    我正在运行 epoll 循环 有时对 epoll wait 的调用返回 1 errno 设置为 EINTR 有时 我希望它结束 epoll 循环 就像 SIGTERM 或 SIGINT 的情况一样 但我使用 pg 标志编译了这段代码 因此会
  • Struts 2 - s:使用Map选择

    在 struts 2 中 我想使用从 Map 填充的 s select 我的地图有这样的值 键1 值1 键2 值2 键是我想要发布的内容 确实如此 但它显示了值 我不想显示这些值 但从我在其他方法 如 s text getTranslati
  • MySQL:根据 ORDER BY 更新“排序”列

    完全编辑 我的查询有来自 2 个表的 2 列 文件名和排序顺序 完整的表格在这里完成http sqlfiddle com 9 8c0507 http sqlfiddle com 9 8c0507 Example SELECT FROM ta
  • python - select.select() 如何工作?

    背景 我对C很熟悉select 功能 我已经将这个功能用于多种目的 其中大多数 如果不是全部 用于读取和写入管道 文件等 我必须说我从未使用过错误列表 但这不涉及关键问题 问题 有Python的吗select 行为如下 对我来说事实证明se
  • 覆盖 Enter 键的 SELECT 行为

    使用 HTML 控件 其操作或多或少类似于电子表格 具有可编辑数据单元格的矩阵 当涉及从 SELECT 派生的单元格时 当选择该类型的单元格进行编辑时 我遇到了获得正确行为的问题 如果我使用默认格式 大小 0 渲染 Select 则用户会得
  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样

随机推荐

  • 蜂鸣器及其原理

    蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器 xff0c 其中压电式蜂鸣器提供一定频率的脉冲信号即可发出声音 xff0c 电磁式蜂鸣器提供电源即可发出声音 蜂鸣器氦分为有源蜂鸣器和无源蜂鸣器 xff08 这里的源不是电源 xff0c 而是蜂鸣器
  • 损失函数Loss相关总结(精细版)

    目录 Loss损失函数的作用 损失函数loss和准确率accuracy的比较 回归任务中的loss主要包括 Loss损失函数的作用 损失函数用来评价模型的
  • NLP中的对抗训练

    目录 一 对抗训练的基本概念 二 NLP中常用对抗训练算法的pytorch版本实现 1 FGM Fast Gradient Method 2 PGD Projected Gradient Descent 3 FreeLB Free Larg
  • Flannel介绍

    本文个人博客地址 xff1a http www huweihuang com article flannel flannel introduction 一 flannel是什么 xff08 what xff09 xff08 一 xff09
  • 工作八年,月薪60K,裸辞两个月,投简历投到怀疑人生!

    近日 xff0c 有网友在某职场社交平台吐槽 xff0c 自己裸辞两个月了 xff0c 但是找工作却让自己的心态都要崩溃了 xff0c 全部无果 xff0c 不是已查看无回音 xff0c 就是已查看不符合 工作八年 xff0c 两年一跳 x
  • C语言判断某一年是否为闰年!三种实现程序代码(值得收藏)

    C语言判断某一年是否为闰年的各种实现程序代码 1 公历闰年计算原则 xff08 按一回归年365天5小时48分45 5秒 xff09 1 普通年能整除4且不能整除100的为闰年 xff08 如2004年就是闰年 1900年不是闰年 xff0
  • 祝天下所有程序员们,天天2020-1024快乐,程序员狂欢日燥起来!

    hello 程序员 xff01 hello world xff01 1GB 61 1024M xff0c 1M 61 1024K xff0c 1KB 61 1024B 1024 被认为是一个只有程序员才懂的数字 在这个特殊的日子里 有这么一
  • C语言期末基础知识大盘点!拒绝挂科,从我做起,争做别人家的娃!

    一 C语言基本常识 1 语言由函数组成 2 main是程序入口 3 C语言中不能出现中文或中文字符 xff08 注释和字符串除外 xff09 关键字 xff1a C语言提供表示特殊含义的单词 特点 xff1a 1 全部小写 xff1b 2
  • C语言小写转大写,小写字母转换成大写字母!

    在 C 语言中区分字母的大小写 xff0c 利用 ASCII 码中大写字母和小写字母之间的转换关系 xff08 差值为 32 xff09 xff0c 可以将小写字母转换为大写字母 编写程序实现 xff0c 从键盘上输入一个小写字母 xff0
  • 【C语言程序设计】C语言求亲密数!

    问题描述 如果整数A的全部因子 xff08 包括1 xff0c 不包括A本身 xff09 之和等于B xff1b 且整数B的全部因子 xff08 包括1 xff0c 不包括B本身 xff09 之和等于A xff0c 则将整数A和B称为亲密数
  • 盘点中国顶级黑客Top10,雷军也名列其中!

    第一名 xff1a 袁仁广 别名 xff1a 大兔子 datuzi xff0c 人称袁哥 提起袁任广 xff0c 知道的人或许并不多 但如果提起袁哥或者大兔子 xff0c 在国内安全业界称得上尽人皆知 在国内 xff0c 他的windows
  • 各互联网大厂办公室恋情政策盘点:禁止同部门,上下级是常态!

    互联网大厂的员工以年轻人居多 xff0c 非常容易在工作接触中产生感情 虽然 情不知所起 xff0c 一往而深 xff0c 但却不是每家公司都能理解和包容办公室恋情 xff0c 甚至还会出现 棒打鸳鸯 的冷酷现象 看完这几家大厂的政策 xf
  • 最大信息系数(MIC)——大数据时代的相关性分析

    在信息爆炸的当今社会 xff0c 单靠人力已经不能在无穷无尽的数据中有效的捕获信息 数据挖掘这一学科的兴起也预示着在各行业即将展开一场数据革命 在大数据集中识别两个变量的相关关系越来越重要 数据的相关性又分为线性相关和非线性相关 利用Pea
  • C语言开发《扫雷》游戏,你从未体验过的联网对战版

    一 简介 单机版扫雷总会有些枯燥 xff0c 不妨试试联网对战版扫雷 xff01 开发环境 xff1a VS2019 43 EasyX 20210224 游戏玩法 xff1a 左键按下翻开方块 xff0c 翻开雷判输 xff0c 或翻开最后
  • C语言趣味小游戏开发《找方块》!测试你眼力见的时候到了~

    程序介绍 该程序是仿照最近网上流行的找方块游戏编写的 xff0c 虽然没有仿照的一模一样 xff0c 但是也实现了他的一些功能 个人觉得可玩性还是挺高的 xff0c 是一个不错的娱乐放松的游戏 编写简介 该游戏的编写还是挺容易的 xff0c
  • C语言高仿贪吃蛇大作战,800行代码就能实现,结尾有源码~

    这是一个贪吃蛇大作战类游戏 xff0c 修改特性为 AI 不互杀 xff1b 该程序有四个类 xff1a 蛇基类 SnakeBase xff0c 玩家类 Player xff0c AI 类 xff0c Game 类 xff1b SnakeB
  • 黑苹果10.15.2 安装总结记录

    先展示一下我这一次折腾的最终效果 xff1a 桌面显示正常 xff0c wifi正常 xff0c 核显正常 xff0c 蓝牙没弄 xff0c 声卡没弄 安装vs for mac xff0c 微信 xff0c 网易云音乐 xff0c 打开多个
  • docker容器技术基础入门

    docker容器技术基础入门 容器 Container 传统虚拟化与容器的区别Linux容器技术Linux NamespacesCGroupsLXCdocker基本概念docker工作方式docker容器编排 容器 Container 容器
  • C++中的future和promise使用方法

    future和promise C 43 43 11中std future提供了一种访问异步操作结果的机制 异步操作不能马上就获取操作结果 xff0c 只能在未来某个时候获取 xff0c 但可以以同步等待的方式来获取结果 xff0c 可以通过
  • select、poll、epoll简介

    select poll epoll都是IO多路复用机制 xff0c 都可实现同时监听多个I O事件的状态 xff0c 多路复用就是通过一种机制监视多个描述符 xff0c 一旦某个描述符读或者写就绪就能通知代码进行读写操作 本质他们都是同步I