contributed by < yu-hsiennn
>
void list_add(node_t **list, node_t *node_t)
: 串 node_t
到 *list
前方node_t *list_tail(node_t **left)
: 回傳此串列的最後節點int list_length(node_t **left)
: 計算此串列的長度node_t *list_construct(node_t *list, int n)
: 串列初始化void list_free(node_t **list)
: 釋放串列的記憶體空間static bool list_is_ordered(node_t *list)
: 串列是否由小到大排序void shuffle(int *array, size_t n)
: 將陣列依據其大小打亂裡面的值AAAA
則為下一個節點的位置,即 (*left)->next
AAAA
則為下一個節點的位置,即 (*left)->next
while loop
是在遍歷整條鏈結串列,故 p
應為 p->next
DDDD
,EEEE
都是要找目前子串列的尾巴,即 list_tail(left)
,list_tail(right)
流程如下:
n
n
的指標陣列 begin
, end
,初始值設為 begin[0] = *list, end[0] = list_tail(list);
L
設為 begin[i], R
設為 end[i],並判斷 L
是否等於 R
L
加進最終結果;相等則把 L
當為 pivot
pivot
的串到 left
大於的串到 right
begin
陣列內容以下用圖解來說明:
Begin
及 End
右邊,相等則加進 Result
的前面)List API
改寫static void create_sample(struct list_head *head, element_t *space, int samples)
: 創造一個隨機串列static void copy_list(struct list_head *from, struct list_head *to, element_t *space)
: 複製 from
的串列到 to
的串列上int compare(void *priv, const struct list_head *a, const struct list_head *b)
: 用來當作排序的依據bool check_list(struct list_head *head, int count)
: 確認串列是否排序好且是穩定的排序merge
採用2的冪效果最佳run
都會呈現小到大minrun
來限制每個 run
的最小長度,若不符合要求,則利用二分搜尋法插入進適合的位置minrun
會從 32~64 當中挑選一個數字,使其長度除以 minrun
可以等於或是略小於2的冪AAAA
應為 head
的起始值,也就是 &head
,後續再改變指向的位置即可BBBB
及 CCCC
都是再串接新節點後要更新 tail
的最後位置,即 &a->next
,&b->next
The final links to make a circular doubly-linked list
,可以知道是要將整條串列變成有迴圈的雙向鏈結串列,而再觀察上面的 do while
可以知道目前 tail
的位置是串列最後一個節點,所以 DDDD
應為 tail->next
, EEEE
應為 head->prev
FFFF
為 1
if
的判斷次數lab0-c
AAAA
應為 h->first
BBBB
是要遍歷每個節點,故應該要用 &heads[hash]
,而 CCCC
是要進去 entry
裡面取值,所以應該為 list_entry
DDDD
應為 &heads[hash]
LRUChach
: 用於 LRU
緩存機制的主體結構。包含下列幾個元素
capacity
: 緩存的最大容量count
: 當前緩存中項目的數量dhead
: 一個雙向鏈結串列的頭節點,用於按最近使用順序維持其緩存項目hhead[]
: 一個 hash
頭節點的數組,用於快速訪問緩存項目LRUNode
: 是緩存中每個項目的結構,包含每個緩存項目的資料
key
: 鍵值value
: 數值node
: 用於將此緩存項目連接到 hash
的結構link
: 用於將此緩存項目連接到雙向鏈結的結構hhead[]
中的 hash table
可以快速定位一個特定的 LRUNode
dhead
用於指向最近被訪問的值*pprev
為前一個節點,所以應該更新 next
的 prev
, EEEE
即為 next->pprev
FFFF
為 pos
裡面的 LRUNode
中的 link
GGGG
要將此節點從串列中移除,故 &cache->link
key
值,而 pos
會跑雜湊位置中的每個節點,而 HHHH
、JJJJ
都會對應到 hlist_node
的內容,根據 LRUNode
結構可以知道兩個都為 node
IIII
、KKKK
用於將他們的 link
移到 dhead
的下一個位置,故為 &cache->link
、&c->link
首先,先觀察巨集的功用
BITMAP_LAST_WORD_MASK(bits)
: 利用遮罩的方式,來把用不到的位元給過濾掉,因位元的大小可能不是剛好 64-bit
__const_hweight64(w) (__const_hweight32(w) + __const_hweight32((w) >> 32))
: 計算 Hamming
權重,即二進位有幾個 1
AAAA
應為 0xffffffff
1
的索引值 (右到左)BBBB
將 mask
反向即可清除第 nr
個位元sz
超過 BITS_PER_LONG
,故要做 %
N
個設置為 1
的位元