nginx源码那些事之----初认识

        最近一段时间,在面试时,听过别人说为啥不在空闲的时间看看开源代码呢?作为学生就应该多看看别人写的代码,然后在在别人的代码上面写出一些应用。听过这些话后,感觉确实比较有感触,所以就开始慢慢的接触nginx方面的源码。做完自己的锻炼吧!

        今天刚开始接触nginx内存池结构。

         Nginx可以开启多个进程,每个进程拥有最大上限128个子线程以及一定的可用连接数。如果你希望使用线程可以在配置文件中设置worker_threads这个参数,但这个参数在Nginx官方手册上没有。只有通过阅读源代码才看到。最大客户端连接数等于进程数与连接数的乘积,连接是在主进程中初始化的,一开始所有连接处于空闲状态。

       nginx由以下几个元素组成:

      1. worker(进程)
      2. thread(线程)
      3. connection(连接)
      4. event(事件)
      5. module(模块)
      6. pool(内存池)
      7. cycle(全局设置)
      8. log(日志)

      内存池中有几个比较重要的结构体,如下:

     内存池的管理节点:

    typedef struct {

            u_char               *last;  /* 指向所使用内存的最后的地址 */

           u_char               *end;  /* 指向所申请到内存块的最后的地址 */

         ngx_pool_t           *next;  /* 指向下一个ngx_pool_t */

         ngx_uint_t            failed;  /* 这个 */

       } ngx_pool_data_t;

  

     内存池管理队列的头结点:

     struct ngx_pool_s {

            ngx_pool_data_t       d;

            size_t                max;    /* 内存池块中空闲空间的大小 */

           ngx_pool_t           *current; /* 指向当前块自身 */

           ngx_chain_t          *chain;

          ngx_pool_large_t     *large;   /* 用来指向大块内存 */

          ngx_pool_cleanup_t   *cleanup; /* 释放内存时调用的清除函数队列 */

          ngx_log_t            *log;    /* 指向log的指针 */

         };

    大块内存结点:

    typedef struct ngx_pool_large_s ngx_pool_large_t;

    struct ngx_pool_large_s {

                 ngx_pool_large_t   *next;  /*指向下一块大内存

                 void                             *alloc;

              };

   

    清除函数的队列结构:

     typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

     struct ngx_pool_cleanup_s {

        ngx_pool_cleanup_pt     handler;

        void                                    *data;

        ngx_pool_cleanup_t       *next;   /*指向下一个清除函数

        };

 
    以上就是对nginx的内存池结构体的初步认识,后续慢慢的研究,希望能有所收获!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章