nio空轮询 linux I/O多路复用模型,为什么epoll性能高于select和poll?
浏览量:1425
时间:2021-03-12 06:44:51
作者:admin
linux I/O多路复用模型,为什么epoll性能高于select和poll?
严格地说,这种说法是不准确的。Epoll的性能并不总是比select好。首先,我们需要了解select和Epoll的基本原理。
假设我们现在有100个套接字连接。select的方法是每隔一段时间轮询这100个连接,以确定是否存在网络事件。如果有,它会处理它们。
Epoll的方法是创建一个链表,然后告诉操作系统,如果100个连接中的任何一个发生网络事件,它将被放入链表中。然后epoll每隔一段时间就会检查链表中是否有元素,如果有则进行处理。
与select相比,epoll大大减少了空轮询次数,提高了轮询效率。同时,epoll使用MMAP对其进行优化,因为它需要在select轮询期间将所有连接的FD从内核复制到用户空间,这会增加IO开销。
然而,我们不能简单地说谁更好。
例如,如果100个连接的网络活动非常频繁,则select的每次轮询将很少或没有空轮询,select的无用功能将非常少。相反,epoll的性能会因为多了一步操作而变差。
因此,select适用于业务时间较短的短链接,如通用HTTP服务。Epoll适用于连接时间长但网络活动不频繁的场景,如聊天室。
epoll读到一半又有新事件来了,该怎么办?
Epoll需要与多个线程协同工作才能获得最佳性能。当轮询线程接收到IO时,它会立即将工作移交给预先分配的线程池以完成读写工作,而不是阻塞轮询线程。这样,就不会有读写另一个信号的问题。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。