memory pool
lab0: insert_head, remove (斷開節點間的連結), delete (真正釋放記憶體的操作)
circular buffer 程式碼如何確保 thread-safe?
針對 mpscq 的 pop,若用 CAS,程式碼可以如何改寫?
針對第十五週的測驗
我認為 void minheap_init(unsigned long nr_items, struct heap_item *h)
是想要對 leaf 做 do_sift_up
。第一個 for 迴圈是對最底層的藍色節點,第二個 for 迴圈則是對倒數第二層的紅色節點。因為 heap 的結構是 complete binary ,所以 leaf 一定在這兩層。但是因為 do_sift_up
只要遇到 parent 比較小就會停下,因此這個程式是有錯的。考慮以下情況:
因為初始化的過程中所有 leaf 的 parent 都比較小,因此最上面的 100 不會被動到。
要修正程式其中一個辦法是讓 do_sift_up
繼續往上檢查。如下:
但這樣會加重 heap 的操作成本,因此我認為較好的方法還是對第一個以外的所有節點都做原版的 do_sift_up
。或是寫兩個版本的 do_sift_up
,在初始化時使用沉重版本,並在一般操作時使用原版。