Linux中高级IO多路转接中select、poll和epoll的优缺点,这里主要谈select和poll的缺点以及epoll的优势。缓存
1、select的缺点:数据结构
一、编写难度大性能
二、同时处理的文件描述符是有上限的操作系统
三、每次须要从新设定fd集合队列
四、性能会随用户的增多而效率下降事件
五、输入输出参数在一块儿内存
2、poll的缺点it
poll是对select的一种改良,最突出的改良有两点:效率
一、文件描述符数量没有上限监控
二、将输入输出参数进行分离,不用每次设定
那么poll的缺点是:
poll中监听的文件描述符数目增多时:
一、和select同样,poll返回后,须要轮询pollfd来获取就绪的描述符
二、每次调用poll都须要大把大量客户端在一时刻可能只有不多的处于就绪状态,所以随着监视的描述符数量的增加,其效率也会线性降低。
3、epoll的优势:
一、文件描述符数目没有上限:经过epoll_ctl()来注册一个文件描述符,内核中使用红黑树的数据结构来管理全部须要监控的文件描述符。
二、基于事件就绪通知方式:一旦被监听的某个文件描述符就绪,内核会采用相似于callback的回调机制,迅速激活这个文件描述符,这样随着文件描述符数量的增长,也不会影响断定就绪的性能。
三、维护就绪队列:当文件描述符就绪,就会被放到内核中的一个就绪队列中,这样调用epoll_weit获取就绪文件描述符的时候,只要取队列中的元素便可,操做的时间复杂度恒为O(1)。
四、关于有些地方说:epoll还有内存映射机制,即内核将就绪队列经过mmap的方式映射到用户态,避免了拷贝内存这样的额外性能开销。关于这一点,我并不认为这是epoll的优势,由于他和epoll底层工做方式相悖。mmap是一种共享内存,可是咱们都知道共享内存中一旦有数据,用户就能直接看到,而且使用,可是epoll_wait在取数据时传入了一块缓存区这是和贡献内存相悖的其一;其二是操做系统并不相信任何人,尤为是用户,它不会让用户直接去取内核中的数据。