nginx的epoll事件

1.事件驱动函数--ngx_processess_events_and_timers
在 worker 的主循环中,主要工作是在不断的循环调用 ngx_process_events_and_timers 函数
这个函数就是事件驱动函数,主要完成以下工作:
  1. 调用事件驱动模块实现的 ngx_epoll_process_events 函数(ngx_process_events 宏)处理网络事件
  2. 调用 ngx_event_process_posted 函数处理 ngx_posted_accept_events 和 ngx_posted_events 两个队列中的事件
  3. 调用 ngx_event_expire_timers 函数处理定时器事件
这个函数会被循环调用,会先接受连接(并不处理事件),以及处理进程间的信号,处理accpt queue和event queue里面的事件
在这个函数会首先获取一个锁,若ngx_accept_mutex_held==1表示当前已经持有锁,如果持有的话,就把flags添加到NGX_POST_EVENTS,这样表明可以去accept请求,如果不吃有,就去处理其他事件,在ngx_epoll_process_events里会调用

2.epoll网络事件处理--ngx_epoll_process_events
在该函数中首先会从event_list中获取事件
 if (flags & NGX_POST_EVENTS) {  
如果有新的连接,accept就会被设为1;accpt()之后还没有断开(timmeout),accpt就是0
这个步骤不处理连接,只是把连接放在queue(ngx_posted_accpet_events或者ngx_posted_events)里面
需要注意的就是,nginx最核心的机制--异步非阻塞的是实现:
如果进城正在占用锁,则在获取锁之后为flags添加了NGX_POST_EVENTS标识,那么,在ngx_epoll_process_events函数中,仅仅将事件插入相应的队列,而不进行处理,只有等待进程空闲的时候,即将释放锁以后或没有获得锁的某次调用才会去处理事件,这么做大大提高了运行效率
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值