select,epoll,poll比较
select,poll,epoll简介 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是: 1 单个进程可监视的fd 数量被限制 2 需要维护一个用来存放大量fd的数据结构,这样会使得用 户空间和内核空间在传递该结构时复制开销大 3 对socket进行扫描时是 线性扫描 poll poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后 查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。 它 没有最大连接数的限制 ,原因是它是基于链表来存储的,但是同样有一个缺点: 大量的fd的数组被整体 复制于用户态和内核地址空间之间 ,而不管这样的复制是不是有意义。 poll还有一个特点是“水平触发” , 如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd 。 epoll epoll支持水平触发和边缘触发,最大的特点在于边缘触发, 它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。 在前面说到的复制问题上,epoll使用mmap减少复制开销。 还有一个特点是, epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd