Nginx为什么比Apache快

说道这个问题首先应该了解,什么是多路复用IO,-->请查看我另外一个关于IO的基础知识篇


Nginx与Apache都用到了多路复用IO模式,但是两个不同的是,Nginx用的是epoll,而Apache用的是select

(注:多路复用IO一般用到的有select、poll、epoll)

一个应用程序的写操作的流程:

        例如写一个字符串hello word ,运行程序的时候,程序会先将hello word放入自己的缓冲区(buffer),然后write的时候拷贝到C库的CLIB buffer中(C库标准IOBuffer),write返回的时候hello word其实还在CLIB buffer中,这个时候如果进程给kill掉,则数据会丢失,当执行fclose的时候才会将数据刷新的磁盘中,当然还有一个函数fflush函数,不过,fflush函数只是将hello word拷贝到了page cache中,这个时候并没有进入磁盘,不过如果将应用进程core掉后数据不丢失,此时已经是系统层了,要想将数据刷新到磁盘中需要调用fsync函数


         如果想直接将hello word复制到page cache中有没有办法呢?可以用sys_write那么将直接把hello word拷贝到了page cache(注意:这里会产生一个状态。用户态与内核态的转换),不过可以用MMap来处理,通过这种映射关系,用户则可以像调用自己内存一样调用系统内存(更详细的请翻阅其他资料),当数据到达page cache的时候他不会先将hello word往下传,而是先把hello word返回到用户的内存,这是一个异步的,这个时候内核的pdflush会不断检测是否有脏页,判断是否要写回到磁盘中,然后进入内核的IO队列,接着调用驱动器将数据写入到磁盘


select:当应用程序写文件指令发出的期间,select模式会每隔一定时间去询问、查看文件上是够写入成功,如果写入成功,通过轮循来实现,并且线性扫描所有的socket,这个期间不管,这个socket是否活动,这个期间将阻塞

epoll:当应用程序写文件指令发出的期间,epoll会等待,直到数据返回。期间不会做多次询问与查看,而是通过fd 的 callback来实现,并且返回的不是直接的数据,而是返回的一个代表就绪符的数量,拿到这些值后epoll在去指定的数组中依次取得相应的文件描述符,这个中间使用了内存映射(mmap),所以只有活跃的soket才会触发


个人理解,如果有不对的地方或者疑问的地方请拍砖

你可能感兴趣的:(Nginx为什么比Apache快)