B+ 樹及其在xfs inode中得使用

B+ 樹

本文中B+樹說明基本使用wiki的詞條內容。

什麼是B+樹

B+ 樹是B 樹的一個擴展。一種樹數據結構,通常用於數據庫和操作系統的文件系統中。B+ 樹的特點是能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+ 樹元素自底向上插入,這與二叉樹恰好相反。

B+ 樹在節點訪問時間遠遠超過節點內部訪問時間的時候,比可作爲替代的實現有着實在的優勢。這通常在多數節點在次級存儲比如硬盤中的時候出現。通過最大化在每個內部節點內的子節點的數目減少樹的高度,平衡操作不經常發生,而且效率增加了。這種價值得以確立通常需要每個節點在次級存儲中佔據完整的磁盤塊或近似的大小。

B+

B+ 背後的想法是內部節點可以有在預定範圍內的可變數目的子節點。因此,B+ 樹不需要象其他自平衡二叉查找樹那樣經常的重新平衡。對於特定的實現在子節點數目上的低和高邊界是固定的。例如,在 2-3 B 樹(常簡稱爲2-3 樹)中,每個內部節點只可能有 2 或 3 個子節點。如果節點有無效數目的子節點則被當作處於違規狀態。

B+ 樹節點結構

在 B+ 樹中的節點通常被表示爲一組有序的元素和子指針。如果此B+樹的序數(order)是m ,則除了根之外的每個節點都包含最少 m/2(向下取整) 個元素最多 m-1 個元素,對於任意的節點有最多 m 個子指針。對於所有內部節點,子指針的數目總是比元素的數目多一個。因爲所有葉子都在相同的高度上,節點通常不包含確定它們是葉子還是內部節點的方式。

每個內部節點的元素充當分開它的子樹的分離值。例如,如果內部節點有三個子節點(或子樹)則它必須有兩個分離值或元素 a1 和 a2。在最左子樹中所有的值都小於 a1,在中間子樹中所有的值都在 a1 和 a2 之間,而在最右子樹中所有的值都大於 a2。

算法

查找

查找類似二叉樹查找,從root節點開始查找,自上往下遍歷樹,選擇其分離值在要查找值任意一邊的子指針。在節點內部使用二分查找確定這個位置。

插入

節點要處於違規狀態,它必須包含在可接受範圍之外數目的元素。

  1. 首先,查找要插入其中的節點的位置。接着把值插入這個節點中。

  2. 如果沒有節點處於違規狀態則處理結束。

  3. 如果某個節點有過多元素,則把它分裂爲兩個節點,每個都有最小數目的元素。在樹上遞歸向上繼續這個處理直到到達根節點,如果根節點被分裂,則創建一個新根節點。爲了使它工作,元素的最小和最大數目典型的必須選擇爲使最小數不小於最大數的一半。

刪除

  1. 首先,查找要刪除的值。接着從包含它的節點中刪除這個值。

  2. 如果沒有節點處於違規狀態則處理結束。

  3. 如果節點處於違規狀態則有兩種可能情況:

 1. 它的兄弟節點,就是同一個父節點的子節點,可以把一個或多個它的子節點轉移到當前節點,而把它返回爲合法狀態。如果是這樣,在更改父節點和兩個兄弟節點的分離值之後處理結束。
 2. 它的兄弟節點由於處在低邊界上而沒有額外的子節點。在這種情況下把兩個兄弟節點合併到一個單一的節點中,而且我們遞歸到父節點上,因爲它被刪除了一個子節點。持續這個處理直到當前節點是合法狀態或者到達根節點,在其上根節點的子節點被合併而且合併後的節點成爲新的根節點。

B+ 樹在xfs中的應用

當前大部分Linux filesystem的inode都用B+ 樹來組織他們的inode節點。使得查找更快更便捷。

xfs相關的是參照 麥子邁的博客

Linux filesystem的結構特點

在Linux系統內部,一個文件系統是由邏輯塊的序列組成的,每塊爲512個字節。具體組成下面表中所示。

引導塊超級塊索引節點(inode)區數據區
用於讀入啓動操作系統記錄文件系統的當前狀態,如硬盤空間的大小和文件系統的基本信息存放文件系統的索引節點表,Linux系統中每個文件和目錄都佔據一個索引節點。文件系統一般從根節點開始存放文件系統的索引節點表,Linux系統中每個文件和目錄都佔據一個索引節點。文件系統一般從根節點開始

當然,現在主流的filesystem超級塊可能不止一個,索引節點區和數據區又會劃分成多個block group。

xfs中Allocation Group

XFS 引入了 Allocation Group(AG) 來劃分一系列相等的塊,每個 AG 所含的信息非常接近於一個完整的 XFS。每個 AG 都有三個主要功能:

  1. 一個 Superblock 來描述整個文件系統信息

  2. 空閒空間管理

  3. Inode 分配和管理

多個 AG 的引入使得整個文件系統更加並行化,因爲 AG 之間沒有太多的共享資源和依賴。唯一的全局信息是第一個 AG 維護了一個全局的空閒空間情況和全局 inode 數(只在 umount 的時候會更新)。

B+樹在AG中得使用

AG

XFS 通過兩個B+樹來管理空閒空間,如上圖所示,分別是 Key 爲 Block number 和 Block count 的兩個。這使得 XFS 能通過 Block number 或者 Block size 來快速定位。如上圖所示”AG free block info”主要是包括兩個B+樹的 root 節點的 block number(一個 block 存儲一個 root 節點),level,第一個和最後一個空閒列表塊,空閒列表塊的數量等等。

從”AG free block info”得到兩個B+樹的 root 節點信息後,每個節點分爲兩部分,一部分是節點信息,另一部分是 Key(Block count 或者 Block size)。

而圖中的”AG Free List”是每個 AG 保留下來供B+樹增長使用的,通常來說會是4個 block。

AG inode管理

Inode 管理是每個 Linux 文件系統的重點,如何使用和分配 Inode 影響着文件系統的性能和利用率。”AG inode B+tree info”包含着 AG 的 inode 信息,如 inode 已分配數,root 節點,空閒 inode 數,最近分配的 inode 和一個已刪除 inode (inode 被刪除但是其管理的數據塊仍在,需要推遲刪除,這個表在 mount 和 umount 的時候通常會清空)的哈希表。

與空閒空間管理的B+樹類似,inode B+樹的每個節點都包含着節點信息和Key(塊位置)。

Data fork

XFS 使用 extent 來管理空間,一個 extent 包含了文件的邏輯 offset 和 block 的開始位置與長度,狀態。一個文件可能會有多個 extent 組成,當 extent 所代表的 block 連續時,多個 extent 會相互合併。

data fork 裏的 extent 數據在絕大多數都可以放在 inode block 裏,每個 extent 代表一個記錄組成一個數組放在 data fork。但是當 data fork 無法容納更多的 extent 時,extent 會被使用B+樹管理。B+樹的 root 節點會被放在 data fork 裏。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章