一、內(nèi)存池概述

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

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

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

 

二、nginx內(nèi)存池綜述

     nginx為tcp連接,http請(qǐng)求,模塊都分配了一個(gè)內(nèi)存池,在結(jié)束的時(shí)候會(huì)摧毀整個(gè)內(nèi)存池,把分配的內(nèi)存一次性歸還給操作系統(tǒng)。

     在分配的內(nèi)存上,nginx有小塊內(nèi)存和大塊內(nèi)存的概念,小塊內(nèi)存 nginx在分配的時(shí)候會(huì)嘗試在當(dāng)前的內(nèi)存池節(jié)點(diǎn)中分配,而大塊內(nèi)存會(huì)調(diào)用系統(tǒng)函數(shù)malloc向操作系統(tǒng)申請(qǐng)

     在釋放內(nèi)存的時(shí)候,nginx沒有專門提供針對(duì)釋放小塊內(nèi)存的函數(shù),小塊內(nèi)存會(huì)在ngx_destory_pool 和 ngx_reset_pool的時(shí)候一并釋放

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

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

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

    所以如果分配的內(nèi)存大于一頁(yè)的話,從內(nèi)存

網(wǎng)友評(píng)論