nginx epoll IO事件管理

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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值