从Nginx、Apache工作原理看为什么Nginx比Apache高效( 二 )


select()所维护的 存储大量文件描述符的数据结构,随着文件描述符数量的增长,其在用户态和内核的地址空间的复制所引发的开销也会线性增长
由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()还是会对 所有的socket进行一次线性扫描,会造成一定的开销
poll:poll是unix沿用select自己重新实现了一遍,唯一解决的问题是poll 没有最大文件描述符数量的限制
epoll模型:(nginx使用)
epoll带来了两个优势,大幅度提升了性能:
基于事件的就绪通知方式,select/poll方式,进程只有在调用一定的方法后,内核才会对所有监视的文件描述符进行扫描,而epoll事件通过epoll_ctl()注册一个文件描述符,一旦某个文件描述符就绪时,内核会采用类似call back的回调机制,迅速激活这个文件描述符,epoll_wait()便会得到通知
调用一次epoll_wait()获得就绪文件描述符时,返回的并不是实际的描述符,而是一个代表就绪描述符数量的值,拿到这些值去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里使用内存映射(mmap)技术,避免了复制大量文件描述符带来的开销
当然epoll也有一定的局限性,epoll只有linux2.6才有实现,而其他平台都没有,这和apache这种优秀的跨平台服务器,显然是有些背道而驰了 。
【从Nginx、Apache工作原理看为什么Nginx比Apache高效】简单来说epoll是select的升级版,单进程管理的文件描述符没有最大限制 。但epoll只有linux平台可使用 。作为跨平台的Apache没有使用
 




推荐阅读