Nginx源码分析—过期事件和惊群事件的处理

本文深入探讨Nginx源码,分析如何处理过期事件和惊群事件。通过实例解释了Instance标志位在判断事件过期中的作用,以及如何避免处理已关闭的连接导致的错误。在Nginx中,利用Instance标志位的特性,可以在处理epoll_wait返回的事件时,有效识别并跳过过期事件,确保系统稳定运行。
摘要由CSDN通过智能技术生成

Nginx源码分析—过期事件和惊群事件的处理

过期事件:每个事件的date域都是一个结构体ngx_connection_t结构体,表示对应的连接。对于一个结构体struct epoll_event 中的data.ptr成员存储的是ngx_connection_t连接,这里使用Instance标志位来标识,下面就配合ngx_epoll_process_events方法说明他的用法。

Data.ptr (void* )((uintptr_t) c  |  ev->instance); 这事添加事件的使用对ptr进行的初始化。

那么在检查的时候怎么使用它呢?

         遍历epoll_wait返回的所有事件,对照上面提到的ngx_epoll_add_event方法,可以看到ptr成员就是ngx_connection_t连接的地址,但最后一位有特殊含义,需要把他屏蔽到。

         C= event_list[i].data.ptr;

         //将地址的最后一位取出来,用Instace变量标识

         Instance= (uintptr_t) c &1;

/*五路是32位还是64位机器,其地址的最后一位肯定是0.可以用下面的这行语句把ngx_connection_t的地址还原到真正的地址值*/

         C = (ngx_connection_t*) ((uintptr_t) c& (uintptr_t)  ~1);

         //取出事件

         Rev= c->read;

//判断这个度事件是否为过期事件

 If(c->fd== -1 || wev->instance != instance)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值