网络IO模型 select poll epoll的区别

ops/2024/12/1 8:38:59/

poll>epollselectpoll的对比

1. 用户态将文件描述符传入内核的方式

select:创建3个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd数量限制,默认是1024。

poll:将传入的struct pollfd结构体数组拷贝到内核中进行监听。

poll>epoll:执行poll>epoll_create会在内核的高速cache区中建立一颗红黑树以及就绪链表(该链表存储已经就绪的文件描述符)。接着用户执行的poll>epoll_ctl函数添加文件描述符会在红黑树上增加相应的结点。

2. 内核态检测文件描述符读写状态的方式

select:采用轮询方式,遍历所有fd,最后返回一个描述符读写操作是否就绪的mask掩码,根据这个掩码给fd_set赋值。

poll:同样采用轮询方式,查询每个fd的状态,如果就绪则在等待队列中加入一项并继续遍历。

poll>epoll:采用回调机制。在执行poll>epoll_ctl的add操作时,不仅将文件描述符放到红黑树上,而且也注册了回调函数,内核在检测到某文件描述符可读/可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中。

3. 找到就绪的文件描述符并传递给用户态的方式

select:将之前传入的fd_set拷贝传出到用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。

poll:将之前传入的fd数组拷贝传出用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。

poll>epollpoll>epoll_wait只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。

4. 重复监听的处理方式

select:将新的监听文件描述符集合拷贝传入内核中,继续以上步骤。
poll:将新的struct pollfd结构体数组拷贝传入内核中,继续以上步骤。
poll>epoll:无需重新构建红黑树,直接沿用已存在的即可。

poll>epoll更高效的原因

selectpoll的动作基本一致,只是poll采用链表来进行文件描述符的存储,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会。

selectpollpoll>epoll虽然都会返回就绪的文件描述符数量。但是selectpoll并不会明确指出是哪些文件描述符就绪,而poll>epoll会。造成的区别就是,系统调用返回后,调用selectpoll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而poll>epoll则直接处理即可。

selectpoll都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而poll>epoll创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap()文件映射内存加速与内核空间的消息传递:即poll>epoll使用mmap减少复制开销。

selectpoll采用轮询的方式来检查文件描述符是否处于就绪态,而poll>epoll采用回调机制。造成的结果就是,随着fd的增加,selectpoll的效率会线性降低,而poll>epoll不会受到太大影响,除非活跃的socket很多。

poll>epoll的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符

虽然poll>epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,selectpoll的性能可能比poll>epoll好,毕竟poll>epoll的通知机制需要很多函数回调。


http://www.ppmy.cn/ops/10686.html

相关文章

48-PCIE转串口和并口电路设计

视频链接 PCIE转串口和并口电路设计01_哔哩哔哩_bilibili PCIe转串口和并口电路设计 1、PCIe转串并口电路设计基本介绍 2、PCIe转串口和并口的方案(京东) 2.1、PCIe转串口 2.1.1、ASIX (亚信)MCS9922-PCIe转2路RS232扩展卡 2.1.2、ASIX (亚信)MCS9900-PCIe转4路RS232扩展卡…

论文阅读:BEVBert: Multimodal Map Pre-training for Language-guided Navigation

BEVBert:语言引导导航的多模态地图预训练 摘要 现存的问题:目前大多数现有的预训练方法都采用离散的全景图来学习视觉-文本关联。这要求模型隐式关联全景图中不完整、重复的观察结果,这可能会损害智能体的空间理解。 本文解决方案&#xf…

web前端练习三

一.随机点名程序 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 <!DOCTYPE html> <html lang"en"> <head><meta…

大数据——Zookeeper 安装(集群)(二)

Zookeeper 补充 CountDownLatch&#xff1a;闭锁。会对线程进行计数&#xff0c;在计数归零之前&#xff0c;之前的线程会被阻塞&#xff1b;当计数归零之后&#xff0c;被阻塞的线程就会自动放开继续执行CyclicBarrier&#xff1a;栅栏。会对线程进行计数&#xff0c;在计数…

dpkg clashupdown dns缓存

alias clashup“source $HOME/my-config/clash_up.sh” alias clashdown“source $HOME/my-config/clash_down.sh” curl ipinfo.io dpkg -i&#xff1a;安装软件包&#xff1b; -r&#xff1a;删除软件包&#xff1b; -P&#xff1a;删除软件包的同时删除其配置文件&#xf…

【漏洞复现】网动统一通信平台meetingShow接口处存在任意文件下载漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

2024年短剧小程序视频解析#下载高手

2024年短剧小程序视频解析 | 点击获取绝妙剧情&#xff01;利用下载高手&#xff0c;轻松下载所有精彩片段&#xff01; 这里已经将下载高手打包好了&#xff0c;有需要的自己取一下 下载高手链接&#xff1a;https://pan.baidu.com/s/1KtR6830x8GciKtNcSRhQMg?pwd1234 提取…