IO多路复用-select、poll、epoll的区别

 

IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件就绪状态,如果有一个文件描述符就绪,则通知应用程序进行相应的读写操作,否则阻塞直到超时。多路是指网络连接,复用是指同一个线程。

为什么有IO多路复用机制?

没有IO多路复用机制时,有BIO、NIO两种实现方式,但有一些问题。

IO多路复用的三种实现方式

  • select—>时间复杂度O(n) 具有O(n)的无差别轮询复杂度,效率较低,同时处理的流越多,无差别轮询时间就越长;单个进程所打开的fd是有限制的,具体fd数量可以cat /proc/sys/fs/file-nr查看 。

  • poll —>时间复杂度O(n) poll本质上和select没有区别,但是fd没有限制

  • epoll—>时间复杂度O(1) epoll有.水平触发(LT)和边缘触发(ET)两种触发模式,LT是默认的模式,ET是高速模式,LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,ET模式下,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要把它的buffer读完。 event poll,epoll会把哪个流发生了怎样的I/O事件通知给用户,应用在nginx/redis。

epoll的优点:

  • 没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
  • 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
  • 内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。