nginx的內存池設計的比較簡單了,一個內存池中分爲兩個部分:nginx
nginx中全部請求都單獨對應一個內存池,在這個請求的過程當中,全部涉及到內存分配的地方,都到該請求相關的內存池中處理,而中間不會去釋放回收內存,內存池的生命週期與請求同樣,請求完畢則直接回收內存。這樣的好處在於:統一分配和統一釋放,下降了內存泄露問題的出現。數據結構
先來看結構體ngx_pool_data_t,它存儲每一個ngx_pool_t結構體的meta元數據:架構
failed成員的引入是爲了不某個pool雖然還有可用的空間,可是因爲空間很小了因此常常性的分配空間失敗,當累計失敗的次數達到某個閾值時,下一次再次查找內存就直接跳過這個pool,而去尋找內存池鏈表中的下一個pool。在此我向你們推薦一個架構學習交流裙。交流學習裙號:687810532,裏面會分享一些資深架構師錄製的視頻錄像學習
ngx_pool_large_t結構體用於保存大內存塊,這一塊就比較簡單粗暴了,直接分配一塊大內存來使用。另外,多個大內存塊之間也是以鏈表形式來組織數據。ui
// 管理超大空間的結構體 struct ngx_pool_large_s { // 指向下一個指針 ngx_pool_large_t *next; // 直接指向內存區域的指針 void *alloc; };
再來看ngx_pool_t結構體,該數據結構用於表示一個內存池,內存池內部以鏈表形式來組織數據。以下圖:spa
須要說明的是:設計
有了以上數據結構的瞭解,從內存池分配內存的流程就很簡單了:指針