做網(wǎng)站 搞流量騰訊企點(diǎn)下載
任意大小的內(nèi)存管理是根據(jù)用戶需要為其分配內(nèi)存,即用戶需要多大內(nèi)存就通過(guò)acoral_malloc2()為之分配多大內(nèi)存,同時(shí)每塊分配出去的內(nèi)存前面都有一個(gè)控制塊,控制塊里記錄了該塊內(nèi)存的大小。
同時(shí)未分配出去的內(nèi)存也有一個(gè)控制塊,尋找空閑內(nèi)存塊要進(jìn)行遍歷。
由于分配和回收的順序和內(nèi)存大小是沒(méi)有規(guī)律的,如果不斷分配和回收后,會(huì)將內(nèi)存分為很多塊,產(chǎn)生很多內(nèi)存碎片。
任意大小內(nèi)存的管理機(jī)制是:“一分為二”,將一塊分為兩塊,一塊分配給用戶使用,剩下一塊留給后續(xù)使用,同時(shí)改變大小標(biāo)志??梢?jiàn)用戶不斷調(diào)用acoral_malloc2()會(huì)產(chǎn)生很多內(nèi)存碎片。
若剛開(kāi)始內(nèi)存只有一塊,其大小為x1,則全部空閑,當(dāng)用戶調(diào)用acoral_malloc2()后,內(nèi)存分布如圖b。這里x1=x2+x3。
當(dāng)用戶多次調(diào)用acoral_malloc2()后,內(nèi)存分布如圖c所示,此時(shí)有兩個(gè)空閑的內(nèi)存塊,一塊大小128B,另一塊大小56B。如果用戶預(yù)申請(qǐng)80B的內(nèi)存,則后面那個(gè)56B不夠,這時(shí)就必須從頭開(kāi)始搜索空間,然后一分為二,找到128B。
從上面可以看出這種分配方式,時(shí)間不確定,搜索時(shí)間與塊的個(gè)數(shù)、當(dāng)前內(nèi)存使用情況有關(guān)。
aCoral內(nèi)存管理初始化
在aCoral內(nèi)存管理機(jī)制能正確工作簽,需要對(duì)其進(jìn)行初始化,該工作是在啟動(dòng)aCoral時(shí),內(nèi)核模塊acoral_module_init()中進(jìn)行的,如代碼,這里調(diào)用了acoral_mem_sys_init()
void acoral_mem_sys_init()
{acoral_mem_init((unsigned int)&heap_start, (unsigned int)&heap_end); //伙伴系統(tǒng)初始化
#ifdef CFG_MEM2acoral_mem_init2();
#endifacora_res_sys_init();//資源池系統(tǒng)初始化
}