1. 程式人生 > >堆學習--艱難之路

堆學習--艱難之路

看了好幾天大概是明白了每一個的chunk,堆的結構構成

fast bin ;unsort bin;small bin ;large bin

今天剛明白了在chunk未使用的時候是在連結串列之中的。

-------------2018年9月25日

/*
  This struct declaration is misleading (but accurate and necessary).
  It declares a "view" into memory allowing access to necessary
  fields at known offsets from a given base. See explanation below.
*/
struct malloc_chunk {

  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */

  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;

  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

這就是堆堆大概結構了

prev_size : 如果前一個chunk是空閒的那麼該位置儲存的是前一個chunk的大小,反之則可以儲存前一個chunk的資料。前一個chunk是指地址較低的chunk。

size:這是chunk的大小,chunk的大小必須滿足要求,也就是大小必須是2*SIZE_SZ的整數倍。如果不滿足要求則會讓其自動轉化為滿足大小的最小的chunk大小。在64位中SIZE_SZ是4,而在32位中則是8.該欄位的低三位和chunk的大小沒有關係。聽xman的講師說這在堆的題目中一般是用不到這裡就不細說了。

            NON_MAIN_ARENA:是否屬於主執行緒,是是1,不是為0

            IS_MAPPED:記錄是否有mmap分配而來

            PREV_INUSE:用來記錄前一個chunk是否被分配,如果p位為0那麼我們就可以通過prev_size對前一個chunk的大小和地址進行訪問。

fd,bk:當chunk屬於分配情況下時,fd一段開始就是指向使用者的資料,當空閒是則會加入連結串列結構之中。

fd_nextsize, bk_nextsize:chunk空閒時才會有,一般用於large chunk

今天再看這些就已經蠻清楚了,對於chunk的一個完整結構有了比較好的理解。

上個圖大概的chunk的結構效果圖:

這裡可以看見這個完整的chunk結構,前面的3塊我們就叫做chunk header。

-----------------9月26日堆的大致影象記錄