Select:POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。
缺点
1 2 3 4 | 1、单个进程能够监视的文件描述符fd的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义FD_SETSIZE,再重新编译内核实现,但是这样也会造成效率的降低 2、对socket是线性扫描,即采用轮询的方法,效率较低 3、 select 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 |
epoll:在Linux 2.6内核中提出的select和poll的增强版本
1 2 | 1、支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次(默认LT) 2、使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知 |
优点:
1 2 3 | 1、没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口),具体查看 /proc/sys/fs/file-max ,此值和系统内存大小相关 2、效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关 3、内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销 |
Apache是基于一个线程处理一个请求的非阻塞IO并发策略 , Nginx使用的是一个进程处理多个连接、非阻塞IO模式 。
现在大部分网站都是动态的,响应时间较长,需要较多连接数。并且服务端主动关闭连接后会使连接处于TIME_WAIT状态,epoll模型只关注活跃状态连接,效率较好,apache的select模型轮询全部连接,效率差一些。