【作業系統】【讀書筆記】區域性性和快速檔案系統
老檔案系統的問題
-
老檔案系統:簡單的superblock + inode區 + data區
-
問題:效能不佳
-
定位問題:老檔案系統將磁碟當作隨機存取記憶體,從而導致讀取一個檔案時可能會跨越很遠的磁碟距離(比如讀完檔案的inode後需要讀取data),花費大量時間尋道
-
檔案系統會變得非常碎片化(因為沒有管理空閒空間)
如下面的例子,訪問E檔案時,由於E2和E3不連續,故需要尋道
-
原始塊太小(512B),導致資料傳輸低效
-
-
解決思路
-
如何儘量減少讀寫檔案時的磁頭移動?(如何儘量把檔案存在一個連續的地方?)
-
如何管理空閒記憶體?
-
原始塊多大比較好?(太小的話雖然碎片問題會減少,但是會造成大量定位開銷;太大的話會浪費)
-
解決的關鍵:磁碟意識(不要把磁碟想象成隨機儲存介質!磁碟就是磁碟)
-
-
下面介紹FFS系統(快速檔案系統)的改進思路
組織結構:柱面組
-
柱面組:FFS將磁碟劃分為一些分組,稱為柱面組,通常在一個柱面上
-
每個組中都有超級塊(出於可靠性考慮)、ib、db、inode區、data區
-
點陣圖可以很方便地找到一大塊連續的記憶體空間,可以避免某些碎片問題
-
-
如何分配檔案和目錄
-
原理:相關的東西放一起(因為相關的東西通常會一起讀寫,故放在一起可以減少磁頭移動)
-
目錄的放置:找到分配數量少的柱面組,放過去(跨組平衡目錄)
-
檔案:inode和data放在一個組中,並且將同一目錄下的所有檔案放在同一個柱面組中
-
原因:同一目錄下的檔案通常一起訪問,比如make的過程
-
-
大檔案:例外!因為大檔案可能太大了放不下,同時大檔案放在一個柱面組裡可能會影響別的檔案的放置
-
解決方法1:大檔案分成多個大塊,每個大塊放在不同的組中
-
大塊的大小要足夠大,使得大部分時間仍然放在磁碟的資料傳輸上,而不是尋道上
-
-
FFS的做法:inode中的直接索引指向的直接塊和inode一起放在一個組中,間接塊和間接塊指向的所有塊放在單獨的組中
-
-
其他問題
-
內部碎片問題:4KB的塊很大,如果檔案特別小則會造成很大的浪費
-
解決方法:引入子塊,子塊只有512B,如果檔案很小,則為其分配子塊儲存;如果檔案大小超過4K,再將子塊複製到一個完整的4K中並且釋放子塊
-
引入子塊的問題:拷貝操作效率低下
-
解決方法:子塊設定在緩衝中,以4K塊的形式傳送到檔案系統進行儲存
-
-
-
磁碟佈局問題:如果塊號按照順序排列,那麼讀取完一個塊以後,磁頭可能已經移到了下一個塊後面的位置,從而錯過下一個塊
-
解決辦法:優化磁碟佈局,跳著排
-
-
硬連結問題:不能指向目錄(防止引入迴圈)
-
FFS的解決:引入符號連結的概念,相當於為其他檔案創造“別名”
-