Linux下malloc/free詳解

來源:互聯網
上載者:User

在程式開發中,堆和棧是最常使用的兩個記憶體區,在Linux下棧分為使用者棧和核心棧,核心棧具有固定大小,而使用者棧可以通過ulimit來設定,最大8M。

堆具有很大的靈活性,程式員可以根據需要擷取任意大小的記憶體(只只是相對於棧來說,對於32位機,它最大能分配2G多的虛擬位址空間)。malloc/free就是提供給程式員來在堆上分配記憶體的介面。在堆上分配記憶體,為什麼會產生額外的開銷?這些開銷是多少? 先來看看堆分配的主要資料結構:

typedef struct free_list {
spin_lock_t lock;/* spin lock for mutual exclusion */
header_t head;/* head of free list for this size */
#ifdef DEBUG
int in_use;
 /* # mallocs - # frees */
#endif DEBUG
} *free_list_t;

typedef union header {

union header *next;

struct free_list *fl;

} *header_t;

#define MIN_SIZE 8/* minimum block size */

#define NBUCKETS 29

static struct free_list malloc_free_list[NBUCKETS];

通過以上主要的資料結構,我們瞭解到,malloc額外記憶體開銷主要是,一個malloc_free_list數組(8×29byte),和每malloc一次佔用4byte,這樣對於小塊記憶體請求來說,效率就比較低。

接下來再分別看看malloc和free的處理流程:

malloc處理流程

1. 首先給size增加sizeof(union header),這是為了把頭和待分配的記憶體塊合在一起使用的一個小技巧。

2. 用size去匹配該屬於哪個malloc_free_list槽中,malloc_free_list最小8byte,然後每個遞增一倍。

3. 匹配上插槽後,然後看這個插槽中有沒有閒置塊供分配,如果沒有,就調用more_memory來添加,more_memory一次最少需要添加一頁。

4.然後就取出freelist中第一個值,free指標下移,返回header+sizeof(union header),這就是供使用的記憶體。

5.而header中儲存的是free list指標,這樣當free的時候,就能找到相應的插槽,而不用知道需要釋放的記憶體大小,這也是一個小技巧,屏蔽了額外的開銷。

free處理流程

1. free的地址前移sizeof(union header),這樣找到freelist指標。

2. 然後把這個單元添加進相應插槽的freelist鏈表中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.