nginx accept 加锁

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

     加锁: ngx_trylock_accept_mutex(cycle)

     解锁: ngx_shmtx_unlock(&ngx_accept_mutex)

 

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

      一 加锁操作

     ngx_int_t 271 ngx_trylock_accept_mutex(ngx_cycle_t *cycle) 272 { 273 if (ngx_shmtx_trylock(&ngx_accept_mutex)) { 274 275 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 276 "accept mutex locked"); 277 278 if (ngx_accept_mutex_held 279 && ngx_accept_events == 0 280 && !(ngx_event_flags & NGX_USE_RTSIG_EVENT)) //已经获得了锁,但是还没有接受事件发生 281 { 282 return NGX_OK; 283 } 284 285 if (ngx_enable_accept_events(cycle) == NGX_ERROR) { 286 ngx_shmtx_unlock(&ngx_accept_mutex); 287 return NGX_ERROR; 288 } 289 290 ngx_accept_events = 0; //事件还没有发生j 291 ngx_accept_mutex_held = 1; //获得了锁 292 293 return NGX_OK; 294 } 295 296 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, 297 "accept mutex lock failed: %ui", ngx_accept_mutex_held); 298 //获取锁失败,但是有锁标志 299 if (ngx_accept_mutex_held) { 300 if (ngx_disable_accept_events(cycle) == NGX_ERROR) { 301 return NGX_ERROR; 302 } 303 304 ngx_accept_mutex_held = 0; 305 } 306 307 return NGX_OK; 308 }  

 

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函数中实现,这个函数我们后面介绍。

 

 

二解锁操作

89 static ngx_inline void 90 ngx_shmtx_unlock(ngx_shmtx_t *mtx) 91 { 92 ngx_err_t err; 93 94 err = ngx_unlock_fd(mtx->fd); 95 96 if (err == 0) { 97 return; 98 } 99 100 ngx_log_abort(err, ngx_unlock_fd_n " %s failed", mtx->name); 101 }

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

 

 

 

三 获得accept 锁后处理

 

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

 

 

 

你可能感兴趣的:(nginx,工作,UI,socket,events)