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简介 的相关文章

  • 如何使用 Solr 选择不同的字段值?

    我想做与此 SQL 相同的操作 但使用 Solr 作为我的数据存储 SELECT DISTINCT txt FROM my table 什么语法会强制 Solr 只给我不同的值 http localhost 8983 solr select
  • MYSQL - 从大表中的第二行选择数据

    我有一个外部第3方程序将数据库实时导出到mysql 我想显示数据以进行报告 所以 我无法更改结构 因为它是实时同步的 表结构是这样的 ID Date Transaction 12 2012 11 01 200 12 2012 11 02 2
  • epoll_wait()接收socket关闭两次(read()/recv()返回0)

    我们有一个使用 epoll 来侦听和处理 http 连接的应用程序 有时 epoll wait 会连续两次收到 fd 上的 close 事件 含义 epoll wait 返回连接 fd 其中 read recv 返回 0 这是一个问题 因为
  • 选择输入字段中的文本,但无法编辑

    我有一个简单的文本输入字段
  • SQL Server 的 SELECT JOIN 语句导致的死锁

    当执行带有两个表的 JOIN 的 SELECT 语句时 SQL Server 似乎 分别锁定语句的两个表 例如通过像这样的查询 这 SELECT FROM table1 LEFT JOIN table2 ON table1 id table
  • Mysql 选择行的总和

    我有一张包含以下信息的表 id Item ID stock package id amount price 0 775 1 16 0 22 1 758 2 10 0 28 2 775 3 10 0 30 3 774 4 10 0 25 4
  • 如何在jQuery中选择HTML5数据属性?

    我当前的 jQuery 选择 value 属性 如何更改 jQuery 以选择数据属性 data price trapfabric trapsize on change function var selected trapfabric tr
  • MySQL SELECT 中的条件 SELECT

    Table id price is active 1 20 99 0 2 10 99 1 3 30 99 0 4 15 99 1 5 35 99 1 我试图选择 is active 等于 1 的所有行的 COUNT 所以我使用了这个简单的查
  • mysql 假选择

    我的目的是 从值列表中获取多行 例如 1 2 3 4 5 a b c anything 等 mysql gt select id from accounts where id in 1 2 3 4 5 6 id 1 2 3 5 6 5 ro
  • 从单个表中选择同一列两次但条件不同

    我想显示员工的姓名和号码以及老板的号码和姓名 如下所示 只有一张表 到目前为止我尝试过 SELECT ID Name Boss SELECT Name FROM Employees WHERE ID IN SELECT Boss FROM
  • 将多个值插入隐藏字段

    我有一个选择列表 您可以在其中选择多个城市 选择城市时 我想将邮政编码添加到隐藏字段 我现在的解决方案将值插入到隐藏字段 但是 当 fx 时它会覆盖该值 单击一个新城市 它应该只附加到值中 例如 value value1 value2 va
  • 跳出选择循环?

    我正在尝试使用select在循环中接收消息或超时信号 如果收到超时信号 则循环应中止 package main import fmt time func main done time After 1 time Millisecond num
  • 将一项选择中的两项计数相除

    我有一个这样的表 date timestamp Error integer someOtherColumns 我有一个查询来选择特定日期的所有行 SELECT from table WHERE date date 2010 01 17 现在
  • 如何在选择查询中创建新列

    在 MS Access 中 我想将新列插入到选择查询的返回结果中 新列的每一行都具有相同的值 例如 我的选择返回列 A B 我希望 C 成为选择查询创建的新列 A B C a1 b1 c a2 b2 c a3 b3 c select A B
  • 如何使用jquery打开选择输入

    所以我可以看到选择元素的选项 但我需要单击它 如果我想使用一个函数怎么办 当发生某些事情时 应该选择此选择元素 这意味着列表已打开并且我可以看到选项 我不希望用户单击选择元素 我想要其他东西来打开它 我尝试过的 select select
  • MySQL:选择 DISTINCT / UNIQUE,但返回所有列?

    SELECT DISTINCT field1 field2 field3 FROM table 我正在尝试完成以下 SQL 语句 但我希望它返回所有列 这可能吗 像这样的东西 SELECT DISTINCT field1 FROM tabl
  • Linq:Select 和Where 之间有什么区别

    The Select and WhereLinq 中提供了方法 对于这两种方法 每个开发人员都应该了解什么 例如 何时使用其中一种而不是另一种 使用一种相对于另一种的优势等 Where 查找匹配的项目并仅返回匹配的项目 过滤 gt IEnu
  • 选择不带 FROM 但有多于一行的选择

    如何在不从现有表中进行选择的情况下生成 2 行 2 列的表 我正在寻找的是一个返回的选择语句 e g id value 1 103 2 556 Use UNION http dev mysql com doc refman 5 0 en u
  • MySql JOINS 的优点/缺点

    当我从多个表中选择数据时 我经常使用 JOINS 最近我开始使用另一种方式 但我不确定从长远来看会产生什么影响 例子 SELECT FROM table 1 LEFT JOIN table 2 ON table 1 column table
  • MySQL - 选择一行 - 然后相对于所选行的下一个和上一个

    我会尽力澄清这一点 我需要在不使用 id 的情况下选择特定行和该选定行的前一个相对行以及该选定行的下一个相对行 这可能吗 简而言之 上一篇和下一篇 我不能 也许我只是不知道如何 使用 id 的原因是因为它们不是按顺序排列的 正如您从这个相当

随机推荐

  • 蜂鸣器及其原理

    蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器 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