Try   HackMD

2023q1 Homework1 (quiz5)

contributed by < brianlin314 >

測驗 1

首先,先了解 Memory pool 的概念,可以得知它是一個有效率的方法,預先規劃一定數量的記憶體區塊,使得整個程式可以在執行期規劃 (allocate)、使用 (access)、歸還 (free) 記憶體區塊。

看到 jserv/mpool.c 中的 mpool.h ,閱讀註解,並理解每個 function 的作用。

其中看到 calloc()=malloc()+erase(),並重新探討了一下 malloc 與 calloc 的差異,得知 malloc 與 calloc 不同的是,malloc 在分配內存空間時不會將其初始化為零,而是返回一個指向未初始化內存塊的指針。使用 malloc 時需要注意,由於其不會對內存空間進行初始化,可能會導致程序出現未定義行為的情況。

再來了解到 allocated block 和 free block 內所存放的東西,其中 free block 存儲了下一個和上一個 free block 的位址,因此,malloc() 和 free() 可以使用這些鏈接來解析池,分配一個 chunk 或釋放 chunk。

​​​​    Free block                 In-use block

​​​​ ┌────────────────┐           ┌────────────────┐
​​​​ │      Size      │           │      Size      │
​​​​ ├────────────────┤           ├────────────────┤
​​​​ │ Next Block Ptr │           │                │
​​​​ ├────────────────┤           │                │
​​​​ │Prev. Block Ptr │           │    Payload     │
​​​​ ├────────────────┤           │                │
​​​​ │                │           │                │
​​​​ │    ........    │           │                │
​​​​ │                │           │                │
​​​​ └────────────────┘           └────────────────┘

pool_init() 是一開始初始化 Memory pool 的 function ,如果正確分配會回傳 True,看到此註解 /* size is too small, can notstore a header */,可得知 AAAA 應為 header_size,且 header_size 裡面儲存的是 size 和 previous/next block addresses。

接著看到 pool_malloc(),為了滿足硬體對齊,4 bytes for 32 bits architecture, or 8 bytes for 64 bits architecture,所以寫了一個 round_up(),因此 BBBB 與 CCCC 應填上 log2_word_size。

如果 pool_free_space 小於 _size + DDDD,則回傳 NULL,表示 allocate buffer 失敗,所以 DDDD 應填 header_size。

get_loc_to_place(current, EEEE) 是要尋找一個空的空間存放 block,所以EEEE 應填 _size