--- tags: linux2023 --- # 2023q1 Homework1 (quiz5) contributed by < `brianlin314` > ## 測驗 1 首先,先了解 [Memory pool](https://zh.wikipedia.org/wiki/%E8%A8%98%E6%86%B6%E6%B1%A0) 的概念,可以得知它是一個有效率的方法,預先規劃一定數量的記憶體區塊,使得整個程式可以在執行期規劃 (allocate)、使用 (access)、歸還 (free) 記憶體區塊。 看到 [jserv/mpool.c](https://gist.github.com/jserv/8ae560f0095b45aaefa4386c71d7a326) 中的 `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