您的位置:首页 > 运维架构 > Nginx

nginx epoll IO事件管理

2018-03-22 09:08 656 查看
1 nginx是以连接池的方式管理接入的tcp连接
既然是连接池,自然就会有初始化(申请连接池)、获取一个空闲的连接、释放连接、连接注册到epoll事件的过程

一 连接池初始化
连接池是由nginx核心模块管理的。(其实就是一个malloc出来的连接对象的数组)
参阅:ngx_connection.c ngx_event.c文件
FILE:ngx_event.c LINE:684     cycle->connections =

              ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log);

          if (cycle->connections == NULL) {

        return NGX_ERROR;

          }
申请connection_n, 个连接对象内存空间。connection_n 是核心模块配置,默认是512个。

二 申请连接对象
ngx_cycle_t 中有一个free_connection_c指针,每次都指向一个空闲的连接对象。
每一个连接对象的data域保存了下一个空闲连接的指针。
FILE:ngx_connection.c LINE:1045 c = ngx_cycle->free_connections
LINE:1060 ngx_cycle->free_connections = c->data;

三 释放连接对象
与二是逆过程
将空闲对象指向当前是否的连接对象,并且调整下一个空闲对象的未知
FILE:
LINE:1098
    c->data = ngx_cycle->free_connections;

    ngx_cycle->free_connections = c;

    ngx_cycle->free_connection_n++;

    if (ngx_cycle->files && ngx_cycle->files[c->fd] == c) {

        ngx_cycle->files[c->fd] = NULL;

    }

四 事件的注册与删除
创建一个新链接的过程:
1 创建socket 2 申请连接对象 3 将连接注册到epoll监听列表
FILE:ngx_event_connect.c
LINE:15 ngx_event_connect_peer(主动连接远端)
LINE:119 ngx_add_conn(c);
ngx_add_conn ==>ngx_epoll_add_connection 

五 epoll事件管理
ngx_epoll_del_connection() 删除监听 epoll_ctl EPOLL_CTL_ADD
ngx_epoll_add_connection()增加监听 epoll_ctl EPOLL_CTL_DEL
ngx_epoll_process_events()时间处理 epoll_wait
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: