文件系統實現概念

文件系統永遠在外存中,存儲大量數據。
文件能夠原地改寫,即能夠讀出一塊,並修改,再寫回。
外存和內存的傳輸的最小單位爲block。
磁盤是隨機存儲器。
文件系統設計也是分層設計思想。從最底層開始講起。
(1)I/O控制層,包括設備驅動程序(翻譯高層命令控制硬件控制器)+中斷處理程序。
(2)基本文件系統:發送高層命令給設備驅動程序用以對磁盤進行讀寫。
(3)文件組織模塊:從邏輯塊-->物理塊,給基本文件系統使用。
(4)邏輯文件系統:管理元數據。元數據就是一些文件屬性+文件名。
分層設計在計算機網絡裏也有提到,TCP/IP協議等。好處當然是能夠清晰的劃分各自的功能。
linux文件系統:ext3,4.
windows文件系統:FAT,NTFS.
一個文件系統包括:
(1)引導控制塊(boot control block)是一個卷的第一塊,如果該卷沒有操作系統,則爲空。
(2)卷控制塊:卷的詳細信息包括有多少塊可以用、塊大小等。
(3)目錄:文件名+FCB(inode 索引節點)。
FCB在另一篇博客中已經講到,包括一些文件的屬性但是不包括文件名。
FCB==inode==Master File Table
內存中有一些信息是在文件系統被mount的時候加載進去的,比如目錄,整個系統的打開文件表、單個進程的打開文件表。
文件系統被mount時可能就已經把所有FCB都分配好了,存在pool中。
UNIX中目錄和文件是一起處理的,windows中目錄和文件有不同的系統調用。
比如open一個新的文件,則創建一個FCB,在單個進程打開文件表,系統打開文件表等中適當加入記錄,並返回一個句柄。
UNIX中稱爲文件描述符,windows中稱爲文件句柄。

一個磁盤能有多個分區,如果一個分區沒有文件系統,則稱爲生的。
引導區如果有多個操作系統和多個文件系統,則通過啓動加載器能夠定位一個操作系統。
根分區包括操作系統和系統文件,在引導時導入內存。
當裝入文件系統時,可以自動或手動裝入。當裝入文件系統時,操作系統需要判定是否有效,如果有效,則在裝入表中填入文件系統的類型。

爲了在不同文件系統中無縫移動,引入了VFS。
(1)VFS把文件系統的接口和具體實現分開。
(2)在NFS中,也要有一個唯一標識遠程文件的標識符,因此vnode類似inode,保存遠程文件屬性。
因此通過vnode還是inode能區分本地和遠程文件,再是通過特定文件類型來區分文件,因此我們可以正確的調用特定的操作。
VFS定義的4個主要對象類型:
(1)inode object。單獨的文件。
(2)file object。打開的文件。
(3)superblock object。整個文件系統。
(4)dentry object。單獨的目錄條目。
對於每個對象類型都有一系列的操作。

目錄實現有很多種,
(1)線性列表。
存儲文件名和指向FCB的線性鏈表。
可以使用軟件緩存來存儲最近使用過的目錄。
(2)哈希表。
給定一個文件名,通過哈希函數,快速找到指定目錄。
缺點:哈希函數及哈希值都是預先給定,不能靈活變換。
解決方案:動態哈希即可擴展哈希、線性哈希等。或者使用溢出桶。

文件分配空間方法:
一、連續分配。
每個文件都是連續分配。分配時遵循首次適應方法。
目錄是由(文件名,開始位置,長度)組成。
優點:直接訪問。
缺點:
(1)外部碎片。
(2)確定文件大小。
解決方法:
(1)對於外部碎片,重新打包即把所有文件系統都複製到磁帶上,清空整個磁盤,並重新分配連續空間。
(2)對於無法確定文件大小,則重新分配孔,但是費時;或者使用擴展連續空間。那麼目錄就是(文件名,開始位置,塊數,第二個開始位置)組成。
二、鏈接分配。
目錄爲(文件名,文件起始指針,文件結尾指針)組成。
文件由鏈表組成。
優點:分配時只要有空閒塊即可。沒有外部碎片。
缺點:
(1)順序訪問而不能隨機訪問。
(2)指針需要空間。
(3)內部碎片。
(4)可靠性問題。因爲由指針鏈接,只要有一個指針丟失,則文件就崩潰。
解決方法:
對於指針佔用空間問題,需要利用更少的指針,則引入了cluster(簇),即一個簇由多個塊組成。但是會加劇內部碎片問題。
對於可靠性,我們可以用FAT(文件分配表),目錄爲(文件名,開始塊)組成。先在FAT找到指定塊,再指向塊的具體位置。
採用FAT會導致磁頭尋道時間過長。
三、索引分配。
把所有索引放在一起,可以支持直接訪問。
但是索引可能會在一個塊不夠存放,因此有了幾種方法:
(1)鏈接方案:通過將索引塊鏈接起來。
(2)多層索引。
(3)組合方案。例如Unix中的inode,在inode中有15個指針存在文件中,頭12個指針爲直接塊。其他三個爲間接索引塊。第一個爲一級間接塊。依次類推,第三個爲三級間接塊。
如果文件不大,則可以直接訪問。

對於空閒空間,我們也需要維護一個空閒空間鏈表。下面介紹幾種方法實現。
(1)位向量。
通過已分配的塊記爲0,未分配的塊記爲1,則只需要簡單的位運算就能得出第一個空閒塊或者連續空閒塊大小等結論。
缺點:所佔空間太大。
(2)鏈表。
空閒空間通過鏈表連起來,第一個空閒塊的地址緩存在內存中。
缺點:效率不高。
(3)組。
將n個空閒塊的地址存在第一個空閒塊中。
(4)計數。
空閒空間表中每個條目記錄(起始,長度)的記錄。



注:本人正在學操作系統,發現此篇博客是原創者對《操作系統概念》書中的一些總結,結合書本看效率更高。

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