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锁之后才处理这些事件,提高效率。