event中将事件驱动模块,由于支持跨平台,抽象出了event模块。它支持的event类型有:

1、AIO(异步I/O)

2、/dev/poll(solaris和unix特有)

3、epoll(linux2.6特有)

4、eventport(solaris 10特有)

5、kqueue(BSD特有)

6、poll

7、rtsig(实时信号)

8、select

event模块的主要功能就是,监听accept后建立的连接,对读写事件进行添加删除。事件驱动模型和非阻塞I/O模型结合在一起使用。当I/O可读可写的时候,相应的读写事件就会被唤醒,此时会去处理事件的回调函数

对于Linux, nginx大部分event用epoll EPOLLET(边沿触发)的方法来唤醒事件,只有listen端口的读事件是EPOLLLT(水平触发),对于边沿触发,如果出现了可读事件,必须及时处理,否则可能会出现读事件不再触发而没有处理的情况。

event的结构体为:

typedef struct {ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);ngx_int_t  (*add_conn)(ngx_connection_t *c);ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);ngx_int_t  (*process_changes)(ngx_cycle_t *cycle, ngx_uint_t nowait);ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,ngx_uint_t flags);ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);void       (*done)(ngx_cycle_t *cycle);
} ngx_event_actions_t;

accept锁

当内核accpet一个连接时,会唤醒所有等待的进程,但实际上只有一个进程能获取连接,其它的进程都是无效唤醒的。

nginx的事件处理入口函数为ngx_process_events_and_timers(),其加锁过程为

if (ngx_use_accept_mutex) {if (ngx_accept_disabled > 0) {ngx_accept_disabled--;} else {if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {return;}if (ngx_accept_mutex_held) {flags |= NGX_POST_EVENTS;} else {if (timer == NGX_TIMER_INFINITE|| timer > ngx_accept_mutex_delay){timer = ngx_accept_mutex_delay;}}}}

在ngx_trylock_accept_mutex里,如果获取到了锁,就将listen的端口读事件加到event处理,等到有新连接到来时就可以accept了

ngx_process_events函数是所有事件处理的入口,它会遍历所有的事件。抢到accept锁的进程与一般进程有些区别,加上了NGX_POST_EVENTS标志表示ngx_process_events只是将事件放到post_events事件的队列中,而不处理。直到ngx_accept_mutex锁去掉后才去处理事件。为什么这样?因为这样做可以减小该进程抢到锁后,从accept开始到结束的时间,以便其它进程继续接收新的连接,提高吞吐量。

ngx_posted_accept_events和ngx_posted_events 分别是accept延迟事件队列和普通延迟事件队列。其实ngx_posted_accept_events还是放在ngx_accept_mutex锁里面处理的,该队列处理的都是accept事件,它会把内核backlog里等待的连接都accept进来,注册到读写事件中。

nginx中的event模块相关推荐

  1. 添加nginx中的stream模块

    注: 1.nginx从1.9.0开始,新增加了一个stream模块,所以本文适用于1.9.0版本以上的nginx. 2.没有特殊标注需要root的用普通nginx用户就可以,比如你在a用户下安装ngi ...

  2. 利用configure脚本将定制的模块加入到Nginx中

    在1.6节提到的configure执行流程中,其中有两行脚本负责将第三方模块加入到Nginx中,如下所示. . auto/modules . auto/make 下面完整地解释一下configure脚 ...

  3. NGINX中如何根据客户端IP地址控制访问

    NGINX Web 服务器安全加固有多种方法,其中一种是基于 IP 地址的访问控制.本指南解释了如何通过在 NGINX 中基于客户端的 IP 地址控制访问来保护 Web 应用程序. NGINX中基于客 ...

  4. Nginx学习之七-模块ngx_epoll_module详解(epoll机制在nginx中的实现)

    本文结合实际代码介绍事件驱动模块接口与epoll用法是如何结合起来发挥作用的.Nginx中ngx_epoll_module模块基于epoll实现了Nginx的事件驱动. 模块定义(src/event/ ...

  5. nginx模块定制开发中介入http模块的方法及NGX_HTTP_CONTENT_PHASE阶段的详细介绍

    ginx模块定制开发中,大多数都是针对http的模块的定制开发,比如添加一个打印"hello world"的功能.记录http请求内容.对http请求作出一个特殊响应等,此时,需要 ...

  6. centos 7.6——Nginx中rewrite模块应用(location)——基于域名的跳转等

    centos 7.6--Nginx中rewrite模块应用(location)--基于域名的跳转等 文章目录 centos 7.6--Nginx中rewrite模块应用(location)--基于域名 ...

  7. python中的log模块笔记

    日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四大组件记录日志 配置logging的几种方式 向日志输出中添 ...

  8. nginx源码分析—模块及其初始化

    Content 0. 序 1. nginx有哪些模块? 2. nginx如何描述这些模块? 2.1 模块数据结构 2.1.1 ngx_module_t结构 2.1.2 ngx_command_t结构 ...

  9. HTTP3快来了,提前学习一下如何在Nginx中支持HTTP3.0/QUIC

    HTTP3快来了,提前学习一下如何在Nginx中支持HTTP3.0/QUIC HTTP3.0,也称作HTTP over QUIC.核心是QUIC(读音quick)协议,由Google在2015年提出的 ...

最新文章

  1. Exchange 2003群集的安装
  2. 任正非未来出行三谈,在攀登无人驾驶珠峰路上沿途下蛋...
  3. Java源码解析:ArrayList 和 Iterator 使用上的不同
  4. ffmpeg-从flv文件中提取AAC音频数据保存为文件
  5. VMware虚拟机下实现Linux与window文件夹共享
  6. EChart绘制风速风向曲线分析图
  7. Jenkins随笔(四)常用插件-SVN
  8. java 读文件内容_Java 如何读取txt文件的内容?
  9. 信息系统项目管理师(第1章)
  10. linux服务器输入法,linux中如何安装和切换输入法
  11. ORACLE AutoVue 服务器/桌面版/WebService/SDK安装
  12. cisco 防火墙模拟器_37、如果手头有华为AP,怎们配合模拟器做部分实验呢?(完结篇)...
  13. C++:友元函数访问私有函数
  14. 新三板是什么?实录全国股转系统的凤凰涅槃
  15. # 技术栈知识点巩固——Js
  16. python-字典列表集合字符串
  17. 完整的网络端口表《二》
  18. 美国大学计算机科学gpa,美国大学MS硕士平均GPA是多少分?
  19. 忘记ios访问限制密码
  20. java实现一个电梯模拟器_基于Java的捎带电梯系统

热门文章

  1. MVC中实现 加载更多...
  2. html中embed标签的用法
  3. 在多线程 Python 程序中实现多目标不同缩进格式的 logging
  4. SWFUpload上传文件组件,跨域上传文件
  5. python自学书籍推荐豆瓣-【转】如果有人让你推荐Python技术书,请让他看这个列表...
  6. python详细基础教程-Python基础教程,Python入门教程(非常详细)
  7. python个人项目-个人项目WC(Python实现)
  8. python while循环语句-谈谈Python中的while循环语句
  9. python学费多少-培训python学费多少?
  10. python创建csv文件并写入-Python数据写入csv格式文件