(一)文件系統(tǒng)
文件系統(tǒng)組成:駐留在外存中的數(shù)據(jù)管理結(jié)構(gòu)(最基礎(chǔ));駐留在內(nèi)存中的數(shù)據(jù)管理結(jié)構(gòu)屋摇;文件系統(tǒng)的管理程序代碼揩魂。
外存數(shù)據(jù)的損壞會(huì)導(dǎo)致文件系統(tǒng)的損壞。
1炮温、外存數(shù)據(jù)結(jié)構(gòu)
Linux稱他的外存數(shù)據(jù)結(jié)構(gòu)為超級(jí)塊火脉。
(1)EXT文件系統(tǒng)將分區(qū)劃分成塊組(Block Group)每個(gè)塊組對(duì)應(yīng)一組連續(xù)的存儲(chǔ)塊。
(2)FAT文件系統(tǒng)在外存的布局
FAT文件系統(tǒng)中柒啤,一個(gè)目錄項(xiàng)就是一個(gè)文件控制塊倦挂,目錄是文件控制塊的有序集合。一個(gè)文件只能有一個(gè)名字担巩。
(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)及其管理對(duì)象在內(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àng)呀非、打開的文件對(duì)象。(具體實(shí)現(xiàn)函數(shù)等見ppt)
(2)系統(tǒng)中可能同時(shí)存在多種文件系統(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)
略寫判呕,只記錄有點(diǎn)知識(shí)點(diǎn)。
(1)128M的sts.img做SFS的磁盤送滞,第0塊為超級(jí)塊 --> 根目錄 --> 塊位圖 --> 文件侠草。
連續(xù)存儲(chǔ)(預(yù)先寫入,也不允許新建)犁嗅。
從“.”到“..”再往下找到目錄項(xiàng)边涕,看到名字是它,就看i節(jié)點(diǎn)的位置褂微。
(2)安裝
使用文件系統(tǒng)之前功蜓,必須先在內(nèi)存中建立該文件系統(tǒng)的管理結(jié)構(gòu)。建立文件系統(tǒng)管理結(jié)構(gòu)的過程稱為安裝宠蚂。
安裝的目的--> 建立文件系統(tǒng)的超級(jí)結(jié)構(gòu)塊式撼,并將其根目錄嫁接在安裝點(diǎn)目錄之上,形成一個(gè)全局統(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)串成一個(gè)隊(duì)列,同時(shí)存到hash表中方便查找项栏。
多文件系統(tǒng) --> 把這棵樹 dsk1拼到 dsk0中抵代,用其根目錄覆蓋安裝點(diǎn) --> 全部就一棵樹
文件系統(tǒng)只能由超級(jí)用戶安裝。
最早的安裝點(diǎn)是靜態(tài)做的rootfs忘嫉,僅有一個(gè)根目錄,名為“/”案腺,父目錄是自己庆冕,其 inode 號(hào)是0。建立在內(nèi)存塊設(shè)備之上劈榨,設(shè)備號(hào)是0访递,塊大小是4096.
(3)文件增長時(shí),要為其分配邏輯塊——ucroe 從低到高搜索文件系統(tǒng)的塊位圖
文件長度縮短或刪除時(shí)同辣,要釋放邏輯塊拷姿。
由于 indirect 塊在內(nèi)存中沒有緩存,對(duì)它的修改要立刻寫回磁盤旱函。
邏輯塊分配的原則 —— 盡力維持文件在塊設(shè)備上的連續(xù)性响巢。
SFS 沒有考慮這個(gè)問題;
EXT 引入預(yù)分配機(jī)制——為每個(gè)文件建立一個(gè)預(yù)分配窗口(保證各文件的預(yù)分配窗口互不重疊棒妨,但不保證其中的邏輯快是空閑的)
這個(gè)窗口沒有了就去下一個(gè):
預(yù)分配窗口僅僅限定了搜索范圍踪古,其中的邏輯塊并未真正分配給文件。動(dòng)態(tài)創(chuàng)建,尺寸動(dòng)態(tài)調(diào)整(8~1027)伏穆。
Lazy拘泞,第一次訪問該文件時(shí)再創(chuàng)建根目錄 inode。訪問文件前枕扫,需解析路徑名陪腌,找到與之對(duì)應(yīng)的 FCB,并為其創(chuàng)建inode 結(jié)構(gòu)。
(4)解析路徑名
絕對(duì)路徑名 & 相對(duì)路徑名(上一講)
路徑名解析的開始位置就是參考點(diǎn)。整個(gè)路徑名解析過程就是遞歸的全陨。
如果某個(gè)目錄項(xiàng)的名字與路徑名相同檐蚜,就可以獲得其 ino 號(hào)(邏輯塊號(hào),對(duì)應(yīng)的邏輯塊中只有一個(gè) sfs_disk_inode 結(jié)構(gòu))沫换,將sfs_disk_inode 結(jié)構(gòu)讀出,可以為其創(chuàng)建一個(gè) inode 結(jié)構(gòu)。
當(dāng) inode 的引用計(jì)數(shù)變成0時(shí)请唱,說明文件已無用戶,應(yīng)釋放掉它的 inode 結(jié)構(gòu)过蹂。
(5)Linux 文件管理操作流程
(三)
1十绑、文件邏輯結(jié)構(gòu)
文件系統(tǒng)本身關(guān)心的是文件的屬性及存儲(chǔ)位置,用戶關(guān)心的是文件的邏輯結(jié)構(gòu)酷勺。
文件的物理結(jié)構(gòu)描述文件在外存的存儲(chǔ)方法本橙;目錄結(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ù)鍵值建索引)暇唾;增加溢出文件(存儲(chǔ)新增加的記錄)
溢出文件中的記錄定期合并到主文件上。
(4)多索引結(jié)構(gòu):根據(jù)不同域?yàn)橐粋€(gè)文件建立多個(gè)索引辰斋,每個(gè)索引針對(duì)一個(gè)域策州。
(5)Hash結(jié)構(gòu)
hash 結(jié)構(gòu)的文件中,每個(gè)記錄需要一個(gè)主鍵宫仗,記錄存儲(chǔ)的位置時(shí)由 hash 函數(shù)根據(jù)主鍵值計(jì)算得到的够挂。可能有多個(gè)記錄的 hash 值相同锰什,所以用一個(gè)溢出文件保存 hash 值相同的記錄下硕。
2丁逝、文件存取方式
文件系統(tǒng)不關(guān)心文件的邏輯結(jié)構(gòu),通常將文件看成是一組連續(xù)的字節(jié)(字節(jié)流)梭姓,或者一個(gè)字節(jié)數(shù)組霜幼。每個(gè)字節(jié)有自己的地址(相對(duì)文件開始地址的偏移量)。
連續(xù)是指下一字節(jié)的偏移量是上一字節(jié)的偏移量+1誉尖,不管物理上這些字節(jié)在什么位置罪既。
文件存取方式:①順序存取(缺收∷ )琢感;②隨機(jī)存取
文件存取方式與外存特性有關(guān):磁帶——順序存取探熔;磁盤——即可順序存取驹针,也可隨機(jī)存取
文件存取方式與文件邏輯結(jié)構(gòu)有關(guān):堆和順序結(jié)構(gòu)——順序存取诀艰;索引和 hash——課順序也可隨機(jī)