nginx常用事件驱动模型

Nginx的事件驱动模型,支持select、poll、epoll、rtsig、kqueue、/dev/poll、eventport等。

实际应用中最常用的三种是select、poll、 epoll,其他模型可以了解一下,下面简单介绍下其他的模型,后面重点介绍最常用的三种模型。


rtsig是Real-Time Signal的缩写,是实时信号的意思。从严格意义上说,rtsig模型并不是常用的事件驱动模型,但Nginx服务器使用了使用实时信号对事件进行响应的支持,官方文档中将rtsig模型与其他的事件驱动模型并列。


其中kqueue模型用于支持BSD系列平台的事件驱动模型。kqueue是poll模型的一个变种,本质上和epoll一样,可以理解为支持不同的平台。


/dev/poll是Unix平台的事件驱动模型,其主要在Solaris7及以上版本、HP/UX11.22及以上版本、IRIX6.5.15及以上版本、Tru64 Unix 5.1A及以上版本的平台使用。


eventport是用于支持Solaris10及以上版本的事件驱动模型。


下面介绍前面三种常用的模型

  • select模型

select模型是各个版本的Linux和Windows平台都支持的基本事件驱动模型库,并且在接口的定义上也基本相同,只是部分参数的含义略有差异。

使用select模型的一般步骤是:

  1. 创建所关注事件的描述符集合,对于一个描述符,可以关注其上面的读(Read)事件、写(Write)事件以及异常发生(Exception)事件。

在select模型中,要创建这3类事件描述符集合,分别用来收集读事件、写事件和异常事件的描述符。

  1. 调用底层提供的select()函数,等待事件发生。这里需要注意的一点是,select的阻塞与是否设置非阻塞I/O是没有关系的
  2. 轮询所有事件描述符集合中的每一个事件描述符,检查是否有相应的事件发生,如果有就进行处理。

Nginx服务器在编译过程中如果没有为其指定其他高性能事件驱动模型库,它将自动编译该库。我们可以使用–with-select_module和–without-select_module两个参数强制Nginx是否编译该库。

  • poll模型

poll模型是Linux平台上的事件驱动模型,在Linux2.1.23中引入的,Windows平台不支持该模型。poll模型和select模型工作方式基本相同,区别在于,select模型创建了3个描述符集合,而poll模型只创建一个描述符集合。

poll模型只需要创建一个集合,在每个描述符对应的结构上分别设置读事件、写事件或者异常事件,最后轮询的时候,可以同时检查这三种事件是否发生。可以说,poll模型是select库的优化实现。
Nginx服务器在编译过程中如果没有为其制定其他高性能事件驱动模型库,它将自动编译该库。我们可以使用–with-poll_module和–without-poll_module两个参数强制Nginx是否编译该库。

  • epoll模型

epoll模型属于poll模型的变种,在Linux2.5.44中引入。是Nginx服务器支持的高性能事件驱动库之一,它是公认的非常优秀的事件驱动模型,和poll模型及select模型有很大的不同。epoll比poll更加高效,原因在于它不需要轮询整个描述符集合,而是Linux内核会关注事件集合,当有变动时,内核会发来通知。

poll模型和select模型在实际工作中,最大的区别在于效率,它们的处理方式都是创建一个待处理事件列表,然后把这个列表发给内核,返回的时候,再去轮询检查这个列表,以判断事件是否发生。这样在描述符比较多的应用中,效率就显得比较低下了。一种比较好的做法是,把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符列表发送通知给进程,这样就避免了轮询整个描述符列表。

epoll模型是目前在Linux平台上新能最好的模型,下面重点介绍下epoll的工作原理。

epoll的工作原理
  1. 首先,epoll模型通过相关调用通知内核创建一个由N个描述符的事件列表。然后,给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体的编码过程中也可以通过相关调用对事件列表中的描述符进行修改和删除。
  2. 完成设置之后,epoll就开始等待内核通知事件发生了。某一事件发生后,内核将发生事件的描述符列表上报给epoll。得到事件列表的epoll,就可以进行事件处理了。

epoll在Linux平台上是最高效的,它支持一个进程打开大数目的事件描述符,上限是系统可以打开文件的最大数目。同时,epoll的IO效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。

通过事件驱动模型介绍可以看出,Nginx服务器针对不同的Linux或Unix衍生平台提供了多种事件驱动模型的处理,尽量发挥系统平台本身的优势,最大程度地提高处理客户端请求事件的能力。在实际工作中,我们需要根据具体情况和应用情景选择使用不同的事件驱动模型,以保证Nginx服务器的高效运行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

banche168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值