TpsFs目錄索引

1.低版本TpsFs的目錄索引算法

文件系統中,一個目錄由一個inode節點(記錄文件屬性)及衆多目錄項(entry)組成,目錄項用於對該目錄下各個子文件進行索引,通常目錄項中會記錄如下信息。

  • 子目錄的文件名稱;

  • 文件名稱的長度;

  • 子目錄inode節點所在位置。

當查找一個文件時,通常是先找到該文件的inode節點,inode節點是根據其父目錄內對應的目錄項所記錄的inode節點位置進行查找的。因此目錄項的索引效率的高低對文件查找有着很大的影響。

以前的TpsFs版本中,一個文件夾下目錄項的存儲通常是順序存儲,當我們去查找一個文件夾下面的子文件時,會將衆多目錄項從磁盤內逐一讀出,並用目錄項下的文件名稱進行比較。查找目錄項算法如圖1.1所示。

圖1.1 依次遍歷目錄項

這種算法的缺點是當一個文件夾內的目錄項數目很多,並且待查找的目錄項又在文件夾末尾時,則需要將這些目錄項全部從磁盤內讀出,磁盤訪問次數急劇增加,從而影響了目錄索引的效率。

2.高版本TpsFs的目錄索引算法

在3.2.5 SylixOS內核版本以後,TpsFs爲了提高目錄索引效率,採用了B+樹方式對目錄內的目錄項進行存儲。當TpsFs新建一個目錄時,不僅僅只是建立該目錄的inode節點,同時還會建立B+樹根節點並初始化。當需要向該目錄內增加子文件時,該算法先通過murmurhash哈希算法算出該子文件對應的Hash值,並將該Hash值做爲B+樹的鍵值,該B+樹的葉子結點的鍵值用於存儲目錄項的位置。

下面舉例說明這種算法的存儲過程,TpsFs在根目錄下分別建立a.txt、b.txt、c.txt文件,其過程如下:

  • TpsFs通過Murmurhash算法算出a.txt的Hash值爲10,該值做爲B+樹鍵值;爲a.txt目錄項分配空間,該空間的位置由B+樹鍵值索引。

  • TpsFs通過Murmurhash算法算出b.txt的Hash值爲20,該值作爲B+樹鍵值;爲b.txt目錄項分配空間,該空間的位置由B+樹鍵值索引。

  • TpsFs通過Murmurhash算法算出c.txt的Hash值爲30,該值作爲B+樹鍵值;爲c.txt目錄項分配空間,該空間的位置由該B+樹鍵值索引。

創建成功後,各個子文件對應的目錄項的位置如圖1- 2所示。

圖1- 2 各個子文件對應目錄項位置

根據B+樹的特點,當採用上述這種算法時,查找某目錄下的一個子文件所需要訪問的磁盤次數即爲整個B+樹的深度,TpsFs中的B+樹一個節點可以存儲幾百個鍵值,也就是說當一個文件夾內存在幾百個文件時,其B+樹深度也還是1,這比低版本的依次遍歷算法的效率明顯高出很多。B+樹的深度通常由B+樹一個節點所能容納的最大鍵值數和總的鍵值數決定,這裏不多做討論,可自行了解B+樹的基本定義,TpsFs中最大節點數定義在libsylixos\SylixOS\fs\tpsFs\tpsfs_btree.h文件內。

2.1Murmurhash算法特點

Murmurhash算法是一種非加密型哈希函數,適用於一般的哈希檢索操作,其特點爲速度快、實現32位、238位Hash鍵值,具有較高的平衡性和低碰撞率,也就是說,不同文件名對應的Hash值相同的概率很低。

雖熱不同文件名Hash值重複的概率較低,但也是有可能發生的,當出現不同文件名對應相同的Hash值時,TpsFs會將Hash值重複的子文件的目錄項保存到低版本時所採用的數據區,即還是採用如圖1- 2所示的算法對子文件的目錄項進行查找。

3.總結

目錄索引算法的好壞對文件系統查找效率有着很大的影響,TpsFs在多處索引算法上都採用B+樹,其查找、修改、插入都有着較爲穩定的時間複雜度。


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