Linux核心用到的Radix Tree)

來源:互聯網
上載者:User

原文 :http://wurong81.spaces.live.com/blog/cns!5EB4A630986C6ECC!393.entry

 

Linux核心用到的Radix Tree

1. 簡介
    Linux核心的頁快取中,檔案每個資料區塊最多隻能對應一個Page Cache,它通過兩個資料結構來管理這些 Cache 項,一個是 radix tree,另一個是雙向鏈表。Radix tree 是一種搜尋樹,Linux 核心利用這個資料結構來通過檔案內位移快速定位 Cache 項, 是 radix tree對地址索引的一個,該 radix tree 的分叉為4(22),樹高為4,用來快速定位8位檔案內位移。radix tree 中的每一個葉子節點指向檔案內相應位移所對應的Cache項。
將繼續形象化,Linux中radix tree可以描述為:
該圖顯示的分叉數為2^2 = 4。它的樹高height為3。每個節點都包含一個height域以標記以該子樹為根其下的最大二進位整數是多少,以最佳化搜尋速度。當然,需要一個類似下面的一個全域數組來進行的:
static unsigned long height_to_maxindex[RADIX_TREE_MAX_PATH+1];

 

2. 與基本radix tree的重要區別
(1) 對應的key值為2進位形式的整數,而非字串,整數比較遠快於字串比較。所有的分葉節點對應的是long整數值,也就是地址空間值
(2) 當後向連結(分叉)用2進位整數描述,則路徑邊將不會包含任何實際內容,只需要後向連結即可描述一條路徑,這就跟標準的Trie結構一樣了。中將2進位表示為十進位數值,就是“0,1,2,3”4個後向連結。 3. 實現關鍵:
(1) 後向連結的數目由不同系統而不同,比如lib/radix-tree.c中有下面的define:
#ifdef __KERNEL__
#define RADIX_TREE_MAP_SHIFT (CONFIG_BASE_SMALL ? 4 : 6)
#else
#define RADIX_TREE_MAP_SHIFT 3 /* For more stressful testing */
#endif
#define RADIX_TREE_MAP_SIZE (1UL << RADIX_TREE_MAP_SHIFT)
#define RADIX_TREE_MAP_MASK (RADIX_TREE_MAP_SIZE-1)
 也就是說,核心應用中,如果CONFIG_BASE_SMALL被標記,則每個節點提供2^4=32個分叉,否則提供2^6=64個分叉。RADIX_TREE_MAP_MASK則表示取4或6位。顯然最大深度為:
#define RADIX_TREE_INDEX_BITS  (8 /* CHAR_BIT */ * sizeof(unsigned long))
#define RADIX_TREE_MAX_PATH (DIV_ROUND_UP /
        (RADIX_TREE_INDEX_BITS,RADIX_TREE_MAP_SHIFT))
(2) insert/delete因為需要維護每個節點的height域,所以不是單純按照基本radix tree的split和merge來做的,而是需要調整相關節點的height值,是通過分別調用radix_tree_extend和radix_tree_shrink來實現的。
    其中radix_tree_extend只有在新插入的整數大於當前height下所能儲存的最大整數值時才需要調整,因為後者是該height下滿二叉樹所能儲存的最大值,而如果不超過最大值,則肯定會插在某一高度層次中而無需調整其它任何節點的height。
(3) 考慮並發:由於需要頁快取是全域的,各進程不停的訪問,必須要考慮其並發效能,單純的對一棵樹使用鎖導致的大量爭用是不能滿足速度需要的,Linux中是在遍曆樹的時候採用一種RCU技術,來實現同步並發。
    RCU(Read-Copy Update),說實話,我完全沒去看,只知道是一種保證讀該radix tree的時候,可以不要管insert/delete操作,即不需使用鎖。從核心代碼來看,lookup操作的時候,讀一個節點的時候,採用類似於 node = rcu_dereference(*slot); 的調用。Insert/delete操作指標的時候,採用 rcu_assign_pointer(node->slots[offset], slot); 的調用。具體同步的事情都交給RCU去搞的。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.