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才会触发


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值