操作系統(tǒng)學(xué)習(xí)記錄4-文件管理

文件定義
是由創(chuàng)建者所定義的,具有文件名的一組相關(guān)元素的集合
文件分類
按用途分:系統(tǒng)文件、用戶文件、庫文件
按存取控制屬性分:只執(zhí)行文件、只讀文件、讀寫文件
按組織形式和處理方式分:普通文件、目錄文件、特殊文件
按數(shù)據(jù)形式分:源文件、目標(biāo)文件、可執(zhí)行文件
文件的操作
建立(create系統(tǒng)調(diào)用)
找到文件所需的空間、
創(chuàng)建該文件對應(yīng)的目錄項
刪除(delete)
找到文件名對應(yīng)的目錄項
回收文件占用的磁盤塊
刪除文件對應(yīng)的目錄項
打開(open)
找到文件名對應(yīng)的目錄項
將目錄項復(fù)制到內(nèi)存中的打開文件表中,用戶使用打開文件表的編號來指明要操作的文件
每個進程都有打開文件表,系統(tǒng)有一張總的打開文件表
進程打開文件表特有屬性:讀寫指針、訪問權(quán)限
系統(tǒng)打開文件表中特有屬性:打開計數(shù)器
關(guān)閉(close)
將進程打開文件表相應(yīng)表項刪除
回收分配給該文件的內(nèi)存空間等資源
系統(tǒng)的打開文件表的打開計數(shù)器count減一,若count=0,則刪除對應(yīng)表項
讀(read)
根據(jù)讀指針,讀入數(shù)據(jù)量、內(nèi)存位置將文件數(shù)據(jù)從外存調(diào)入內(nèi)存
寫(write)
根據(jù)寫指針,寫出數(shù)據(jù)量、內(nèi)存位置將文件數(shù)據(jù)從內(nèi)存寫出外存
文件的邏輯結(jié)構(gòu)
無結(jié)構(gòu)文件(流式文件)如文本文件
有結(jié)構(gòu)文件(記錄式文件)如數(shù)據(jù)庫表
每條記錄有一個數(shù)據(jù)項可作為關(guān)鍵字,根據(jù)各條記錄的長度是否相等,可以分為定長記錄和可變長記錄。
根據(jù)有結(jié)構(gòu)文件在邏輯上如何組織可以分為以下三類
順序文件:存取速度快,插入或刪除記錄困難,不利于動態(tài)擴充??勺冮L文件無法實現(xiàn)隨機存取,只能從第一個記錄開始往后找。定長記錄可以實現(xiàn)隨機存取,采用順序結(jié)構(gòu)可以快速的找到關(guān)鍵字對應(yīng)的記錄。
串結(jié)構(gòu):記錄之間的順序與關(guān)鍵字無關(guān)。
順序結(jié)構(gòu):記錄之間調(diào)度順序按關(guān)鍵字排序排列
索引文件:檢索速度快,插入或刪除記錄方便,系統(tǒng)開銷大。本身是定長記錄的順序文件,主要用于對信息處理的及時性要求比較高的場合??梢杂貌煌臄?shù)據(jù)項建立多個索引表。
索引順序文件:順序存取速度快,隨機訪問,增、刪、改記錄方便。與索引文件不同的是,并不是每個記錄對應(yīng)一個索引表項,而是一組記錄對應(yīng)一個索引表項。
在檢索效率分析上,順序文件由10000個記錄,從頭開始順序查找,平均查找5000個記錄。采用索引順序文件,可以把10000個文件分為100組,每組100個記錄,需要先順序查找索引表扎到分組,平均50次,找到分組后再順序查找記錄,平均50次。一共平均查找次數(shù)為100次。
為了進一步提高查找效率,可以建立多級索引表,對于一個1000000個記錄,可以建立一張低級索引表,每100個記錄為1組,低級索引表中有10000個表項,再將這10000個記錄分組,每組100個,建立頂級索引表。頂級索引表有100個表項。
為n個記錄建立k級索引,最優(yōu)的分組是每組。檢索一個記錄的平均查找次數(shù)為(/2)*(k+1)。
文件目錄
文件控制塊(FCB):包含基本信息、存取控制信息、使用信息
FCB的有序集合被稱為“文件目錄”,一個FCB就是一個文件目錄項。FCB包含了文件的基本信息(文件名、物理地址、邏輯結(jié)構(gòu)、物理結(jié)構(gòu)等),存取控制信息,使用信息。最重要最基本的還是文件名、文件存放的物理地址。
索引節(jié)點:包括磁盤索引節(jié)點和內(nèi)存索引節(jié)點
目錄結(jié)構(gòu):單級目錄結(jié)構(gòu)、兩級目錄結(jié)構(gòu)、樹形目錄結(jié)構(gòu)、圖形目錄結(jié)構(gòu)
單級目錄中,整個系統(tǒng)只建立一張目錄表,每個文件占一個目錄項,實現(xiàn)了按名存取,不允許文件重名。
早期多用戶操作系統(tǒng)中,采用兩級目錄結(jié)構(gòu),分為主文件目錄和用戶文件目錄。主文件目錄記錄用戶名和相應(yīng)的用戶文件的存放位置。允許不同用戶的文件重名,文件名相同但是對應(yīng)的文件不同。可以再目錄上實現(xiàn)訪問限制。
多級目錄結(jié)構(gòu)(樹形目錄結(jié)構(gòu))用戶訪問某個文件要用文件路徑名標(biāo)識文件,各級目錄之間用“/”分開,從根目錄出發(fā)的路徑被稱為絕對路徑。系統(tǒng)根據(jù)絕對路徑一層一層找到下級目錄,最開始從外存讀入根目錄的目錄表,找到下級目錄后,再從外存繼續(xù)讀入目錄表??梢栽O(shè)置一個當(dāng)前目錄,使得不用每次從根目錄查找。在linux中,“.”表示當(dāng)前目錄。引入當(dāng)前目錄和相對路徑后,磁盤I/O的次數(shù)減少,提升了訪問文件的效率。
樹形目錄結(jié)構(gòu)可以很方便地對文件進行分類,層次結(jié)構(gòu)清晰,也能夠有效地進行文件的管理與保護,但是樹形結(jié)構(gòu)不便于實現(xiàn)文件的共享。因此,提出了無環(huán)圖目錄結(jié)構(gòu)。
在無環(huán)圖目錄結(jié)構(gòu)中,可以使用不同的文件名指向同一個文件,甚至可以指向同一個目錄。需要為每個共享結(jié)點設(shè)置一個共享計數(shù)器,記錄此時有多少個地方在共享該結(jié)點。用戶提出刪除結(jié)點的請求時,只是刪除該用戶的FCB,并使得共享計數(shù)器減一。只有共享計數(shù)器減為0時,才刪除結(jié)點。在共享文件中,各個用戶指向的是同一個文件,因此只要其中一個用戶修改了文件數(shù)據(jù),那么所有用戶都可以看到文件數(shù)據(jù)的變化。
索引結(jié)點改進:在FCB中只記錄文件名和索引結(jié)點指針字段,其他文件描述信息全部存放到索引節(jié)點上。這樣的話每個磁盤塊可以多存放目錄項,大大提升文件檢索速度。存放在外存中的索引結(jié)點稱為磁盤索引結(jié)點,放入內(nèi)存后稱為內(nèi)存索引結(jié)點。內(nèi)存索引結(jié)點需要增加一些信息,如文件是否被修改,當(dāng)前有幾個進程正在訪問該文件。
?
文件共享
硬鏈接(基于索引結(jié)點)和軟鏈接(符號鏈接)
硬鏈接:在索引結(jié)點上設(shè)置一個鏈接計數(shù)變量count,表示鏈接到本索引結(jié)點上的用戶目錄項目數(shù)。若某個用戶需要刪除該文件,則只需把用戶目錄中與該文件對應(yīng)的目錄項刪除,且索引結(jié)點的count減一。若count>0,則不能把文件數(shù)據(jù)刪除,當(dāng)count=0時,系統(tǒng)負責(zé)刪除文件。
軟鏈接:當(dāng)訪問文件時,操作系統(tǒng)判斷該文件屬于link類型文件,會根據(jù)其中記錄的路徑層層查找目錄,最終找到找到最終目錄表的表項,類似于快捷方式。即使軟鏈接指向的共享文件已被刪除,link文件依然存在,只是通過link型文件中的路徑區(qū)查找共享文件會失敗。用軟鏈接訪問共享文件會查詢多級目錄,會有多次磁盤I/O,因此訪問共享文件的速度要比硬鏈接慢。
文件的物理結(jié)構(gòu)
磁盤塊的大小與內(nèi)存塊,頁面的大小相同
在外存管理中,文件的邏輯地址空間被分為了一個一個的文件塊。文件的邏輯地址可以表示為(邏輯塊號,塊內(nèi)地址)的形式。
連續(xù)分配
連續(xù)分配方式要求每個文件在磁盤上占有一組連續(xù)的塊
用戶給出要訪問的邏輯塊號,操作系統(tǒng)找到該文件對應(yīng)的目錄項(FCB)物理塊號=起始塊號+邏輯塊號。還需要檢查用戶提供的邏輯塊號是否合法(邏輯塊號》=長度就不合法)
可以直接算出邏輯塊號對應(yīng)的物理塊號,因此連續(xù)分配支持順序訪問和直接訪問(隨機訪問)
連續(xù)分配的文件在順序讀寫時速度最快
物理上連續(xù)分配的文件不方便拓展
物理上采用連續(xù)分配,存儲空間利用率低,會產(chǎn)生難以利用的磁盤碎片??梢杂镁o湊處理碎片,但是會耗費很大的時間代價。
?
鏈接分配(隱式鏈接、顯式鏈接)
隱式鏈接:除了文件的最后一個磁盤塊之外,每個磁盤塊都會保存指向下一個盤塊的指針,這些指針對用戶是透明的。目錄項記錄起始塊號和結(jié)束塊號。采用鏈接分配(隱式鏈接)只支持順序訪問,不支持隨機訪問,查找效率低。另外,指向下一個盤塊的指針頁需要耗費少量的存儲空間。
采用隱式鏈接的鏈接分配方式,很方便文件拓展,不會有碎片問題,外存利用率高。
顯式鏈接:把用于鏈接文件各物理塊的指針顯示地存放在一張表中,即文件分配表(FAT)。一個磁盤僅設(shè)置一張FAT,開機時,將FAT讀入內(nèi)存,并常駐內(nèi)存。FAT的各個表項在物理上連續(xù)存儲,且每一個表項長度相同,因此物理塊號字段時隱含的。
用戶給出邏輯塊號,操作系統(tǒng)找到該文件目錄項FCB,F(xiàn)CB只記錄起始塊號,從目錄項中找到起始塊號,查找內(nèi)存中的文件分配表FAT(開機后常駐內(nèi)存),往后找i號邏輯塊對應(yīng)的物理塊號。邏輯塊號轉(zhuǎn)換成物理塊號的過程不需要讀磁盤操作。采用顯式鏈接的方式的文件,支持隨機訪問,而且不需要訪問磁盤,相比隱式鏈接來說快很多。顯式鏈接也不會產(chǎn)生外部碎片,可以很方便對文件進行拓展。缺點是文件分配表會占用一定的存儲空間。
索引分配
索引分配允許文件離散地分配在各個磁盤塊中。系統(tǒng)會為每個文件建立一張索引表,索引表中記錄了文件的各個邏輯塊對應(yīng)的物理塊。索引表存放的磁盤塊被稱為索引塊。文件數(shù)據(jù)存放的磁盤塊稱為數(shù)據(jù)塊。目錄中需要記錄索引塊是幾號磁盤塊
用戶給出邏輯塊號,操作系統(tǒng)找到該文件對應(yīng)的目錄項FCB。從目錄項中可以得知索引表存放位置,將索引表從外存讀入內(nèi)存,并查找索引表即可看到邏輯塊在外存中的存放位置。
索引分配方式可以支持隨機訪問,文件拓展也很容易實現(xiàn)。但是索引表需要占用一定的存儲空間。
文件過大,導(dǎo)致磁盤塊裝不下索引表,可以采用下面方案
鏈接方案:如果索引表太大,一個索引塊裝不下,可以將多個索引塊鏈接起來存放。但是只能順序訪問,低效。
多層索引:建立多層索引(類似于多級頁表)。第一層索引塊指向第二層索引塊,還可以根據(jù)文件大小建立多層索引。如2級索引表,訪問一次一級索引,再訪問一次二級索引,最后訪問目標(biāo)數(shù)據(jù)塊,需要3次讀磁盤。k層索引,且頂級索引表未引入內(nèi)存,只需要k+1次讀磁盤操作。
混合索引:多種索引方式的結(jié)合,在頂級索引表中,既包含直接索引地址(直接指向數(shù)據(jù)塊)還包含一級間接索引,兩級間接索引。
超級重要考點:要會根據(jù)多層索引、混合索引的結(jié)構(gòu)計算出文件的最大長度。要能分析訪問某個數(shù)據(jù)塊所需要的讀磁盤次數(shù)(FCB中會存有指向頂級索引表的指針,可以根據(jù)FCB讀入頂級索引塊,每次讀入下一級的索引塊都需要一次讀磁盤操作)要注意題目條件--頂級索引塊是否已經(jīng)調(diào)入內(nèi)存。
?
文件系統(tǒng)層次結(jié)構(gòu)
最高層:文件系統(tǒng)接口
中間層:對對象操縱和管理的軟件集合
最底層:對象及其屬性
在磁盤區(qū)中,分為目錄區(qū)和文件區(qū),目錄區(qū)存放FCB,用于磁盤存儲空間管理的信息。
外存空閑空間管理方法
空閑表法(適用于連續(xù)分配方式)
分配磁盤塊:為一個文件分配連續(xù)的存儲空間,可以采用首次適應(yīng)、最佳適應(yīng)、最壞適應(yīng)等算法來決定要為文件分配哪個區(qū)間?;厥沾疟P塊也和內(nèi)存管理中的動態(tài)分區(qū)類似,回收要注意表項的合并問題。
空閑鏈表法(適用于離散分配的物理結(jié)構(gòu))
空閑盤塊鏈,以盤塊為單位組成一條空閑鏈,空閑盤塊存儲者下一個空閑盤塊的指針。某個文件申請k個盤塊,從鏈頭開始一次摘下k個盤塊分配,并修改空閑鏈的鏈頭指針?;厥盏谋P塊依次掛到鏈尾,并修改鏈尾指針
?
空閑盤區(qū)鏈,以盤區(qū)為單位組成一條空閑鏈,連續(xù)空閑的盤塊組成一個盤區(qū),空閑盤區(qū)的第一個盤塊記錄了盤區(qū)長度和下一個盤區(qū)的指針。某個文件申請k個盤塊,可以采用首次適應(yīng),最佳適應(yīng)算法,從鏈頭開始檢索,按照算法規(guī)則找到一個大小符合的空閑盤區(qū)分配給文件。若沒有合適的連續(xù)空閑塊,也可以將不同的盤區(qū)的盤塊分配給一個文件。
?
位示圖法
每個二進制位對應(yīng)一個盤塊。在本例中,“0”代表盤塊空閑,“1”代表盤塊已分配。位視圖一般用連續(xù)的“字”來表示。如一個字的字長是16位,可以用(字號,位號)對應(yīng)一個盤塊號。有的題目也描述為(行號,列號)最重要的是自己能推出盤塊號與(字號,位號)。注意題目中盤塊號、字號、位號是從0開始還是1開始。n表示字長,字號,位號(i,j)的二進制位對應(yīng)的盤塊號b=ni+j。 b號盤塊對應(yīng)的字號i=b/n,位號j=b/n
若文件需要k個塊,順序掃描位示圖,找到k個相鄰或者不相鄰的“0”。根據(jù)字號、位號計算出盤塊號,并把盤塊分配給文件。將相應(yīng)位設(shè)置位“1”。回收時根據(jù)盤塊號計算出對應(yīng)的字號,位號。將相應(yīng)的二進制位設(shè)為“0”
成組鏈接法(unix使用)
文件卷的目錄區(qū)中專門用一個磁盤塊作為超級塊,當(dāng)系統(tǒng)啟動時需要將超級塊讀入內(nèi)存,并且要保證內(nèi)存與外存中的超級塊數(shù)據(jù)一致。
文件保護
口令保護
為文件設(shè)置一個口令,用戶想要訪問文件時需要提供口令,系統(tǒng)驗證口令是否正確
實現(xiàn)開銷小,但口令一般存放在FCB或者索引結(jié)點中,不太安全
加密保護
用一個密碼進行文件加密,訪問文件需要提供相應(yīng)的密碼
安全性高,但加解密需要花費一定的時間
訪問控制
用一個訪問控制表(ACL)記錄各個用戶對文件的訪問權(quán)限
對文件的訪問類型可以分為:讀寫執(zhí)行刪除
實現(xiàn)靈活,可以實現(xiàn)復(fù)雜的文件保護功能。
虛擬文件系統(tǒng)
是對各種文件系統(tǒng)的一個抽象,為各種文件系統(tǒng)提供一個通用接口;存在于內(nèi)存,運行在內(nèi)核態(tài)
虛擬文件系統(tǒng)是向上層用戶進程提供一個統(tǒng)一標(biāo)準的系統(tǒng)調(diào)用接口,屏蔽底層具體文件系統(tǒng)的實現(xiàn)差異。通俗來講,這個虛擬文件系統(tǒng)VFS統(tǒng)一了UFS文件系統(tǒng),NTFS文件系統(tǒng),F(xiàn)AT文件系統(tǒng)等,對不同的設(shè)備進行了統(tǒng)一的調(diào)用。
VFS要求下層的文件系統(tǒng)必須實現(xiàn)某些規(guī)定的函數(shù)功能,如open/read/write等。一個新的文件系統(tǒng)想要在某操作系統(tǒng)上被使用,就必須滿足該操作系統(tǒng)VFS的要求。
每打開一個文件,VFS就在主存中新建一個vnode,用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)表示文件,無論該文件存儲在哪個文件系統(tǒng)。(vnode只存在于主存中,inode既會調(diào)入主存,也會在外存中存儲)
打開文件后,創(chuàng)建vnode,并將文件信息復(fù)制到vnode中,vnode的功能指針指向具體文件系統(tǒng)的函數(shù)功能。具體文件系統(tǒng)也就是UFS,F(xiàn)AT之類的,
?
文件系統(tǒng)掛載
文件系統(tǒng)掛載與文件系統(tǒng)通過掛載進行關(guān)聯(lián)
文件系統(tǒng)掛載是指文件系統(tǒng)安裝/裝載,指的是如何將一個文件系統(tǒng)掛載到操作系統(tǒng)中。
文件系統(tǒng)掛載要做的事情(指的具體的文件系統(tǒng)):
在VFS中注冊新掛載的文件系統(tǒng),內(nèi)存中的掛載表(mount table)包含每個文件系統(tǒng)的相關(guān)信息,包括文件系統(tǒng)類型、容量大小等。新掛載的文件系統(tǒng),要向VFS提供一個函數(shù)地址列表。將新文件系統(tǒng)加到掛載點,也就是將新文件系統(tǒng)掛載到某個父目錄下。
?
文件系統(tǒng)的全局結(jié)構(gòu)
原始磁盤(什么也沒有,磁盤空空的)
物理格式化,也就是低級格式化。將磁盤劃分扇區(qū),檢測壞扇區(qū),并用備用扇區(qū)替換壞扇區(qū)。
邏輯格式化,磁盤分區(qū)(分卷)完成各分區(qū)的文件系統(tǒng)初始化。磁盤分區(qū)有主引導(dǎo)記錄(MBR,包含磁盤引導(dǎo)程序和分區(qū)表),c盤,D盤,E盤等。
Open系統(tǒng)調(diào)用打開文件的背后過程。第一步先根據(jù)路徑一級一級讀入目錄。找到目標(biāo)文件的FCB,復(fù)制到系統(tǒng)打開文件表。在進程打開文件表中新建一個條目,并返回文件描述符。