Nginx与Apache的比较

     Nginx和apache本质上的不同其实是体现在资源I/O上,nginx采用的是epoll模型,也就是使用epoll_create、epoll_ctl、epoll_wait这几个函数组成的模型去代替了传统的select/poll模型,后者模型中的select函数即在处理socket常用的检测套接字变化的函数(做websocket时有用过),两种模式不同之处在于select是轮询监控列表,而epoll是注册事件,事件驱动机制,当套接字准备好会自动发送信号,不用每个套接字都去轮询,这对于高I/O的网络应用来说,当然效率高非常多,所以才有了nignx处理静态资源比apche快3倍之说,

     事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。

     也就是事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。(cpu和io的阻塞是不同的,在处理大量数据计算时,cpu肯定是要被占用的,即整体阻塞的,而io一般是cpu给个信号,外设存储设备自己把数据传过来,阻塞状态下也不影响cpu处理逻辑,比如说监听套接字等)

附:select函数会维护3个描述附集,分别是读集,写集和异常集,每个描述符集可以看成是一个字节数组,例如读集数据是100100,那么表示描述符id为1和为4的将进行可读性检测(这里需要当做二进制一位一位的看),对描述符集进行检测时,未准备好的描述符位会置0,就是说完成检测后的描述符集就是已经准备好的而不是原来待检测的描述符集了!注意如果一次检测都没有准备好,就全部置0,再次select时需要重新分配。

猜你喜欢

转载自blog.csdn.net/github_38392025/article/details/79057672