流行分配器dlmalloc剖析之:malloc_consolidate
版權聲明: 本文章由vt.buxiu發佈在www.vtzone.org,版權歸vtzone研究小組所有,轉載請保持此聲明!!!
@@內容摘要:
consolidate_fastbin函數用於合併fastbin中的空閒內存塊,是doug lea malloc(dlmalloc)重要的函數之一。本文以dlmalloc2.7.0版本爲基礎,先以僞代碼的形式介紹consolidate_fastbin函數的主要流程。@@
@@內容摘要:
consolidate_fastbin函數用於合併fastbin中的空閒內存塊,是doug lea malloc(dlmalloc)重要的函數之一。本文以dlmalloc2.7.0版本爲基礎,先以僞代碼的形式介紹consolidate_fastbin函數的主要流程。@@
void dlmalloc_consolidate_fastbin(mstate av)
{
//第一次進來,還沒初始化,先調用malloc_init_state對bins[]進行初始化
if(av->max_fast == 0)
{
malloc_init_state(av); //初始化av
return;
}
//獲得unsorted_bin指針,unsorted_bin是作爲隊列維護,LRU順序,首地址固定放在av->bins[0]
unsorted_bin = unsorted_chunks(av);
for(usigned int i = 0; i<av->max_fast; i++)
{
if(av->fastbin[i] != 0)
{
mchunkptr p = av->fastbin[i]; //當前正在合併的chunk
mchunkptr nextp = p->fd; //當前正在合併的chunk的下一個chunk,控制循環使用
do{
if(p的前一個物理相鄰chunk是空閒)
p與前一個chunk合併;
if(nextchunk != av->top) //與p下一個物理相鄰的chunk不是top
{
if(nextchunk 是空閒)
{
p與nextchunk合併;
將nextchunk從原來鏈表中刪除;(原來鏈表可能在其他bin中)
}
//注意這裏!!!
//只要p下一個物理相鄰的chunk不是top,程序流程都會走到這裏
//unsorted_bin->first_unsorted->second_unsorted->.....->last_unsorted
// /
// | 在這裏插入
以LRU順序將p插入到unsorted-freelist中
}
else //與p下一個物理相鄰的chunk是top
(
直接與top合併,修改top指針
)
}while((p = nextp) != 0)
av->fastbin[i] = 0; //將該av->fastbin[i]個鏈表清除
}
}
}
{
//第一次進來,還沒初始化,先調用malloc_init_state對bins[]進行初始化
if(av->max_fast == 0)
{
malloc_init_state(av); //初始化av
return;
}
//獲得unsorted_bin指針,unsorted_bin是作爲隊列維護,LRU順序,首地址固定放在av->bins[0]
unsorted_bin = unsorted_chunks(av);
for(usigned int i = 0; i<av->max_fast; i++)
{
if(av->fastbin[i] != 0)
{
mchunkptr p = av->fastbin[i]; //當前正在合併的chunk
mchunkptr nextp = p->fd; //當前正在合併的chunk的下一個chunk,控制循環使用
do{
if(p的前一個物理相鄰chunk是空閒)
p與前一個chunk合併;
if(nextchunk != av->top) //與p下一個物理相鄰的chunk不是top
{
if(nextchunk 是空閒)
{
p與nextchunk合併;
將nextchunk從原來鏈表中刪除;(原來鏈表可能在其他bin中)
}
//注意這裏!!!
//只要p下一個物理相鄰的chunk不是top,程序流程都會走到這裏
//unsorted_bin->first_unsorted->second_unsorted->.....->last_unsorted
// /
// | 在這裏插入
以LRU順序將p插入到unsorted-freelist中
}
else //與p下一個物理相鄰的chunk是top
(
直接與top合併,修改top指針
)
}while((p = nextp) != 0)
av->fastbin[i] = 0; //將該av->fastbin[i]個鏈表清除
}
}
}