下面了解一下Nginx的优势

  Nginx的优势在于处理大量并发请求,结合多进程和异步机制

  启动后会产生多个工作进程,进程可在配置中配置

  每个工作进程使用异步非阻塞方式,处理多个客户端请求,如果不能立即得到结果则去做其他事情,当得到结果后会通知工作进程

  得到通知后去响应客户端请求

现在就有一个问题,IO调用是如何把自己的状态通知给工作进程呢

  解决该问题的方案有两种

    1.间隔一段时间去检查是否执行完毕,但会造成时间和资源的浪费[不推荐]

    2.IO调用完成后能主动通知工作进程,使用select/poll/epoll/kqueue 被称为事件驱动模型

那么下面来讲解一下Nginx的事件驱动模型

事件驱动模型是Nginx服务器保障完成功能和良好性能的重要机制

  大多数网络服务器使用

    事件发送器每传递一个请求,将目标对象放入待处理事件列表,使用非阻塞I/O方式调用事件处理器来处理改请求

select模型,poll模型和epoll模型

select库

      linux和windows平台都支持,基本接口也相同,参数略有不同

      调用select()函数,等待事件发生,轮询所有事件,检测是否相应的事件发生

   poll库

      windows平台不支持,与select工作方式基本相同

      创建一个关注事件的描述符集合,等待事件发生,轮询描述集合,检查有没有事件发生

与select的区别:

        select库需要为读事件,写事件,异常事件分别创建一个集合,分别轮询三个集合

        poll库只有一个集合,在每个描述符对应的结构分别设置读事件,写事件,或者异常事件,轮询的时候,同时检查三种事情是否发生

poll是select的优化实现

      编译过程中没有指定其他高性能事件驱动模型库,默认自动编译该库

   epoll库

      epoll库最NB,和select,poll库有很大不同,epoll属于poll库的一个变种

      将描述符列表的管理交给内核负责,一旦事件发生,内核把发生的描述符通知给进程,避免了轮询整个描述符列表

   rtsig模型

      rtsig模型不常用,不介绍了

   其他事件驱动模型

      kqueue模型:一般在Mac OS X平台,和epoll没有本质区别

      /dev/poll模型:支持Unix衍生平台,在该平台建议使用

      eventport模型:用于支持Solaris10以上平台模型