一、內存池概述

    內存池是在真正使用內存之前,預先申請分配一定數量的、大小相等(一般情況下)的內存塊留作備用。當有新的內存需求時,就從內存池中分出一部分內存塊,若內存塊不夠再繼續(xù)申請新的內存。

   內存池的好處有減少向系統(tǒng)申請和釋放內存的時間開銷,解決內存頻繁分配產生的碎片,提示程序性能,減少程序員在編寫代碼中對內存的關注等

    一些常見的內存池實現(xiàn)方案有STL中的內存分配區(qū),boost中的object_pool,nginx中的ngx_pool_t,google的開源項目TCMalloc等

 

二、nginx內存池綜述

     nginx為tcp連接,http請求,模塊都分配了一個內存池,在結束的時候會摧毀整個內存池,把分配的內存一次性歸還給操作系統(tǒng)。

     在分配的內存上,nginx有小塊內存和大塊內存的概念,小塊內存 nginx在分配的時候會嘗試在當前的內存池節(jié)點中分配,而大塊內存會調用系統(tǒng)函數malloc向操作系統(tǒng)申請

     在釋放內存的時候,nginx沒有專門提供針對釋放小塊內存的函數,小塊內存會在ngx_destory_pool 和 ngx_reset_pool的時候一并釋放

     區(qū)分小塊內存和大塊內存的原因有2個,

     1、針對大塊內存  如果它的生命周期遠遠短于所屬的內存池,那么提供一個單獨的釋放函數是十分有意義的,但不區(qū)分大塊內存和小塊內存,針對大的內存塊 便會無法提前釋放了

     2、大塊內存與小塊內存的界限是一頁內存(p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL,宏NGX_MAX_ALLOC_FROM_POOL通過調用getpagesize活動),大于一頁的內存在物理上不一定是連續(xù)的

    所以如果分配的內存大于一頁的話,從內存