doug lea malloc源碼剖析之:malloc_consolidate

流行分配器dlmalloc剖析之:malloc_consolidate

版權聲明: 本文章由vt.buxiu發佈在www.vtzone.org,版權歸vtzone研究小組所有,轉載請保持此聲明!!!

@@內容摘要:
       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]個鏈表清除
        }

    
    }


}



作者:[email protected]

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章