Apache記憶體池內幕 4

2021-04-02 08:40:36 字數 2218 閱讀 1278

在了解了記憶體分配子的概念之後,我們其實已經了解了apache中記憶體分配的細節了。不過apache中記憶體的層次結構關係則是由記憶體池負責組織,其資料結構apr_pool_t定義在apr_pools.c中,定義如下:

struct apr_pool_t ;

apache中存在的記憶體池個數通常多於乙個,它們之間形成樹型層次結構。每個記憶體池所儲存的內容以及其儲存週期都不一樣,比如連線記憶體池在整個http連線期間存在,一旦連線結束,記憶體池也就被釋放;請求記憶體池則週期要相對短,它僅僅在某個請求週期記憶體存在,一旦請求結束,請求記憶體池也就釋放。不過每個記憶體池都具有乙個apr_pool_t結構。

整個記憶體池層次樹通過parent、child以及sibling三個變數構建起來。parent指向當前記憶體池的父記憶體池;child指向當前記憶體池的子記憶體池;而sibing則指向當前記憶體池的兄弟記憶體池。因此整個記憶體池樹結構可以用圖3.3描述:

圖3.3 記憶體池層次樹結構圖

在上面的圖中,我們只是表示了層次結構,因此只是用了child和sibling兩個成員,而忽略的parent的變數。從上面的圖中我們可以看出根結點具有n個孩子結點:child1,child2,child3…childn。而child1,child2,child3以及childn它們屬於同乙個父親,而且處於層次樹的同一層次,因此它們通過鍊錶連線,互為兄弟結點。同樣child10和child11都是child1的子記憶體池結點,互為兄弟結點。child21是child2的唯一的子結點。其餘結點類似。

除此之外apr_pool_t結構中最重要的成員變數無非就是active了。

圖3.4

apache中提供了大量的記憶體池管理函式,它們的功能和名稱歸納在**3.2中。

記憶體池操作

函式名稱

函式功能簡單描述

初始化

apr_pool_initialize

對記憶體池使用中需要的內部變數進行初始化 銷毀

apr_pool_terminate

主要在終止記憶體池使用時銷毀內部的結構 建立

apr_pool_create_ex

apr_pool_create_ex_debug

建立乙個新的記憶體池,另外還包括乙個除錯版本 清除

apr_pool_clear

apr_pool_clear_debug

清除記憶體池中的所有的記憶體,另外包括乙個除錯版本

apr_pool_destroy

記憶體池的初始化是通過函式apr_pool_initialize實現的,在內部函式完成了下面幾件事情:

apr_declare(apr_status_t) apr_pool_initialize(void)

if ((rv = apr_pool_create_ex(&global_pool, null, null,

global_allocator)) != apr_success)

apr_pool_tag(global_pool, "apr_global_pool");

(2)、建立了全域性的分配子global_allocator,並使用全域性分配子global_allocator建立了全域性記憶體池global_pool,該記憶體池是所有的記憶體池的祖先。所有的記憶體池都從該記憶體池繼承而來。它在整個apache的生存週期都存在,即使重啟機器,該記憶體池也不會釋放。除非你把apache徹底關閉。該記憶體池在系統中命名為「apr_gloabl_pool」。

if ((rv = apr_atomic_init(global_pool)) != apr_success)

#if apr_has_threads

apr_allocator_mutex_set(global_allocator, mutex);

}#endif /* apr_has_threads */

apr_allocator_owner_set(global_allocator, global_pool);

(3)、如果當前的作業系統允許多執行緒,為了確保記憶體池結構被多執行緒訪問的時候的執行緒安全性,還必須設定apr_pool_t結構內的互斥鎖變數mutex。最後的任務就是將記憶體分配子和記憶體池進行關聯。

關於作者

張中慶,目前主要的研究方向是嵌入式瀏覽器,移動中介軟體以及大規模伺服器設計。目前正在進行apache的源**分析,計畫出版《apache源**全景分析》上下冊。apache系列文章為本書的草案部分,對apache感興趣的朋友可以通過flydish at sina.com.cn與之聯絡!

Apache記憶體池內幕 4

在了解了記憶體分配子的概念之後,我們其實已經了解了apache中記憶體分配的細節了。不過apache中記憶體的層次結構關係則是由記憶體池負責組織,其資料結構apr pool t定義在apr pools.c中,定義如下 struct apr pool t apache中存在的記憶體池個數通常多於乙個,...

Unity池記憶體,碎片

1.fifo 佇列 全稱 first in first out 2.filo 棧 全稱 first in last out 棧的順序是儲存。舉個例子 在乙個桶裡持續往裡放東西,最底下的永遠在最底下,是有序的,陣列持續往後加。棧是有序的所以說它是不會出現碎片的。從而引出來乙個問題,什麼是記憶體碎片呢?...

程序池 執行緒池 記憶體池

程式進化過程 單程序 多執行緒 執行緒池 多程序 程序池 單程序 程式執行正確進一步優化 多執行緒 cpu有限 並行執行的執行緒有限 多程序 改變了限制條件 程序組執行時間取決於最長的乙個程序執行的時間 程序池 我們先準備10個程序池,說白了就是10個空位子而已,乙個乙個察看,如果位置空了,那麼就在...