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的內存池結構體的初步認識,後續慢慢的研究,希望能有所收穫!

 

 

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