(一)文件系統(tǒng)
文件系統(tǒng)組成:駐留在外存中的數(shù)據(jù)管理結(jié)構(gòu)(最基礎(chǔ));駐留在內(nèi)存中的數(shù)據(jù)管理結(jié)構(gòu);文件系統(tǒng)的管理程序代碼。
外存數(shù)據(jù)的損壞會導(dǎo)致文件系統(tǒng)的損壞。
1、外存數(shù)據(jù)結(jié)構(gòu)
Linux稱他的外存數(shù)據(jù)結(jié)構(gòu)為超級塊。
(1)EXT文件系統(tǒng)將分區(qū)劃分成塊組(Block Group)每個塊組對應(yīng)一組連續(xù)的存儲塊。
(2)FAT文件系統(tǒng)在外存的布局
FAT文件系統(tǒng)中,一個目錄項就是一個文件控制塊,目錄是文件控制塊的有序集合。一個文件只能有一個名字。
(3)NTFS在外存的布局
(4)Ucore的SFS文件系統(tǒng)
2、內(nèi)存數(shù)據(jù)結(jié)構(gòu)
(1)內(nèi)存數(shù)據(jù)結(jié)構(gòu)是文件系統(tǒng)及其管理對象在內(nèi)存的表示,其數(shù)據(jù)來源于外存數(shù)據(jù)結(jié)構(gòu)。
內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)是用戶最近使用的文件系統(tǒng)在內(nèi)存中的表示,包括:文件系統(tǒng)結(jié)構(gòu)、FCB、目錄項、打開的文件對象。(具體實現(xiàn)函數(shù)等見ppt)
(2)系統(tǒng)中可能同時存在多種文件系統(tǒng),統(tǒng)一文件系統(tǒng)的一種方式是建立虛擬文件系統(tǒng)VFS(Virtual File System)略
3、管理程序
安裝 eg:把bin下的安裝到user中,則user跟bin中一樣,原來的不在。 安裝 --> 目錄樹直接拿過去。若再卸載一下,user中原來的內(nèi)容又出現(xiàn)了。
(二)文件系統(tǒng)管理操作(結(jié)合Ucore)
略寫,只記錄有點知識點。
(1)128M的sts.img做SFS的磁盤,第0塊為超級塊 --> 根目錄 --> 塊位圖 --> 文件。
連續(xù)存儲(預(yù)先寫入,也不允許新建)。
從“.”到“..”再往下找到目錄項,看到名字是它,就看i節(jié)點的位置。
(2)安裝
使用文件系統(tǒng)之前,必須先在內(nèi)存中建立該文件系統(tǒng)的管理結(jié)構(gòu)。建立文件系統(tǒng)管理結(jié)構(gòu)的過程稱為安裝。
安裝的目的--> 建立文件系統(tǒng)的超級結(jié)構(gòu)塊,并將其根目錄嫁接在安裝點目錄之上,形成一個全局統(tǒng)一的文件視圖。
ucore只有一種文件系統(tǒng)SFS。
mksfs(創(chuàng)建文件系統(tǒng)) --> sfs.img(即為disk0)。
安裝(建立fs結(jié)構(gòu)) --> 結(jié)構(gòu)信息從disk0中來。
根據(jù)外存把內(nèi)存文件系統(tǒng)管理結(jié)構(gòu)建立起來。文件所有管理結(jié)構(gòu)串成一個隊列,同時存到hash表中方便查找。
多文件系統(tǒng) --> 把這棵樹 dsk1拼到 dsk0中,用其根目錄覆蓋安裝點 --> 全部就一棵樹
文件系統(tǒng)只能由超級用戶安裝。
最早的安裝點是靜態(tài)做的rootfs,僅有一個根目錄,名為“/”,父目錄是自己,其 inode 號是0。建立在內(nèi)存塊設(shè)備之上,設(shè)備號是0,塊大小是4096.
(3)文件增長時,要為其分配邏輯塊——ucroe 從低到高搜索文件系統(tǒng)的塊位圖
文件長度縮短或刪除時,要釋放邏輯塊。
由于 indirect 塊在內(nèi)存中沒有緩存,對它的修改要立刻寫回磁盤。
邏輯塊分配的原則 —— 盡力維持文件在塊設(shè)備上的連續(xù)性。
SFS 沒有考慮這個問題;
EXT 引入預(yù)分配機制——為每個文件建立一個預(yù)分配窗口(保證各文件的預(yù)分配窗口互不重疊,但不保證其中的邏輯快是空閑的)
這個窗口沒有了就去下一個:
預(yù)分配窗口僅僅限定了搜索范圍,其中的邏輯塊并未真正分配給文件。動態(tài)創(chuàng)建,尺寸動態(tài)調(diào)整(8~1027)。
Lazy,第一次訪問該文件時再創(chuàng)建根目錄 inode。訪問文件前,需解析路徑名,找到與之對應(yīng)的 FCB,并為其創(chuàng)建inode 結(jié)構(gòu)。
(4)解析路徑名
絕對路徑名 & 相對路徑名(上一講)
路徑名解析的開始位置就是參考點。整個路徑名解析過程就是遞歸的。
如果某個目錄項的名字與路徑名相同,就可以獲得其 ino 號(邏輯塊號,對應(yīng)的邏輯塊中只有一個 sfs_disk_inode 結(jié)構(gòu)),將sfs_disk_inode 結(jié)構(gòu)讀出,可以為其創(chuàng)建一個 inode 結(jié)構(gòu)。
當(dāng) inode 的引用計數(shù)變成0時,說明文件已無用戶,應(yīng)釋放掉它的 inode 結(jié)構(gòu)。
(5)Linux 文件管理操作流程
(三)
1、文件邏輯結(jié)構(gòu)
文件系統(tǒng)本身關(guān)心的是文件的屬性及存儲位置,用戶關(guān)心的是文件的邏輯結(jié)構(gòu)。
文件的物理結(jié)構(gòu)描述文件在外存的存儲方法;目錄結(jié)構(gòu)描述一組文件的組織方法;文件邏輯結(jié)構(gòu)描述文件內(nèi)容的組織方法。
(1)堆結(jié)構(gòu)(pile)——數(shù)據(jù)順序堆在一起,按序搜索、使用文件。
(2)順序結(jié)構(gòu)
若記錄按鍵值排序,可用折半查找方法定位記錄,搜索塊。
(3)帶索引順序結(jié)構(gòu)
順序結(jié)構(gòu)基礎(chǔ)上:增加索引表(根據(jù)鍵值建索引);增加溢出文件(存儲新增加的記錄)
溢出文件中的記錄定期合并到主文件上。
(4)多索引結(jié)構(gòu):根據(jù)不同域為一個文件建立多個索引,每個索引針對一個域。
(5)Hash結(jié)構(gòu)
hash 結(jié)構(gòu)的文件中,每個記錄需要一個主鍵,記錄存儲的位置時由 hash 函數(shù)根據(jù)主鍵值計算得到的。可能有多個記錄的 hash 值相同,所以用一個溢出文件保存 hash 值相同的記錄。
2、文件存取方式
文件系統(tǒng)不關(guān)心文件的邏輯結(jié)構(gòu),通常將文件看成是一組連續(xù)的字節(jié)(字節(jié)流),或者一個字節(jié)數(shù)組。每個字節(jié)有自己的地址(相對文件開始地址的偏移量)。
連續(xù)是指下一字節(jié)的偏移量是上一字節(jié)的偏移量+1,不管物理上這些字節(jié)在什么位置。
文件存取方式:①順序存取(缺省);②隨機存取
文件存取方式與外存特性有關(guān):磁帶——順序存取;磁盤——即可順序存取,也可隨機存取
文件存取方式與文件邏輯結(jié)構(gòu)有關(guān):堆和順序結(jié)構(gòu)——順序存取;索引和 hash——課順序也可隨機