返回

Socket入门之I/O多路复用select/poll/epoll有何不同?

后端

select/poll/epoll有何不同?

select/poll/epoll都是I/O多路复用技术,它们的主要作用是允许一个进程同时监听多个文件符(如套接字),以便在这些文件符上有数据可读或可写时通知进程。select、poll和epoll都是I/O多路复用技术的典型代表,它们都是为了解决服务器并发问题而诞生的。

  • select :select是最初的多路复用技术,它使用一个select函数来监视一组文件描述符,当任何一个文件描述符有数据可读或可写时,select函数都会通知进程。select函数是基于轮询的方式来工作的,即依次检查每个文件描述符的状态,直到找到一个有数据可读或可写的文件描述符。select函数的最大缺点是它只能监视有限数量的文件描述符,而且当文件描述符数量过多时,select函数的性能会急剧下降。
  • poll :poll是select的改进版,它使用了一个poll函数来监视一组文件描述符。poll函数与select函数最大的区别在于,poll函数可以同时监视的文件描述符数量不受限制。poll函数也是基于轮询的方式来工作的,但是它使用了一个更优化的算法来检查文件描述符的状态,因此poll函数的性能比select函数更好。
  • epoll :epoll是linux内核中实现的I/O多路复用技术,它使用了一个epoll_create函数来创建epoll实例,然后使用epoll_ctl函数来向epoll实例中添加或删除文件描述符。epoll_wait函数用于等待epoll实例中的文件描述符上有数据可读或可写时通知进程。epoll的优点是它可以同时监视的文件描述符数量不受限制,而且epoll的性能比select和poll都要好。

如何选择适合自己的多路复用技术?

在选择多路复用技术时,需要考虑以下几个因素:

  • 文件描述符的数量 :如果需要同时监视的文件描述符数量较少,那么可以使用select函数。如果需要同时监视的文件描述符数量较多,那么可以使用poll函数或epoll函数。
  • 性能 :如果需要更高的性能,那么可以使用poll函数或epoll函数。
  • 平台 :如果需要在linux系统中使用多路复用技术,那么可以使用epoll函数。

总结

select、poll和epoll都是I/O多路复用技术,它们的主要作用是允许一个进程同时监听多个文件描述符(如套接字),以便在这些文件描述符上有数据可读或可写时通知进程。select、poll和epoll都是I/O多路复用技术的典型代表,它们都是为了解决服务器并发问题而诞生的。select是最初的多路复用技术,poll是select的改进版,epoll是linux内核中实现的I/O多路复用技术。在选择多路复用技术时,需要考虑以下几个因素:文件描述符的数量、性能和平台。