nginx accept 加锁

     nginx 采用多进程的模,当一个请求过来的时候,系统会对进程进行加锁操作,保证只有一个进程来接受请求。

     加锁: ngx_trylock_accept_mutex(cycle)

     解锁: ngx_shmtx_unlock(&ngx_accept_mutex)

 

     下面对加锁和解锁进行详细的介绍:

      一 加锁操作

 

 

273  首先调用ngx_trylock_accept_mutex 获得锁

278 - 280   如果调用之前进程已经获得了锁,并且还没有进行过accept操作,那么就直接返回 ,这里的第三个条件我也没有看懂?

285  把进程对应的监听socket 放入到epoll中进行监听,这样只有该进程能监听到accept操作。

290-291  设置标志,表明还没有做过任何accept,并且已经获得了锁

 

299 说明获取锁失败了,但是当前进程有获得锁的标志,那么就需要调用ngx_disable_accept_events把监听的socket从epoll中删除。

 

总的来讲,这个函数对调用获得锁后进行的不同的操作,主要的工作还是在ngx_trylock_accept_mutex函数中实现,这个函数我们后面介绍。

 

 

二解锁操作

这个函数直接调用ngx_unlock_fd()来实现对锁的释放,关于这个函数的介绍,我们放到nginx 锁中具体介绍。

 

 

 

三 获得accept 锁后处理

 

获得锁以后,ngx_accept_mutex_held变量被设为true, 会在调用ngx_process_epoll_event的时候把标志位设置成 NGX_POST_EVENTS,这个使epoll在接受到事件的时候,暂时不处理,而是放到一个队列中暂时保存起来,等到释放了accept锁之后才处理这些事件,提高效率。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值