Linux中select poll和epoll的区别

如题所述

select、poll、epoll都是IO多路复用的机制,但是他们的机制有很大的区别

1、select 
select机制刚开始的时候,需要把fd_set从用户空间拷贝到内核空间,并且检测的fd数是有限制的,由FD_SETSIZE设置,一般是1024。

检测的时候,根据timeout,遍历fd_set表,把活跃的fd(可读写或者错误),拷贝到用户空间,

再在用户空间依次处理相关的fd。

这个机制是linux内核很早的版本,epool是根据select,pool基础上优化的,缺点比较多。

缺点:

1)每次调用select的时候需要把fd_set从用户空间拷贝到内存空间,比较耗性能。

2)wait时,需要遍历所有的fd,消耗比较大。

3)select支持的文件数大小了,默认只有1024,如果需要增大,得修改宏FD_SETSIZE值,并编译内核(麻烦,并且fd_set中的文件数多的话,每次遍历的成本就很大)。

2. pool
poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。

3. epool
epool是select和poll的改进版本,

* 先是使用int epoll_create(int size)在内存中创建一个指定size大小的事件空间,

* 再使用int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);事件注册函数,注册新的fd到epfd的epool对象空间中,并指明event(可读写啊等等),注意:在注册新事件fd的过程中,也再内核中断处理程序里注册fd对应的回调函数callback,告诉内核,一旦这个fd中断了,就把它放到ready队列里面去。

* 再使用int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);在epool对象对应的ready队列里取就绪的fd,并使用内存映射mmap拷贝到用户空间。

* 再在用户空间依次处理相关的fd。

优点:
1)支持一个进程打开大数目的socket描述符

select 一个进程打开FD是有限制的,由FD_SETSIZE设置,默认值是1024。epool可以打开的FD数可以很大,一般1GB的内存有10万多的FD数,具体数目可以cat /proc/sys/fs/file-max查看。
2) IO效率不随FD数目增加而线性下降

3) 使用mmap加速内核与用户空间的消息传递
温馨提示:内容为网友见解,仅供参考
无其他回答

select、poll、epoll之间的区别
效率高,尤其在活跃连接少时。总结来说,select和poll在大量连接且活跃时效率较低,而epoll在连接数大且活跃性分散时表现出色。选择哪种机制应根据实际应用场景和性能需求来决定。

Linux中select poll和epoll的区别
poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构,其他的都差不多。3. epool epool是select和poll的改进版本,先是使用int epoll_create(int size)在内存中创建一个指定size大小的事件空间,再使用int epoll_ctl(int epfd, int op, int fd, stru...

搞懂epoll和select和poll的区别|Linux高并发网络编程
首先,select和poll的共同点是,用户进程将待监控的socket的描述符(fd)传递给内核,内核会检查这些socket是否有活动。如果没有活动,线程会阻塞,等待socket被唤醒。它们的局限性在于,select的fd集合大小有1024的限制,而poll虽然改善了fd结构,但实际使用中已不太常见。epoll则是在优化上做了重大改进。...

说说epoll、poll、select的区别和联系
epoll、poll、select本质上都是I\/O多路复用技术,它们能够同步处理多个I\/O事件,减少系统开销。然而在性能、灵活性以及描述符数量处理上存在区别。select存在大量性能开销,因为它涉及频繁的用户态和内核态数据拷贝,并有限的文件描述符数量限制。poll克服了select的描述符数量限制,然而数据拷贝操作仍然是线性...

让你彻底明白select、poll 和 epoll 之间的区别
但性能更高。总的来说,select、poll和epoll是用于网络编程中I\/O多路复用的常见技术。select因性能较低和文件描述符数量限制而显得较为老旧,poll改进了性能和限制,而epoll则在性能上具有明显优势,并提供更灵活的工作模式。在实际应用中,选择适合的I\/O多路复用机制应根据具体需求和环境进行。

Linux内核中select,poll和epoll的区别
EPOLL:接下来分析epoll,与poll\/select不同,epoll不再是一个单独的系统调用,而是由epoll_create\/epoll_ctl\/epoll_wait三个系统调用组成,后面将会看到这样做的好处。先来看sys_epoll_create(epoll_create对应的内核函数),这个函数主要是做一些准备工作,比如创建数据结构,初始化数据并最终返回一个文件...

select,poll,epoll的区别以及使用方法
2. poll:1986年System V Release 3引入,没有select的最大文件描述符限制。同样会复制大量描述符,开销随描述符数量线性增加。poll也采用水平触发机制,但处理大量就绪描述符时效率较低。3. epoll:Linux 2.6及以后引入,是最高效的方法。epoll支持事件回调,减少拷贝开销,对大量描述符更友好。它支持...

I\/O--多路复用的三种机制Select,Poll和Epoll对比
一张图总结一下select,poll,epoll的区别:epoll是Linux目前大规模网络并发程序开发的首选模型。在绝大多数情况下性能远超select和poll。目前流行的高性能web服务器Nginx正式依赖于epoll提供的高效网络套接字轮询服务。但是,在并发连接不高的情况下,多线程+阻塞I\/O方式可能性能更好。既然select,poll,epoll...

深入理解select、poll和epoll及区别
select和poll的工作原理相似,它们都通过轮询所有文件描述符(fd)来检查哪些已经准备好进行读写操作。select的时间复杂度为O(n),而poll由于使用链表存储fd,没有最大连接数限制,但同样采用轮询,效率随着fd数量增加而下降。这两种方式在处理大量fd时,由于频繁的fd复制,开销较大。epoll则引入了革命性的...

说说epoll、poll、select的区别和联系
相比之下,poll与select类似,但没有最大文件描述符限制。然而,它仍然存在整体复制描述符的开销问题,开销随描述符数量增加而线性增大。epoll是poll的增强版,它通过使用一个文件描述符管理多个事件,减少了用户空间和内核空间之间的数据拷贝,显著提高了效率。epoll有两种工作模式:LT(水平触发)和ET(边沿...

相似回答