IO多路复用之select、poll、epoll

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。web

与多进程和多线程技术相比,I/O多路复用技术的最大优点是系统开销小,系统没必要建立进程/线程,也没必要维护这些进程/线程,从而大大减少了系统的开销。多线程

目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll,I/O多路复用就是经过一种机制,一个进程能够监视多个描述符,一旦某个描述符就绪(通常是读就绪或者写就绪),可以通知程序进行相应的读写操做。但select,pselect,poll,epoll本质上都是同步I/O,由于他们都须要在读写事件就绪后本身负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需本身负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。并发

关于I/O多路复用(又被称为“事件驱动”),首先要理解的是,操做系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它能够给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪一个描述符可读了,我才去执行read操做,能够保证每次read都能读到有效数据而不作纯返回-1和EAGAIN的无用功。写操做相似。操做系统的这个功能经过select/poll/epoll/kqueue之类的系统调用函数来使用,这些函数均可以同时监视多个描述符的读写就绪情况,这样,多个描述符的I/O操做都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个进程/线程。异步

在select/poll中,进程只有在调用必定的方法后,内核才对全部监视的文件描述符进行扫描,而epoll事先经过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用相似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便获得通知。(此处去掉了遍历文件描述符,而是经过监听回调的的机制。这正是epoll的魅力所在。)socket

注意:svg

若是没有大量的idle-connection或者dead-connection,epoll的效率并不会比select/poll高不少,可是当遇到大量的idle-connection,就会发现epoll的效率大大高于select/poll。函数

select、poll、epoll区别# 性能

  1. 支持一个进程所能打开的最大链接数:
    操作系统

  2. FD剧增后带来的IO效率问题:
    线程

  3. 消息传递方式

综上,在选择select,poll,epoll时要根据具体的使用场合以及这三种方式的自身特色:

表面上看epoll的性能最好,可是在链接数少而且链接都十分活跃的状况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制须要不少函数回调。

select低效是由于每次它都须要轮询。但低效也是相对的,视状况而定,也可经过良好的设计改善。

参考:
https://www.jianshu.com/p/486b0965c296

相关文章
相关标签/搜索