Ngnix 原始碼學習(3) 記憶體池結構

2021-06-05 15:09:47 字數 1664 閱讀 6695

本篇首先把 記憶體池結構 大概的說一下,具體使用將在下一節細緻描述
首先知道記憶體池的作用

為什麼需要記憶體池?

a. 在大量的小塊記憶體的申請和釋放的時候,能更快地進行記憶體分配(對比malloc和free)

b.減少記憶體碎片,防止記憶體洩露。

記憶體池的原理

記憶體池的原理非常簡單,用申請一塊較大的記憶體來代替n多的小記憶體塊,當有需要malloc一塊

比較小的記憶體是,直接拿這塊大的記憶體中的位址來用即可。

當然,這樣處理的缺點也是很明顯的,申請一塊大的記憶體必然會導致記憶體空間的浪費,但是

比起頻繁地malloc和free,這樣做的代價是非常小的,這是典型的以空間換時間。

ngnix的記憶體池使用的資料結構是鍊錶。

首先

typedef struct ngx_pool_s        ngx_pool_t;
我們知道以上定義 其結構體是什麼樣的呢?

struct ngx_pool_s ;
以上是0。5版本的,1.0版本有些改變

struct ngx_pool_s ;

typedef struct  ngx_pool_data_t;
但是原理是一樣的,他把兩個位址進行封裝了struct

看了這個結構,我們想知道這個結構到底是什麼樣的,他的每個資料字段什麼用呢?

再把其他的資料結構貼上來。

typedef struct ngx_chain_s       ngx_chain_t;

struct ngx_chain_s ;
這個乙個 記憶體池的鍊錶

而其中的

typedef struct ngx_buf_s  ngx_buf_t;
struct ngx_buf_s ;
下面是乙個 大資料池,當申請的記憶體不夠用的時候,就使用大記憶體。

typedef struct ngx_pool_large_s  ngx_pool_large_t;
struct ngx_pool_large_s ;
typedef struct  ngx_pool_cleanup_file_t;
struct ngx_log_s ;
下面的是用來清理記憶體的。

typedef struct ngx_pool_cleanup_s  ngx_pool_cleanup_t;

struct ngx_pool_cleanup_s ;

以上是起資料元素了,直接用**可能看不懂,但是你要畫出來就可能明白了

如下圖所示

今天只是簡單介紹了記憶體的大概結構,下面一篇文章將介紹如何使用記憶體池

STL 記憶體池原始碼學習與思考

首先說明一下,這次學習的是stl空間配置器的原始碼中記憶體池部分的函式,下面是原始碼 template char default alloc template threads,inst s chunk alloc size t size,int nobjs else if bytes left si...

原始碼學習 執行緒池原始碼自學篇

執行緒池作為專案中經常用到的類,也在面試中備受青睞,個人對於原始碼也只是讀過一些,很多知識點都是一知半解,藉此機會自己再溫故一下。我是在邊自學邊寫這些東西,可能語言上或者邏輯上不太完善,請大家不要介意。執行緒池是什麼?官網解釋 執行緒池主要解決兩個問題 在需要執行大量執行緒的場景,減少建立每個執行緒...

MySQL記憶體池結構原始碼 my alloc h

mysql使用記憶體池結構,理解該結構挺簡單的,但是對於my alloc.c中的分配過程感覺上很難理解。data structures for mysys my alloc.c root memory allocator ifndef my alloc h define my alloc h def...