最近一段時間,在面試時,聽過別人說爲啥不在空閒的時間看看開源代碼呢?作爲學生就應該多看看別人寫的代碼,然後在在別人的代碼上面寫出一些應用。聽過這些話後,感覺確實比較有感觸,所以就開始慢慢的接觸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; /*指向下一個清除函數
};