接上一篇 http://www.cnblogs.com/charlesblc/p/6241926.html
来源:
https://zhuanlan.zhihu.com/p/20204159
网上关于Apache和Nginx性能比较的文章非常多,基本上有如下的定论:
这里我们要着重讨论的是为什么Nginx在并发性能上比Apache要好很多。
非阻塞&事件驱动这么好,为什么大家没有一开始就采用这种方式呢? 原因有二:
epoll是Linux内核的可扩展I/O事件通知机制。它设计目的只在取代既有POSIX select(2)与poll(2)系统函数,让需要大量操作文件描述符的程序得以发挥更优异的性能 (举例来说:旧有的系统函数所花费的时间复杂度为O(n),epoll则耗时O(1))。 epoll与FreeBSD的kqueue类似,底层都是由可配置的操作系统内核对象建构而成, 并以文件描述符(file descriptor)的形式呈现于用户空间。
epoll由下面几个系统调用组成:
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event * event);
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
为了解决高并发问题,大约在2000年,Jonathan Lemon在FreeBSD内核中实现了第一个版本 的kqueue,并在FreeBSD 4.1版本发布。之后FreeBSD在处理高并发的问题上一直领先于Linux。
各种操作系统在解决这个问题的办法上也是百花齐放:
技术操作系统kqueueUNIX (FreeBSD、MacOS)epollLinux 2.5.44/2.6.9IOCP (IO Completion Port)Windows NT 3.5, AIX, Solaris 10第三篇
下面是WikiPedia对于libevent的介绍:
libevent是一个异步事件处理软件函式库,以BSD许可证发布。 libevent提供了一组应用程序编程接口(API),让程序员可以设定某些事件发生时所执行的函式,也就是说,libevent可以用来取代网络服务器所使用的事件循环检查框架。
由于可以省去对网络的处理,且拥有不错的效能, 有些软件使用libevent作为网络底层的函式库,如:Chromium(Chrome的开源版)、 memcached、Tor。
按照libevent的官方网站,libevent库提供了以下功能:当一个文件描述符的特定事件 (如可读,可写或出错)发生了,或一个定时事件发生了, libevent就会自动执行用户指定的回调函数,来处理事件。
二者的差异在于Level Triggered模式下只要某个socket处于readable/writable状态, 无论什么时候进行epoll_wait都会返回该socket;
而Edge Triggered模式下只有某个socket从unreadable变为readable或 从unwritable变为writable时,epoll_wait才会返回该socket。
原文:http://www.cnblogs.com/charlesblc/p/6341265.html