最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

操作系統(tǒng)(六)——文件管理

2023-04-18 10:49 作者:UCLmsc  | 我要投稿

一、文件系統(tǒng)基礎(chǔ)

(一)、文件的概念

文件是操作系統(tǒng)中一個重要的概念。在系統(tǒng)運(yùn)行時,計算機(jī)以進(jìn)程為基本單位進(jìn)行資源的調(diào)度和分配;而在用戶進(jìn)行的輸入、輸出中,則以文件為基本單位。大多數(shù)應(yīng)用程序的輸入都是通過文件來實(shí)現(xiàn)的,其輸出也都保存在文件中,以便信息的長期存儲及將來的訪問。當(dāng)用戶將文件用于應(yīng)用程序的輸入、輸出時,還希望可以訪問文件、修改文件和保存文件等,實(shí)現(xiàn)對文件的維護(hù)管理,這就需要系統(tǒng)提供一個文件管理系統(tǒng),操作系統(tǒng)實(shí)現(xiàn)用戶的這些管理要求。

從用戶的角度看,文件系統(tǒng)是操作系統(tǒng)的重要部分之一。用戶關(guān)心的是如何命名、分類和查找文件,如何保證文件數(shù)據(jù)的安全性以及對文件可以進(jìn)行哪些操作等。而對其中的細(xì)節(jié),如文件如何存儲在輔存上、如何管理文件輔存區(qū)域等關(guān)心甚少。

文件系統(tǒng)提供了與二級存儲相關(guān)的資源的映像,讓用戶能在不了解文件的各種屬性、文件存儲介質(zhì)的特性以及文件在存儲介質(zhì)上的具體位置等情況下,方便快捷的使用文件。

用戶通過文件系統(tǒng)建立文件,提供應(yīng)用程序的輸入輸出,對資源進(jìn)行管理。首先了解文件的結(jié)構(gòu),我們通過自底向上的方式來定義。

1)數(shù)據(jù)項

數(shù)據(jù)項是文件系統(tǒng)中最低級的數(shù)據(jù)組織形式,可分為以下兩種類型:

基本數(shù)據(jù)項:用于描述一個對象的某種屬性的一個值,如姓名、日期或證件號碼等,是數(shù)據(jù)中可命名的最小邏輯數(shù)據(jù)單位,即原子數(shù)據(jù)。

組合數(shù)據(jù)項:有多個基本數(shù)據(jù)項組成。

2)記錄

記錄是一組相關(guān)的數(shù)據(jù)項集合,用于描述一個對象在某方面的屬性,如一個考生報名記錄包括考生姓名、出生日期、報考學(xué)校代號、身份證號等一系列域。

3)文件

文件是指由創(chuàng)建這所定義的一組相關(guān)信息的集合,可分為有結(jié)構(gòu)文件無結(jié)構(gòu)文件兩種。在有結(jié)構(gòu)文件中,文件由一組相似記錄組成,如報考某學(xué)校的所有考生的報考信息記錄;而無結(jié)構(gòu)文件則被看成是一個字符流,比如一個二進(jìn)制文件或字符文件。

雖然上面給出了結(jié)構(gòu)化的表述,但實(shí)際上關(guān)于文件并無嚴(yán)格定義。通常在操作系統(tǒng)中將程序和數(shù)據(jù)組成文件。文件可以是數(shù)字、字母或二進(jìn)制代碼,基本訪問單元可以是字節(jié)、行或記錄。文件可以長期存儲于硬盤或其他二級存儲器,運(yùn)行可控制的進(jìn)程間共享訪問,能夠被組織成復(fù)雜的結(jié)構(gòu)。

文件有一定的屬性,這根據(jù)系統(tǒng)的不同而有所不同,但是通常都包括如下屬性:

名稱:文件名唯一,以容易讀取的形式保存。

標(biāo)識符:表示文件系統(tǒng)內(nèi)文件的唯一標(biāo)簽,通常為數(shù)字,它是對人不可讀的一種內(nèi)部名稱。

類型:被支持不同類型的文件系統(tǒng)所使用。

位置:指向設(shè)備和設(shè)備上文件的指針。

大?。何募?dāng)前大?。ㄓ米止?jié)、字或塊表示),也可包含文件允許的最大值。

保護(hù):對文件進(jìn)行保護(hù)的訪問控制信息。

時間、日期和用戶標(biāo)識:文件創(chuàng)建、上次修改和上次訪問的相關(guān)信息,用于保護(hù)、安全和跟蹤文件的使用。

文件控制塊(file control block,F(xiàn)CB)是操作系統(tǒng)中一種用于管理文件的數(shù)據(jù)結(jié)構(gòu),它記錄了文件在磁盤中的存儲位置、文件類型、文件長度、文件名、權(quán)限等信息,并提供了文件操作所需的各種參數(shù)和數(shù)據(jù)。FCB 可以看作是一個文件在系統(tǒng)中的“身份證”,操作系統(tǒng)通過 FCB 來管理文件的讀寫、打開、關(guān)閉等操作,使文件系統(tǒng)能夠順利地運(yùn)行。FCB 還可以被用來搜尋文件、保護(hù)文件、管理文件的空間等。

所有文件的信息都保存在目錄結(jié)構(gòu)中,而目錄結(jié)構(gòu)也保存在外存上。文件信息當(dāng)需要時再調(diào)入內(nèi)存。通常,目錄條目包括文件名稱及其唯一標(biāo)識符,而標(biāo)識符定位其他屬性的信息。

文件屬于抽象數(shù)據(jù)類型。為了恰當(dāng)?shù)亩x文件,就需要考慮有關(guān)文件的操作。操作系統(tǒng)提供系統(tǒng)調(diào)用,他對文件進(jìn)行創(chuàng)建、寫、讀、定位和截斷。

創(chuàng)建文件:創(chuàng)建文件有兩個必要步驟。儀式在文件系統(tǒng)中為文件找到空間;而是在目錄中為新文件創(chuàng)建條目。此目錄條目記錄文件名稱、在文件系統(tǒng)中的位置以及其他可能的信息。

寫文件:為了寫文件,執(zhí)行一個系統(tǒng)調(diào)用,指明文件名稱和要寫入文件的內(nèi)容。對于給定文件名稱,系統(tǒng)搜索目錄以查找文件位置。系統(tǒng)必須為該文件維護(hù)一個寫位置的指針。每當(dāng)發(fā)生寫操作,便更新寫指針。

讀文件:為了讀文件,執(zhí)行一個系統(tǒng)調(diào)用,指明文件名稱和要讀入文件塊的內(nèi)存位置。同樣,需要搜索目錄以找到相關(guān)目錄項,系統(tǒng)維護(hù)一個讀位置的指針。每當(dāng)發(fā)生讀操作時,更新讀指針。一個進(jìn)程通常只對一個文件讀或?qū)懀援?dāng)前操作位置可作為每個進(jìn)程當(dāng)前文件位置指針。由于讀和寫操作都是用同一指針,節(jié)省了空間也降低了系統(tǒng)復(fù)雜度。

刪除文件是指將文件從文件系統(tǒng)中永久刪除,即釋放文件所占用的磁盤空間并將文件名從目錄中刪除。刪除文件后,文件數(shù)據(jù)不再存在于存儲設(shè)備中,不能被恢復(fù)。而截斷文件是指將文件的長度截短,釋放超過指定長度的部分空間,但是文件名和文件的其他屬性不變。截斷文件的操作可以在文件不被刪除的情況下釋放一部分磁盤空間。

文件重定位:(文件尋址)按某條件搜索目錄,將當(dāng)前文件位置設(shè)為給定值,并且不會讀寫文件。

刪除文件:搜索到給定名稱的文件并釋放空間,找到相關(guān)目錄并予以刪除。

截斷文件:允許文件所有屬性不變,并刪除文件內(nèi)容,即將其長度設(shè)為0并釋放其空間。

這六個基本操作可以組成執(zhí)行其他文件操作。例如,一個文件的復(fù)制,可以創(chuàng)建新文件;從舊文件讀出并寫入到新文件。

因?yàn)樵S多文件操作都涉及為給定文件搜索相關(guān)目錄條目,許多系統(tǒng)要求在首次使用文件時,有系統(tǒng)調(diào)用open。操作系統(tǒng)維護(hù)一個包含所有打開文件信息的表(打開文件表,open-file table)。當(dāng)需要一個文件操作時,可通過該表的一個索引指定文件,就省略了搜索環(huán)節(jié)。當(dāng)文件不再使用時,進(jìn)程可以關(guān)閉它,操作系統(tǒng)從打開文件表中刪除這一個條目。

大部分操作系統(tǒng)要求在文件使用之前就被顯式的打開。操作open會根據(jù)文件名搜索目錄,并將目錄條目復(fù)制到打開文件表。如果調(diào)用open請求(創(chuàng)建、只讀、讀寫、添加等)得到允許,進(jìn)程就可以打開文件,而open通常返回一個指向打開文件表中的一個條目的指針。通過使用該指針(而非文件名)進(jìn)行所有IO操作,以簡化步驟并節(jié)省資源。

整個系統(tǒng)表包含進(jìn)程相關(guān)信息,如文件在磁盤的位置、訪問日期和大小。一個進(jìn)程打開一個文件,系統(tǒng)打開文件表就會為打開的文件增加一個條目,并指向整個系統(tǒng)表的相應(yīng)條目。通常,系統(tǒng)打開文件表的每個文件時,還用一個文件打開計數(shù)器(open count),記錄多少進(jìn)程打開了該文件。每個關(guān)閉操作close則使count遞減,當(dāng)打開計數(shù)器為0時,便是該文件不再被使用。系統(tǒng)將收回分配給該文件的內(nèi)存空間等資源,若文件被修改過,則將文件寫會外存,并肩系統(tǒng)打開文件表中的相應(yīng)條目刪除,最后釋放文件的文件控制塊(file control block,F(xiàn)CB)。

每個打開文件都有如下關(guān)聯(lián)信息:

· 文件指針:系統(tǒng)跟蹤上次讀寫位置作為當(dāng)前文件位置指針。這種指針對打開文件的某個進(jìn)程來說是唯一的,因此必須與磁盤文件屬性分開保存。

·?文件打開計數(shù):文件關(guān)閉時,操作系統(tǒng)必須重用其打開文件表條目,否則表內(nèi)空間會不夠用。因?yàn)槎鄠€進(jìn)程可能打開同一個文件,所以系統(tǒng)在刪除打開文件條目之前,必須等待最后一個進(jìn)程關(guān)閉文件。該計數(shù)器跟蹤打開或關(guān)閉的數(shù)量,當(dāng)計數(shù)為0時,系統(tǒng)關(guān)閉文件,刪除該條目。

·?文件磁盤位置:絕大多數(shù)文件操作都要求系統(tǒng)修改文件數(shù)據(jù),該信息在內(nèi)存中以免為每個操作都從磁盤中讀取。

·?訪問權(quán)限:每個進(jìn)程打開文件都需要有一個訪問模式(創(chuàng)建、只讀、讀寫、添加等)。該信息保存在進(jìn)程的打開文件表中以便操作系統(tǒng)能允許或拒絕之后的IO請求。

(二)、文件的邏輯結(jié)構(gòu)

文件的邏輯結(jié)構(gòu)是從用戶角度看到的文件的組織形式。文件的物理結(jié)構(gòu)是從OS角度出發(fā),又稱為文件的存儲結(jié)構(gòu),是指文件在外存上的存儲組織形式。文件的邏輯結(jié)構(gòu)與存儲介質(zhì)特征無關(guān),但文件的物理結(jié)構(gòu)與存儲介質(zhì)的特性有很大關(guān)系。

按邏輯結(jié)構(gòu),文件有無結(jié)構(gòu)文件和有結(jié)構(gòu)文件兩種類型:

無結(jié)構(gòu)文件是最簡單的文件組織形式。無結(jié)構(gòu)文件將數(shù)據(jù)按順序組織成記錄并積累保存,它是有序相關(guān)信息項的集合,以字節(jié)(byte)為單位。由于無結(jié)構(gòu)文件沒有結(jié)構(gòu),因?yàn)閷τ涗浀脑L問只能通過窮舉搜索的方式,故這種文件形式對大多數(shù)應(yīng)用不適用,但字符流的無結(jié)構(gòu)文件管理簡單,用戶可以方便地對其進(jìn)行操作。所以,那些對基本信息單位操作不多的文件比較適于采用字符流的無結(jié)構(gòu)方式,如源程序文件、目標(biāo)代碼文件等。

有結(jié)構(gòu)文件按記錄的組織形式可以分為:

1)順序文件

記錄是定長的且按關(guān)鍵字順序排列??梢皂樞虼鎯蛞枣湵硇蝿荽鎯Γ谠L問時需要順序搜索文件。順序文件有以下兩種結(jié)構(gòu):

第一種是串結(jié)構(gòu),各記錄之間的順序與關(guān)鍵字無關(guān)。通常的辦法是由時間來決定,即按存入時間的先后排列,最先存入的記錄作為第一個記錄,其次存入的為第二個記錄,以此類推。

第二種是順序結(jié)構(gòu),指文件中所有記錄按關(guān)鍵字順序排列。

在對記錄進(jìn)行批量操作時,即每次要讀或?qū)懸淮笈涗?,對順序文件的效率是所有邏輯文件中最高的;此外,也只有順序文件才能存儲在磁帶上,并能有效的工作。但順序文件對查找、修改、增加或刪除單個記錄的操作比較困難。

2)索引文件

對于可變長記錄的文件只能順序查找,系統(tǒng)開銷較大,為此可以建立一張索引表以加快檢索速度,索引表本身是順序文件。在記錄很多或是訪問要求高的文件中,需要引入索引以提供有效的訪問,實(shí)際中,通過索引可以成百上千倍的提高訪問速度。

3)索引順序表

索引順序表是順序和索引兩種組織形式的結(jié)合。索引順序文件將順序文件中所有記錄分為若干個組,為順序文件建立一張索引表,在索引表中為每組中的第一個記錄建立一個索引項,其中含有該記錄的關(guān)鍵字值和指向該記錄的指針。

索引順序文件比索引文件快的原因在于其存儲方式。索引順序文件是將索引信息和數(shù)據(jù)記錄一起按照主鍵排序存儲在磁盤上,查詢時可以直接按照主鍵二分查找,因此速度較快。而索引文件則是將索引信息和數(shù)據(jù)記錄分開存儲,查詢時需要先查找索引文件再查找數(shù)據(jù)文件,因此速度相對較慢。但是,索引順序文件需要消耗更多的存儲空間。
關(guān)鍵字指的是文件名、文件路徑或文件標(biāo)識符等唯一標(biāo)識文件的屬性

4)直接文件或散列文件(哈希文件,Hash File)

給定記錄的鍵值或通過Hash函數(shù)轉(zhuǎn)換的鍵值直接決定記錄的物理地址。這種映射結(jié)構(gòu)不同于順序文件或索引文件,沒有順序的特性。散列文件有很高的存取速度,但是會引起沖突,即不同關(guān)鍵字的散列函數(shù)值相同。

(三)、目錄結(jié)構(gòu)

與文件管理系統(tǒng)和文件集合相關(guān)聯(lián)的是文件目錄,它包含有文件的信息,包括屬性、位置和所有權(quán)等,這些信息都由操作系統(tǒng)進(jìn)行管理。首先我們來看目錄管理的基本要求 :從用戶的角度看,目錄在用戶所需要的文件名和文件之間提供一種映射,所以目錄管理要實(shí)現(xiàn)“按名存取”;目錄存取的效率直接影響到系統(tǒng)的性能,所以要提高對目錄的檢索速度;在共享系統(tǒng)中,目錄還需要提供用于控制訪問文件的信息。此外,文件允許重名也是用戶的合理和必然要求,目錄管理通過樹形結(jié)構(gòu)來解決和實(shí)現(xiàn)。

同進(jìn)程管理一樣,為實(shí)現(xiàn)目錄管理,操作系統(tǒng)中引入了文件控制塊的數(shù)據(jù)結(jié)構(gòu)。

1.文件控制塊。

文件控制塊(FCB)是用來存放控制文件需要的各種信息的數(shù)據(jù)結(jié)構(gòu),以實(shí)現(xiàn)“按名存取”。FCB的有序集合稱為文件目錄,一個FCB就是一個文件目錄項。為了創(chuàng)建一個新文件,系統(tǒng)將分配一個FCB并存放在文件目錄中,稱為目錄項。

FCB主要包含以下信息:

·?基本信息,如文件名、文件的物理位置、文件的邏輯結(jié)構(gòu)、文件的物理結(jié)構(gòu)等。

·?存取控制信息,如文件的存取權(quán)限等。

·?使用信息,如文件建立時間、修改時間等。

按名存取是一種訪問對象的方式,它是基于對象的唯一標(biāo)識符(通常是名稱)來訪問對象的。在操作系統(tǒng)中,按名存取通常用于訪問文件、目錄、網(wǎng)絡(luò)資源等。例如,用戶可以通過文件名來訪問文件,通過網(wǎng)址來訪問網(wǎng)頁等。按名存取相對于按位置存取來說,更加直觀和易于使用。

2.目錄結(jié)構(gòu)

在檢索目錄文件的過程中,只用到了文件名,僅當(dāng)找到一個目錄項(查找文件名與目錄項中文件名匹配)時,才需要從該目錄項中獨(dú)處該文件的物理地址。也就是說,在檢索目錄時,文件的其他描述信息不會用到,也不許調(diào)入內(nèi)存,因此,有的系統(tǒng)(如UNIX)采用了文件名和文件描述信息分開的方法,文件描述信息單獨(dú)形成一個稱為索引節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu),簡稱為i節(jié)點(diǎn)。在文件目錄中的每個目錄項僅由文件名和指向該文件所對應(yīng)的i節(jié)點(diǎn)的指針構(gòu)成。

一個FCB的大小時64B,盤塊大小是1KB,則在每個盤塊中可以存放16個FCB。而在UNIX系統(tǒng)中一個目錄僅占16B,其中14B是文件名,2B是i節(jié)點(diǎn)指針。在1KB的盤塊中可存放64個目錄項。這樣可是查找文件時平均啟動磁盤次數(shù)減少到原來的1/4,大大節(jié)省了系統(tǒng)開銷。

存放在磁盤上的索引節(jié)點(diǎn)成為磁盤索引節(jié)點(diǎn),UNIX中每個文件都有一個唯一的磁盤索引節(jié)點(diǎn),主要包括以下幾個方面:

文件主標(biāo)識符,擁有該文件的個人或小組的標(biāo)識符。

文件類型,包括普通文件、目錄文件或特別文件。

文件存取權(quán)限,各類用戶對該文件的存取權(quán)限。

文件物理地址,每個索引節(jié)點(diǎn)中含有13個地址項,即iaddr(0)~iaddr(12),他們以直接或間接方式給出數(shù)據(jù)文件所在盤塊的編號。

文件長度,以字節(jié)為單位。

文件鏈接計數(shù),文本文件系統(tǒng)中所有指向該文件的文件名的指針計數(shù)。

文件存取時間,本文件最近被進(jìn)程存取的時間、最近被修改的時間以索引節(jié)點(diǎn)最近被修改的時間。

文件被打開時,磁盤索引節(jié)點(diǎn)復(fù)制到內(nèi)存的索引節(jié)點(diǎn)中,以便于使用。在內(nèi)存索引節(jié)點(diǎn)中有增加了以下內(nèi)容:

索引節(jié)點(diǎn)編號,用于標(biāo)示內(nèi)存索引節(jié)點(diǎn)。

狀態(tài),指示i節(jié)點(diǎn)是否上鎖或被修改。

訪問計數(shù),每當(dāng)有一進(jìn)程要訪問此i節(jié)點(diǎn)時,計數(shù)加1,訪問結(jié)束減1.

邏輯設(shè)備號,文件所屬文件系統(tǒng)的邏輯設(shè)備號。

連接指針,設(shè)置分別指向空閑鏈表和散列隊列的指針。

在理解一個文件系統(tǒng)的需求前,我們首先來了考慮在目錄這個層次上所需要執(zhí)行的操作,這有助于后面文件系統(tǒng)的整體理解。

搜索:當(dāng)用戶使用一個文件時,需要搜索目錄,已找到該文件的對應(yīng)目錄項。

創(chuàng)建文件:當(dāng)創(chuàng)建一個新文件時,需要在目錄中增加一個目錄項。

刪除文件:當(dāng)刪除一個文件時,需要在目錄中刪除相應(yīng)的目錄項。

顯示目錄:用戶可以請求顯示目錄的內(nèi)容,如顯示該用戶目錄中的所有文件及屬性。

修改目錄:某些文件屬性保存在目錄中,因而這些屬性的變化需要改變相應(yīng)的目錄項。

1)單級目錄結(jié)構(gòu)

整個文件系統(tǒng)只建立一張目錄表,每個文件占一個目錄項。

當(dāng)訪問一個文件時,先按文件名在該目錄中查找到相應(yīng)的FCB,經(jīng)合法性檢查后執(zhí)行相應(yīng)的操作。當(dāng)建立一個新文件時,必須先檢索所有目錄項以確保沒有“重名”的現(xiàn)象,然后在該目錄中增設(shè)一項,把FCB的全部信息保存在該項中。當(dāng)刪除一個文件時,先從該目錄中找到該文件的目錄項,回收該文件所占用的存儲空間,然后再清除該目錄項。

單級目錄結(jié)構(gòu)實(shí)現(xiàn)了按名存取,但是存在查找速度慢、文件不允許重名、不便于文件共享等缺點(diǎn),而且對于多用戶的操作系統(tǒng)顯然是不適用的。

2)二級目錄結(jié)構(gòu)

單機(jī)目錄很容易造成文件名稱的混淆,可以考慮采用二級方案,將文件目錄分成主文件目錄MFD和用戶文件目錄UFD兩級。

主文件目錄項紀(jì)錄用戶名及相應(yīng)用戶文件所在的存儲位置。用戶文件目錄項記錄該用戶文件的FCB信息。當(dāng)某用戶與對其文件進(jìn)行訪問時,只需要搜索該用戶對應(yīng)的UFD,這即解決了不同用戶文件的重名問題,也在一定程度上保證了文件的安全。

兩級目錄結(jié)構(gòu)可以解決多用戶之間的文件重名問題,文件系統(tǒng)可以在目錄上實(shí)現(xiàn)訪問限制,但是兩級結(jié)構(gòu)對于用戶結(jié)構(gòu)內(nèi)部結(jié)構(gòu)沒有任何幫助。用戶如果需要在某個任務(wù)上進(jìn)行合作和訪問那其他文件時便會產(chǎn)生很多問題。

3)多級目錄結(jié)構(gòu)

也成為樹形目錄結(jié)構(gòu)。將兩級目錄結(jié)構(gòu)加以推廣,就形成了多級目錄結(jié)構(gòu),即樹形目錄結(jié)構(gòu)。

用戶要訪問某個文件時用文件的路徑名標(biāo)識文件,文件路徑名是一個字符串,由從根目錄出發(fā)到所找文件的通路上的所有目錄名與數(shù)據(jù)文件名用分隔符/連接起來而成。從根目錄出發(fā)的路徑稱為絕對路徑。當(dāng)層次較多時,每次從根目錄查詢浪費(fèi)時間,于是加入了當(dāng)前目錄,進(jìn)程對各文件的訪問都是相對于當(dāng)前目錄進(jìn)行的。當(dāng)用戶要訪問某個文件時,使用相對路徑標(biāo)識文件,相對路徑由從當(dāng)前目錄出發(fā)到所找文件通路上所有目錄名與數(shù)據(jù)文件名用分隔符/鏈接而成。

通常,每個用戶都有自己的當(dāng)前目錄,登陸后自動進(jìn)入該用戶的當(dāng)前目錄。操作系統(tǒng)提供一條專門的系統(tǒng)調(diào)用,供用戶隨時改變當(dāng)前目錄。

樹形目錄結(jié)構(gòu)可以很方便的對文件進(jìn)行分類,層次結(jié)構(gòu)清晰,也能夠更有效地進(jìn)行文件的管理和保護(hù)。但是,在屬性目錄中查找一個文件,需要按路徑名主機(jī)訪問中間節(jié)點(diǎn),這就增加了磁盤訪問次數(shù),無疑將影響查詢速度。

4)無環(huán)圖目錄結(jié)構(gòu)

樹形目錄結(jié)構(gòu)可便于實(shí)現(xiàn)文件分類,但不便于實(shí)現(xiàn)文件共享,為此在樹形目錄結(jié)構(gòu)的基礎(chǔ)上增加了一些指向同一節(jié)點(diǎn)的有向邊,使整個目錄成為一個有向無環(huán)圖。

引入無環(huán)圖目錄結(jié)構(gòu)是為了實(shí)現(xiàn)文件共享。

當(dāng)某用戶要求刪除一個共享節(jié)點(diǎn)時,若系統(tǒng)只是簡單地將它刪除,當(dāng)另一共享用戶需要訪問時,卻無法找到這個文件而發(fā)生錯誤。為此可以為每個共享節(jié)點(diǎn)設(shè)置一個共享計數(shù)器,每當(dāng)途中增加對該節(jié)點(diǎn)的共享鏈時,計數(shù)器加1;每當(dāng)某用戶提出刪除該節(jié)點(diǎn)時,計數(shù)器減1。僅當(dāng)共享計數(shù)器為0時,才真正刪除該節(jié)點(diǎn),否則僅刪除請求用戶的共享鏈。

共享文件或目錄不同于文件復(fù)制。如果有兩個復(fù)制文件,每個程序員看到的是復(fù)制文件而不是原件;但如果一個文件被修改,那么另一個程序員的復(fù)制不會有改變。對于共享文件,只存在一個真正文件,任何改變都會為其他用戶所見。

無環(huán)圖目錄結(jié)構(gòu)方便實(shí)現(xiàn)了文件的共享,但是系統(tǒng)的管理變得更加復(fù)雜。

無環(huán)圖目錄結(jié)構(gòu) (Acyclical File System,AFS) 是一種基于圖論的目錄結(jié)構(gòu),它能夠有效地實(shí)現(xiàn)文件共享和網(wǎng)絡(luò)存儲。
AFS 采用無環(huán)圖作為目錄結(jié)構(gòu),每個節(jié)點(diǎn)表示一個文件或目錄,節(jié)點(diǎn)之間用路徑表示鏈接關(guān)系。與傳統(tǒng)的目錄結(jié)構(gòu)不同,AFS 目錄樹不是有環(huán)的,也就是說,不存在一個文件或目錄可以被多次訪問的情況。這使得 AFS 能夠有效地避免文件重復(fù)存儲和網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)拈_銷,提高了文件共享的效率。
此外,AFS 還采用了一種稱為“share”的功能,允許多個用戶同時訪問同一個文件。當(dāng)一個用戶需要訪問某個文件時,他會將文件讀取到自己的內(nèi)存中,然后將其共享給其他用戶,其他用戶也可以通過共享鏈接來訪問該文件。這種共享機(jī)制使得多個用戶可以同時訪問同一個文件,而不會導(dǎo)致文件內(nèi)容的重復(fù)和沖突。
綜上所述,AFS 的無環(huán)圖目錄結(jié)構(gòu)和共享機(jī)制能夠有效地實(shí)現(xiàn)文件共享和網(wǎng)絡(luò)存儲,提高了文件訪問的效率。

3.索引節(jié)點(diǎn)

索引節(jié)點(diǎn) (Index Node) 和 FCB(File Control Block) 都是用于存儲文件信息的數(shù)據(jù)結(jié)構(gòu),但它們有一些不同之處和改進(jìn)。
首先,索引節(jié)點(diǎn)相比 FCB 更加靈活。索引節(jié)點(diǎn)可以存儲更多的文件信息,如文件大小、修改時間、權(quán)限等,同時它還可以存儲多個鏈接數(shù)、空閑空間等信息,而 FCB 只能存儲文件的大小和修改時間等信息。索引節(jié)點(diǎn)還可以支持動態(tài)分配和回收,當(dāng)文件大小發(fā)生變化時,索引節(jié)點(diǎn)可以動態(tài)地調(diào)整大小,而 FCB 則需要手動調(diào)整。
其次,索引節(jié)點(diǎn)相比 FCB 更加高效。索引節(jié)點(diǎn)可以更快地查找和訪問文件,因?yàn)樗宋募亩鄠€鏈接數(shù)和空閑空間等信息,而 FCB 則需要遍歷整個文件系統(tǒng)才能查找和訪問文件。此外,索引節(jié)點(diǎn)還可以更快地進(jìn)行文件讀寫操作,因?yàn)樗梢灾苯釉L問文件的相關(guān)數(shù)據(jù)結(jié)構(gòu),而 FCB 則需要遍歷整個文件系統(tǒng)來讀取文件。
最后,索引節(jié)點(diǎn)相比 FCB 更加安全。索引節(jié)點(diǎn)可以更好地保護(hù)文件的隱私和安全,因?yàn)樗梢源鎯Ω嗟奈募畔?,如鏈接?shù)、空閑空間等,而 FCB 則只能存儲文件的大小和修改時間等信息。此外,索引節(jié)點(diǎn)還可以支持加密和解密等操作,而 FCB 則不支持。
綜上所述,索引節(jié)點(diǎn)相比 FCB 具有更加靈活、高效、安全的特點(diǎn),可以更好地支持文件系統(tǒng)的管理和訪問。

(四)、文件的物理結(jié)構(gòu)(文件分配方式)

連續(xù)分配方式的磁盤是按照連續(xù)的物理塊存儲數(shù)據(jù)的,因此隨機(jī)訪問時需要通過文件系統(tǒng)管理器來進(jìn)行。文件系統(tǒng)管理器會維護(hù)一個文件的索引表,其中記錄了文件在磁盤上的物理地址。當(dāng)需要隨機(jī)訪問磁盤上的某個文件時,文件系統(tǒng)管理器會根據(jù)索引表找到該文件所在的物理地址,并將該地址傳遞給操作系統(tǒng)的磁盤驅(qū)動程序。磁盤驅(qū)動程序會通過尋道和旋轉(zhuǎn)等操作將磁頭移動到相應(yīng)的物理地址處,然后讀取或?qū)懭霐?shù)據(jù)。完成操作后,磁盤驅(qū)動程序會將磁頭移動到下一個需要訪問的物理地址處,以便下一次的隨機(jī)訪問。
FAT和NTFS都是文件系統(tǒng)格式,用于在計算機(jī)硬盤驅(qū)動器上組織和管理文件和文件夾。它們的主要區(qū)別如下:
FAT(File Allocation Table)是早期Windows操作系統(tǒng)使用的文件系統(tǒng)格式,而NTFS(New Technology File System)是用于更現(xiàn)代的Windows操作系統(tǒng)的文件格式。
NTFS比FAT更安全、可靠和靈活。它支持更大的文件尺寸和分區(qū)大小,并提供更多的高級功能,例如訪問控制列表(ACL)、文件壓縮、加密、磁盤配額等。
大部分最新的 Windows 操作系統(tǒng)都默認(rèn)使用NTFS作為其系統(tǒng)文件系統(tǒng),但FAT仍然被廣泛應(yīng)用于一些較小的嵌入式設(shè)備或移動存儲設(shè)備中,如閃存卡或USB閃存驅(qū)動器。
總之,NTFS具有更出色的性能和功能,因此更適合用于大型企業(yè)級應(yīng)用和數(shù)據(jù)存儲。而FAT雖然簡單,但限制較多,適用于某些特定場景。
順序分配(Sequential Allocation)索引分配(Indexed Allocation)支持隨機(jī)訪問。順序分配通過使用連續(xù)的數(shù)據(jù)塊來存儲文件,可以通過計算偏移量來隨機(jī)訪問文件中的任意位置。索引分配則通過將每個文件與一個索引塊相關(guān)聯(lián),該索引塊包含指向所有數(shù)據(jù)塊的指針,從而允許以隨機(jī)方式訪問文件的任何部分。顯式鏈接的每個節(jié)點(diǎn)都包含指向下一個節(jié)點(diǎn)的指針。由于每個節(jié)點(diǎn)都有自己的地址和指向下一個節(jié)點(diǎn)的指針,因此可以通過跳轉(zhuǎn)到特定節(jié)點(diǎn)的內(nèi)存地址來實(shí)現(xiàn)隨機(jī)訪問。

(五)、文件存儲空間管理

位示圖(BitMap法是一種常用的文件分配算法,通常用于磁盤上的文件系統(tǒng)中。它使用一個位圖來記錄某些空間塊(例如磁盤扇區(qū)或塊)的使用情況。
具體來說,位圖是由多個二進(jìn)制位組成的數(shù)組,每個二進(jìn)制位代表對應(yīng)的空間塊的狀態(tài),例如“1”表示已經(jīng)被占用,“0”表示未被占用。當(dāng)需要分配一個新的空間塊時,可以在位圖中尋找第一個為“0”的二進(jìn)制位,并將其置為“1”,然后把空間塊與該位對應(yīng)起來,表示該空間塊已經(jīng)被分配。
位示圖法優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,查找迅速,因?yàn)橹恍枰谖粓D中順序查找即可;缺點(diǎn)是當(dāng)文件系統(tǒng)容量較大時位圖所需的存儲空間也很大,而且可能會出現(xiàn)位圖本身需要分配獨(dú)立的空間塊的情況,導(dǎo)致空間浪費(fèi)。
超級塊(superblock)是文件系統(tǒng)中的一個結(jié)構(gòu),通常用于組織和管理文件系統(tǒng)上的塊或扇區(qū)。它包含有關(guān)文件系統(tǒng)整體的信息,例如塊大小、塊數(shù)量、inode表的位置以及文件系統(tǒng)的掛載選項。
超級塊通常位于文件系統(tǒng)的起始位置,由文件系統(tǒng)的創(chuàng)建程序在格式化文件系統(tǒng)時生成。訪問超級塊可以提供有關(guān)文件系統(tǒng)結(jié)構(gòu)和狀態(tài)的重要信息,因此它通常被操作系統(tǒng)內(nèi)核和工具程序用于識別和檢查文件系統(tǒng)。
例如,如果文件系統(tǒng)損壞或出現(xiàn)錯誤,操作系統(tǒng)可以使用超級塊中記錄的信息來嘗試恢復(fù)文件系統(tǒng)。另外,如果用戶需要對文件系統(tǒng)進(jìn)行調(diào)整或備份,超級塊也可以提供必要的信息和參數(shù)。

(六)、文件的基本操作

目錄項(Directory entry)是文件系統(tǒng)中用于描述文件或目錄的數(shù)據(jù)結(jié)構(gòu)。每個文件或目錄在文件系統(tǒng)中都有一個唯一的目錄項,包含了該文件或目錄的屬性信息和所在的磁盤位置等。
通常情況下,目錄項包括以下信息:
文件名:指定了文件的名稱,可以包括一個或多個字符,用于標(biāo)識該文件。
文件標(biāo)識符:為了方便查找和管理文件,系統(tǒng)會為每個文件分配一個唯一的標(biāo)識符,也稱為索引節(jié)點(diǎn)號(inode)。
文件類型:指定了該文件是普通文件、目錄、鏈接文件還是設(shè)備文件等類型。
文件大?。褐付ㄎ募加玫拇鎯臻g大小。
創(chuàng)建時間和修改時間:指定了文件的創(chuàng)建時間和最近一次修改時間。
文件權(quán)限:規(guī)定了用戶和程序?qū)υ撐募脑L問權(quán)限和操作限制等。
文件系統(tǒng)中的目錄項一般以樹形結(jié)構(gòu)組織在一起,稱為目錄樹。每個目錄項都有一個父目錄和一個或多個子目錄或文件。通過遍歷目錄樹,操作系統(tǒng)可以實(shí)現(xiàn)文件的查找、添加、刪除、移動、重命名等操作。

打開文件表(Open File Table)是操作系統(tǒng)中用于管理文件和進(jìn)程之間的聯(lián)系的數(shù)據(jù)結(jié)構(gòu)。每個打開的文件都有一個對應(yīng)的打開文件表,操作系統(tǒng)會維護(hù)打開文件表來追蹤該文件的使用情況、訪問權(quán)限以及與它相關(guān)的其他進(jìn)程等信息。
具體來說,打開文件表包含了以下信息:
文件指針(File pointer):記錄了當(dāng)前讀寫位置和讀寫方式等信息。
訪問控制信息:存儲文件的訪問權(quán)限和打開方式等信息。
進(jìn)程列表:記錄了當(dāng)前正在使用該文件或者與該文件相關(guān)聯(lián)的所有進(jìn)程的進(jìn)程號。
其他元數(shù)據(jù):如文件狀態(tài)標(biāo)志、I/O緩沖區(qū)等信息。
打開文件表的作用在于:
管理文件:操作系統(tǒng)通過打開文件表來管理打開的文件,了解哪些進(jìn)程正在訪問這些文件,以保障文件安全性和一致性。
提供接口:操作系統(tǒng)可以提供文件系統(tǒng)調(diào)用接口,例如讀寫文件、關(guān)閉文件等,通過打開文件表來實(shí)現(xiàn)對文件的處理。
優(yōu)化I/O性能:打開文件表可以為不同的進(jìn)程提供統(tǒng)一的I/O緩存區(qū),各個進(jìn)程之間可以共享緩存區(qū),從而提高文件系統(tǒng)的效率。

(七)、文件共享

文件共享是多個用戶進(jìn)程共享同一份文件,系統(tǒng)中只需保留該文件的一份副本。如果系統(tǒng)不能提供共享功能,那么每個需要該文件的用戶都要有各自的副本,會造成對存儲空間的極大浪費(fèi)。

隨著計算機(jī)技術(shù)的發(fā)展,文件共享的范圍已由單機(jī)系統(tǒng)發(fā)展到多機(jī)系統(tǒng),進(jìn)而通過網(wǎng)絡(luò)擴(kuò)展到全球。這些文件的分享是通過分布式文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)、分布式信息系統(tǒng)實(shí)現(xiàn)的。這些系統(tǒng)允許多個客戶通過c/s模型共享網(wǎng)絡(luò)中的服務(wù)器文件。

現(xiàn)代常用的兩種文件共享方法有:

在樹形結(jié)構(gòu)的目錄中,當(dāng)有兩個或多個用戶要共享一個子目錄或文件時,必須將共享文件或子目錄連接到兩個或多個用戶的目錄中,才能方便的找到該文件。

在這種共享方式中引用索引節(jié)點(diǎn),即諸如文件的物理地址及其他的文件屬性等信息,不再放在目錄項中,而是放在索引節(jié)點(diǎn)中。在文件目錄中只設(shè)置文件名及指向相應(yīng)索引節(jié)點(diǎn)的指針。在索引節(jié)點(diǎn)中還應(yīng)有一個連接計數(shù)count,用于表示連接到本索引節(jié)點(diǎn)上的用戶目錄項的數(shù)目。當(dāng)count=2時,表示有兩個用戶目錄項連接到本文件上,或者說是有兩個用戶共享此文件。

當(dāng)用戶A創(chuàng)建一個新文件時,他便是該文件的所有者,此時將count置1.當(dāng)有用戶B要共享此文件時,在用戶B的目錄中增加一個目錄項,并設(shè)置一個指針指向該文件的索引節(jié)點(diǎn),此時文件主仍然是用戶A,count=2.如果用戶A不再需要此文件,不能將其直接刪除。因?yàn)椋魟h除了該文件,也必然刪除了該文件的索引節(jié)點(diǎn),這樣便會使用戶B的指針懸空,而用戶B則可能正在此文件上執(zhí)行寫操作,此時將因此半途而廢。因而用戶A不能拿刪除此文件,只是將該文件count減1,然后刪除自己目錄中的相應(yīng)目錄項。用戶B仍可以使用該文件。當(dāng)count=0時,表示沒有用戶使用該文件,系統(tǒng)將負(fù)責(zé)刪除該文件。

為使用戶B能共享用戶A的一個文件F,可以有系統(tǒng)創(chuàng)建一個link類型的新文件,也取名為F,并將文件F寫入B的目錄中,以實(shí)現(xiàn)用戶B的目錄與文件F的連接。在新文件中只包含被連接文件F的路徑名。這樣的連接方法被稱為符號鏈接。

新文件中的路徑名則被看作是符號鏈。當(dāng)用戶B要訪問被鏈接的文件F且正要讀LINK類新文件時,操作系統(tǒng)根據(jù)新文件中的路徑名去讀該文件,從而實(shí)現(xiàn)了用戶B對文件F的共享。

在利用符號鏈方式實(shí)現(xiàn)文件共享時,只有文件的擁有者才擁有指向其索引節(jié)點(diǎn)的指針。而共享該文件的其他用戶則只有該文件的路徑名,并不擁有指向其索引節(jié)點(diǎn)的指針。這樣,也就不會發(fā)生在文件刪除一個共享文件后留下一個懸空指針的情況。當(dāng)文件的擁有者把一個共享文件刪除后,其他用戶通過符號鏈去訪問它時,會出現(xiàn)訪問失敗,于是再將符號鏈刪除,此時不會產(chǎn)生任何影響。此處我們要注意一個問題:當(dāng)一個文件刪除,而在使用其符號鏈接之前,另一個具有同樣名稱的文件被創(chuàng)建了。

在符號鏈的共享方式中,當(dāng)其他用戶讀共享文件時,需要根據(jù)文件路徑名逐個查找目錄,直至找到該文件的索引節(jié)點(diǎn)。因此,每次訪問時,都可能要多次的讀盤,使得訪問文件的開銷變大并增加了啟動磁盤的頻率。此外,符號鏈的索引結(jié)點(diǎn)也要耗費(fèi)一定的磁盤空間。符號鏈方式有一個很大的優(yōu)點(diǎn),即網(wǎng)絡(luò)共享只需提供該文件所在機(jī)器的網(wǎng)絡(luò)地址以及該機(jī)器中的文件路徑即可。

上述兩種連接方式都存在一個共同的問題,即每個共享文件都有幾個文件名。換言之,每增加一條鏈接,就增加一個文件名。這實(shí)質(zhì)上就是每個用戶都是用自己的路徑名去訪問共享文件。當(dāng)我們試圖去遍歷整個文件系統(tǒng)時,將會多次遍歷到該共享文件。

硬鏈接指的是在文件系統(tǒng)中創(chuàng)建一個新的文件,其文件名和目標(biāo)文件相同,在磁盤上占據(jù)相同的空間,且原文件和硬鏈接文件之間互為別名,即它們共享相同的 inode 號碼。刪除其中一個文件并不會影響另一個文件的存在。
軟鏈接(也稱為符號鏈接)則是在文件系統(tǒng)中創(chuàng)建一個特殊類型的文件,其內(nèi)容是指向目標(biāo)文件的路徑,在磁盤上只占用很小的空間。刪除原始文件可能會導(dǎo)致軟鏈接失效,因?yàn)樗皇侵赶蛟募囊粋€引用。

硬鏈接和軟鏈接都是文件系統(tǒng)中的靜態(tài)共享方法,在文件系統(tǒng)中還存在著另外的共享需求,及兩個進(jìn)程同時對同一個文件進(jìn)行操作。這樣的共享可以稱為動態(tài)共享。

(八)、文件保護(hù)

為了防止文件共享可能會導(dǎo)致文件被破壞或未經(jīng)核準(zhǔn)的用戶修改文件,文件系統(tǒng)必須控制用戶對文件的存取,即解決對文件的讀、寫、執(zhí)行的許可問題。為此,必須在文件系統(tǒng)中建立相應(yīng)的文件保護(hù)機(jī)制。

文件保護(hù)通過口令保護(hù)、加密保護(hù)和訪問控制等方式實(shí)現(xiàn)。其中,口令保護(hù)和加密保護(hù)是為了方式用戶文件被他人存取或盜取,而訪問控制則用于控制用戶對文件的訪問方式。

口令指用戶在建立一個文件時提供一個口令,系統(tǒng)為其建立FCB時附上相應(yīng)的口令,同時告訴允許共享該文件的其他用戶。用戶請求訪問時必須提供相應(yīng)的口令。這種方法時間和空間的開銷不多,缺點(diǎn)是口令直接存在系統(tǒng)內(nèi)部,不夠安全。

密碼紙用戶對文件進(jìn)行加密,文件被訪問時需要使用密鑰。這種方法保密性強(qiáng),節(jié)省了存儲空間,不過編碼和譯碼要花費(fèi)一定時間。

口令和密碼都是仿制用戶文件被他人存取或盜取,并沒有控制用戶對文件的訪問類型。

保護(hù)可以從限制對文件的訪問類型中出發(fā)??杉右钥刂频脑L問類型主要有以下幾種:

讀:從文件中讀。

寫:向文件中寫。

執(zhí)行:將文件裝入內(nèi)存并執(zhí)行。

添加:將信息添加到文件結(jié)尾部分。

刪除:刪除文件,釋放空間。

列表清單:列出文件名和文件屬性。

此外還可以對文件的重命名、復(fù)制、編輯等加以控制。這些該層的功能可以通過系統(tǒng)程序調(diào)用低層系統(tǒng)調(diào)用來實(shí)現(xiàn)。保護(hù)殼一直在底層提供。例如,復(fù)制文件可利用一系列的請求來完成。這樣,具有讀訪問用戶同時也具有復(fù)制和打印的權(quán)限了。

解決訪問控制最常用的方法是根據(jù)用戶身份進(jìn)行控制。而實(shí)現(xiàn)基于身份訪問的最為普通的方法是為每個文件和目錄增加一個訪問控制列表(Access-Control List,ACL),以規(guī)定每個用戶名及其所允許訪問的類型。

這種方法的優(yōu)點(diǎn)是可以使用復(fù)雜的訪問方法。其缺點(diǎn)是長度無法預(yù)期并且可能導(dǎo)致復(fù)雜的空間管理,使用精簡的訪問列表可以解決這個問題。

精簡的訪問列表采用擁有者、組合其他三種用戶類型。

1)擁有者:創(chuàng)建文件的用戶。

2)組:一組需要共享文件且具有類似訪問的用戶。

3)其他:系統(tǒng)內(nèi)的所有其他用戶。

這樣只需用三個域列出訪問表中這三類用戶的訪問權(quán)限即可。文件擁有者在創(chuàng)建文件時,說明創(chuàng)建者用戶名及所在的組名,系統(tǒng)在創(chuàng)建文件時也將文件主的名字、所屬組名列在該文件的FCB中。用戶訪問該文件時,按照擁有著所擁有的權(quán)限訪問。UNIX操作系統(tǒng)即采用此種方法。

注意兩個問題:

1)現(xiàn)代操作系統(tǒng)常用的文件保護(hù)方法,是將訪問控制列表與用戶、組和其他成員訪問控制方案一起組合使用。

2)對于多級目錄結(jié)構(gòu)而言,不僅需要保護(hù)單個文件,而且還需要保護(hù)子目錄內(nèi)的文件,即需要提供目錄保護(hù)機(jī)制。目錄操作與文件操作并不相同,因此需要不同的保護(hù)機(jī)制。

二、文件系統(tǒng)實(shí)現(xiàn)

(一)、文件系統(tǒng)層次結(jié)構(gòu)

現(xiàn)代操作系統(tǒng)有多種文件系統(tǒng)類型,因此文件系統(tǒng)的層次結(jié)構(gòu)也不盡相同。

文件系統(tǒng)為用戶提供與文件及目錄有關(guān)的調(diào)用,如新建、打開、讀寫、關(guān)閉、刪除文件,建立、刪除目錄等。此層由若干程序模塊組成,每一模塊對應(yīng)一條系統(tǒng)調(diào)用,用戶發(fā)出系統(tǒng)調(diào)用時,控制即轉(zhuǎn)入相應(yīng)的模塊。

文件目錄系統(tǒng)的主要功能是管理文件目錄,其任務(wù)有管理活躍文件目錄表、管理讀寫狀態(tài)信息表、管理用戶進(jìn)程的打開文件表、管理與組織在存儲設(shè)備上的文件目錄結(jié)構(gòu)、調(diào)用下一級存取控制模塊。

實(shí)現(xiàn)文件保護(hù)主要由該級軟件完成,它把用戶的訪問要求與FCB中指示的訪問控制權(quán)限進(jìn)行比較,以確認(rèn)訪問的合法性。

邏輯文件系統(tǒng)與文件信息緩沖區(qū)的主要功能是根據(jù)文件的邏輯結(jié)構(gòu)將用戶要讀寫的邏輯記錄轉(zhuǎn)換成文件的邏輯結(jié)構(gòu)內(nèi)的相應(yīng)塊號。

物理文件系統(tǒng)的主要功能是把邏輯記錄所在的相對塊號轉(zhuǎn)換成實(shí)際的物理地址。

分配模塊的主要功能是管理輔存空間,即2負(fù)責(zé)分配輔存空閑空間和回收輔存空間。

設(shè)備管理程序模塊的主要功能是分配設(shè)備、分配設(shè)備讀寫緩沖區(qū)、磁盤調(diào)度、啟動設(shè)備、處理設(shè)備中斷、釋放設(shè)備讀寫緩沖區(qū)、釋放設(shè)備等。

1.目錄實(shí)現(xiàn)

在讀文件前,必須先打開文件。打開文件時,操作系統(tǒng)利用路徑名找到相應(yīng)目錄項,目錄項中提供了查找文件磁盤塊所需要的信息,目錄實(shí)現(xiàn)的基本方法有線性列表和哈希表兩種方法。

最簡單的目錄實(shí)現(xiàn)方法是使用存儲文件名和數(shù)據(jù)塊指針的線性表。創(chuàng)建新文件時,必須首先搜索目錄表以確定沒有同名的文件存在,然后在目錄表后增加一個目錄項。刪除文件則根據(jù)給定的文件名搜索目錄表,接著釋放分配給它的空間。若要重用目錄項,有許多方法:可以將目錄項標(biāo)記為不再使用,或者將它加到空閑目錄項表上,還可以將目錄表中最后一個目錄項復(fù)制到空閑位置,不過由于線性表的特殊性,運(yùn)行比較費(fèi)時。

哈希表根據(jù)文件名得到一個值,并返回一個指向線性列表中元素的指針。這種方法的優(yōu)點(diǎn)是查找非常迅速,插入和刪除也較簡單,不過需要一些預(yù)備措施來避免沖突。最大的困難是哈希表長度固定以及哈希函數(shù)對表長的依賴性。

目錄查詢必須通過在磁盤上反復(fù)搜索完成,需要不斷的進(jìn)行IO操作,開銷較大。所以如前面所述,為了減少IO操作,把當(dāng)前使用的文件目錄復(fù)制到內(nèi)存,以后要使用該文件時只要在內(nèi)存中操作,從而降低了磁盤操作次數(shù)。

2.文件實(shí)現(xiàn)

文件分配對應(yīng)于文件的物理結(jié)構(gòu),是指如何為文件分配磁盤塊。常用的磁盤空間分配方式有三種:連續(xù)分配、鏈接分配和索引分配。有的系統(tǒng)對三種方式都支持,但是更普遍的是一個系統(tǒng)只提供一種方法支持。

1)連續(xù)分配

連續(xù)分配方法要求每個文件在磁盤上占有一組連續(xù)的塊。磁盤地址定義了磁盤上的一個線性排序。這種排序使作業(yè)訪問磁盤時需要的尋道數(shù)和尋道時間最小。

文件的連續(xù)分配可以用第一塊的磁盤地址和連續(xù)塊的數(shù)量來定義。如果文件有n塊長并從位置b開始,那么該文件將占有b,b+1,b+2……b+n-1.一個文件的目錄條目包括開始塊的地址和該文件所分配區(qū)域的長度。

連續(xù)分配支持順序訪問和直接訪問。其優(yōu)點(diǎn)是實(shí)現(xiàn)簡單、存取速度快。缺點(diǎn)在于,文件長度不宜動態(tài)增加,因?yàn)橐粋€文件末尾后的盤塊可能已經(jīng)分配給其他文件,一旦需要增加,就需要大量移動盤塊。此外,反復(fù)增刪文件后會產(chǎn)生外部碎片(與內(nèi)存管理分配方式中的碎片相似),并且很難確定一個文件需要的空間大小,因而只適用于長度固定的文件。

2)鏈接分配

鏈接分配解決了連續(xù)分配的碎片和文件大小問題。采用鏈接分配,每個文件對應(yīng)一個磁盤塊的鏈表;磁盤塊分布在磁盤的任何地方,除最后一個盤塊外,每個盤塊都有指向下一個盤塊的指針,這些指針對用戶是透明的。目錄包括文件第一塊的指針和最后一塊的指針。

創(chuàng)建新文件時,目錄中增加一個新條目。鏈接分配中每個目錄項都有一個指向文件首塊的指針。該指針初始化為nil以表示空文件,大小字段為0.寫文件會通過空閑空間管理系統(tǒng)找到空閑塊,將該塊鏈接到文件的尾部,以便于寫入。讀文件則通過塊到塊的指針讀塊。

鏈接分配方式?jīng)]有外部碎片,空閑空間列表上的任何塊都可以用來滿足請求。創(chuàng)建文件時并不需要說明文件大小。只要有空閑塊文件就可以增大,也無需合并磁盤空間。

鏈接分配的缺點(diǎn)在于無法直接訪問盤塊,只能通過指針順序訪問文件,以及盤塊指針消耗了一定的存儲空間。鏈接分配方式的穩(wěn)定性也是一個問題。

系統(tǒng)在運(yùn)行過程中由于軟件或者硬件錯誤導(dǎo)致鏈表中的指針丟失或損壞,會導(dǎo)致文件數(shù)據(jù)的丟失。

3)索引分配

連接分配解決了連續(xù)分配的外部碎片和文件大小管理的問題。但是,鏈接分配不能有效支持直接訪問(FAT除外)。索引分配解決了這個問題,他把每個文件的所有的盤塊號都集中在一起構(gòu)成索引塊。

每個文件都有其索引塊,這是一個磁盤塊地址的數(shù)組。索引塊的第i個條目指向文件的第i個塊。目錄條目包括索引塊的地址。要讀第i塊,通過索引塊的第i個條目的指針來查找和讀入所需的塊。

創(chuàng)建文件時,索引塊的所有指針都設(shè)為空。當(dāng)首次寫入第i塊時,先從空閑空間中取得一個塊,再將其地址寫到索引塊的第i個條目。索引分配支持直接訪問,且沒有外部碎片問題。其缺點(diǎn)是由于索引塊的分配,增加了系統(tǒng)存儲空間的開銷。索引塊的大小是一個重要的問題,每個文件必須有一個索引塊,因此索引塊應(yīng)盡可能小,但索引塊太小就無法支持大文件。可以采用以下機(jī)制來處理這個問題。

鏈接方案:一個索引塊通常為一個磁盤塊,因此,它本身能直接讀寫。為了處理大文件,可以將多個索引塊鏈接起來。

多層索引:多層索引使第一層索引塊指向第二層的索引塊,第二層的索引塊再指向文件塊。這種方法根據(jù)最大文件的大小的要求,可以繼續(xù)到第三層或第四層。例如,4096B的塊,能在索引塊中存入1024個4B的指針。兩層索引允許1048576個數(shù)據(jù)塊,即允許最大文件為4G。

混合索引:將多種索引分配方式相結(jié)合的分配方式。例如,系統(tǒng)即采用直接地址,又采用單級索引分配方式或兩級索引分配方式。

此外,訪問文件需要兩次訪問外存——想要讀取索引塊的內(nèi)容,然后再訪問具體的磁盤塊,因而降低了文件的存取速度。為了解決這一問題,通常將文件的索引塊讀入內(nèi)存的緩沖區(qū),以加快文件的訪問速度。

1)文件存儲管理空間的劃分與初始化

一般來說,一個文件存儲在一個文件卷中。文件卷可以是物理盤的一部分,也可以是整個物理盤,支持超大型文件的文件卷也可以是有多個物理盤組成。

在一個文件卷中,文件數(shù)據(jù)信息的空間(文件區(qū))和存放文件控制信息FCB的空間(目錄區(qū))是分離的。由于存在很多種類的文件表示和存放格式,所以現(xiàn)代操作系統(tǒng)中一般都有很多不同的文件管理模塊,通過他們可以訪問不同格式的邏輯卷中的文件。邏輯卷在提供文件服務(wù)前,必須由對應(yīng)的文件程序進(jìn)行初始化,劃分好目錄區(qū)和文件區(qū),建立空閑空間管理表格及存放邏輯卷信息的超級塊。

2)文件存儲器空間管理

文件存儲設(shè)備分成許多大小相同的物理塊,并以塊為單位交換信息,因此,文件存儲設(shè)備的管理實(shí)質(zhì)上是對空閑塊的組織和管理,它包括空閑塊的組織,分配與回收等問題。

空閑表法

空閑表法屬于連續(xù)分配方式,它與內(nèi)存的動態(tài)分配方式類似,為每個文件分配一塊連續(xù)的存儲空間。系統(tǒng)為外存上的所有空閑區(qū)建立一張空閑盤塊表,每個空閑區(qū)對應(yīng)一個空閑表項,其中包括表項序號、該空閑區(qū)第一個盤塊號、該區(qū)的空閑盤塊數(shù)等信息。再將所有空閑區(qū)按其起始盤塊號遞增的次序排列。

空閑盤區(qū)的分配與內(nèi)存的動態(tài)分配類似,同樣是采用首次適應(yīng)算法、循環(huán)首次適應(yīng)算法等。例如,在系統(tǒng)為某新創(chuàng)建的文件分配空閑盤塊時,先順序的檢索空閑盤塊表的各表項,直至找到第一個其大小能滿足要求的空閑區(qū),再將該盤區(qū)分配給用戶(進(jìn)程),同時修改空閑盤塊表。

系統(tǒng)在對用戶所釋放的存儲空間進(jìn)行回收時,也采取類似于內(nèi)存回收的方法,即要考慮回收區(qū)是否與空閑表中插入點(diǎn)的前區(qū)和后區(qū)相鄰接,對相鄰接者應(yīng)予以合并。

空閑鏈表法

將所有空閑盤區(qū)拉成一條空閑鏈,根據(jù)構(gòu)成連所有的基本元素不同,可以把鏈表分成兩種形式:空閑盤塊鏈和空閑盤區(qū)鏈。

空閑盤塊鏈?zhǔn)菍⒋疟P上所有空閑空間,以盤塊為單位拉成一條鏈。當(dāng)用戶因創(chuàng)建文件而請求分配存儲空間時,系統(tǒng)從鏈?zhǔn)组_始,一次摘下適當(dāng)數(shù)目的空閑盤塊分配給用戶。當(dāng)用戶因刪除文件而釋放存儲空間時,系統(tǒng)將回收的盤塊一次拆入空閑盤塊鏈的末尾。這種方法的優(yōu)點(diǎn)是分配和回收一個盤塊很簡單,但在為一個文件分配盤塊時,可能要重復(fù)多次操作。

空閑盤區(qū)鏈?zhǔn)菍⒋疟P上所有空閑盤區(qū)(每個盤區(qū)可包含若干個盤塊)拉成一條鏈。在每個盤區(qū)上除含有用于指示下一個空閑盤區(qū)的指針外,還應(yīng)有能指明本盤區(qū)大小(盤塊數(shù))的信息。分配盤區(qū)的方法與內(nèi)存的動態(tài)分區(qū)分配類似,通常采用首次適應(yīng)算法。在回收盤區(qū)時,同樣也要將回收區(qū)域相鄰接的空閑盤區(qū)相合并。

位視圖法

位視圖是利用二進(jìn)制的以為來表示磁盤中的一個盤塊的使用情況,磁盤上所有的盤塊都有一個二進(jìn)制位與之對應(yīng),當(dāng)其直為0時,表示對應(yīng)的盤塊空閑;當(dāng)其值為1時,表示對應(yīng)的盤塊已分配。

盤塊的分配

1順序掃描位視圖,從中找出一個或一組其值為0的二進(jìn)制位。

2將所找到的一個或一組二進(jìn)制位,轉(zhuǎn)換成與之對應(yīng)的盤塊號。假定找到的其值為0的二進(jìn)制位,位于位視圖的第i行,第j列,則其相應(yīng)的盤塊號硬干下式計算:b=n(i-1)+j

3修改位視圖,令mapmap[i,?j]=1

盤塊的回收

1將回收盤塊的盤塊號轉(zhuǎn)換成位視圖中的行號和列號

2修改位視圖,令map[i, j]=0

成組鏈接法

空閑表法和空閑鏈表法都不適用于大型文件系統(tǒng),因?yàn)檫@會使空閑表或空閑鏈表太大。在UNIX系統(tǒng)中采用的是成組鏈接法,這種方法結(jié)合了空閑表和空閑鏈表法兩種方法,克服了表太大的缺點(diǎn)。其大致思想是:把順序的n個空閑扇區(qū)地址保存在第一個空閑扇區(qū)內(nèi),其后一個空閑扇區(qū)則保存另一順序空閑扇區(qū)的地址,如此繼續(xù)直至所有空閑扇區(qū)均予以鏈接。系統(tǒng)只需要保存一個指向第一個空閑扇區(qū)的指針。

表示文件存儲器空閑空間的位向量表或第一個成組鏈塊以及卷中的目錄區(qū)、文件區(qū)劃分都需要存放在輔存儲器-中的,一般放在卷頭位置,在UNIX系統(tǒng)中成為超級塊。在對卷中文件進(jìn)行操作前,超級塊需要預(yù)先讀入系統(tǒng)空間的主存,并且經(jīng)常保持主存超級塊與輔存卷中超級塊的一致性。

(二)、文件系統(tǒng)全局結(jié)構(gòu)

(三)、虛擬文件系統(tǒng)

三、磁盤組織與管理

(一)、磁盤的結(jié)構(gòu)

磁盤是由表面涂有磁性物質(zhì)的金屬或塑料構(gòu)成的圓形盤片,通過一個稱謂磁頭的到體系安全從磁盤中存取數(shù)據(jù)。在讀寫操作期間,磁頭固定,磁盤在下面高速旋轉(zhuǎn)。磁盤的表面上數(shù)據(jù)存儲在一組同心圓中,稱為磁道。每個磁道與磁頭一樣快,一個盤面上有上千個磁道。磁道有劃分為幾百個扇區(qū),每個扇區(qū)固定存儲大小(通常為512B),一個扇區(qū)稱為一個盤塊。磁盤的存儲能力受限于最內(nèi)道的最大記錄密度。

磁盤地址用“柱面號-盤面號-扇區(qū)號(或塊號)”來表示。

  • 盤面(Platter):一個磁盤有多個盤面;

  • 磁道(Track):盤面上的圓形帶狀區(qū)域,一個盤面可以有多個磁道;

  • 扇區(qū)(Track Sector):磁道上的一個弧段,一個磁道可以有多個扇區(qū),它是最小的物理儲存單位,目前主要有 512 bytes 與 4 K 兩種大??;

  • 磁頭(Head):與盤面非常接近,能夠?qū)⒈P面上的磁場轉(zhuǎn)換為電信號(讀),或者將電信號轉(zhuǎn)換為盤面的磁場(寫);

  • 制動手臂(Actuator arm):用于在磁道之間移動磁頭;

  • 主軸(Spindle):使整個盤面轉(zhuǎn)動。

(二)、磁盤調(diào)度算法

目前常用的磁盤調(diào)度算法有以下幾種:

1)先來先服務(wù)(FCFS, First Come First Served)算法

FCFS算法根據(jù)進(jìn)程請求訪問磁盤的先后順序進(jìn)行調(diào)度處理,這是一種最簡單的調(diào)度算法。這種算法的優(yōu)點(diǎn)是具有公平性。如果只有少量進(jìn)程需要訪問,且大部分請求都是訪問簇聚的文件扇區(qū),則會達(dá)到較好的性能;但如果有大量進(jìn)程競爭使用磁盤,那么這種算法在性能上往往低于隨機(jī)調(diào)度。所以,實(shí)際磁盤調(diào)度中考慮一些更為復(fù)雜的調(diào)度算法。

2)最短尋找時間優(yōu)先(SSTF, Shortest Seek Time First)算法

SSTF選擇調(diào)度處理的磁道是與當(dāng)前磁頭所在磁道距離最近的磁道,一是每次的尋找時間最短。當(dāng)然,總是選擇最小尋找時間并不能保證平均尋找時間最小,但是能提供比FCFS算法更好的性能。這種算法會產(chǎn)生饑餓現(xiàn)象。

3)掃描(SCAN)算法又稱為電梯算法

SCAN算法在磁頭當(dāng)前移動方向上選擇與當(dāng)前磁頭所在磁道距離最近的請求作為下一次服務(wù)的對象。由于磁頭移動規(guī)律與電梯運(yùn)行相似,故又稱為電梯調(diào)度算法。SCAN算法對最掃描過的區(qū)域不公平,因此,它在訪問局部性方面不如FCFS算法和SSTF算法好。

4)循環(huán)掃描(C-SCAN)算法

在掃面算法的基礎(chǔ)上規(guī)定磁頭單向移動來提供服務(wù),回返時直接快速移動至起始端而不服務(wù)任何請求。由于SCAN算法偏向于處理那些接近最里或最外的磁道的訪問請求,所以使用改進(jìn)型的C-SCAN算法來避免這個問題。

采用scan算法和c-scan算法時磁頭總是嚴(yán)格地遵循從盤面的一端到另一端,顯然在實(shí)際使用時還可以改進(jìn),即磁頭移動只需要到達(dá)最遠(yuǎn)端的一個請求即可返回,不需要到達(dá)磁盤端點(diǎn)這種形式的SCAN算法和C-SCAN算稱為LOOK和C-LOOK調(diào)度。這是因?yàn)樗鼈冊诔粋€給定方向移動前會查看是否有請求。

對比以上幾種磁盤調(diào)度算法,F(xiàn)CFS算法太簡單,性能較差,僅在請求隊列長度接近于1時才較為理想;SSTF算法較為通用和自然;SCAN算法和C-SCAN算法在磁盤負(fù)載較大時比較占優(yōu)勢。

除了減少尋找時間外,減少延遲時間也是提高磁盤傳輸效率的重要因素??梢詫ΡP面扇區(qū)進(jìn)行交替編號,對磁盤片組中的不同盤面錯位命名。

磁盤時連續(xù)自轉(zhuǎn)設(shè)備,磁盤機(jī)讀寫一個物理塊后,需要經(jīng)過短暫的處理時間才能開始讀寫下一個塊。假設(shè)邏輯記錄數(shù)據(jù)連續(xù)存放在磁盤空間中,若在盤面上按扇區(qū)交替編號連續(xù)存放,則連續(xù)讀寫多個記錄時能夠減少磁頭的延遲時間;同柱面不同扇面的扇區(qū)若能錯位編號,連續(xù)讀寫相鄰兩個盤面的邏輯記錄時也能減少磁頭延遲時間。

(三)、減少磁盤延遲時間的方法

(四)、磁盤的管理

(1)磁盤初始塊

一個新的磁盤只是一個含有磁性記錄材料的空白盤。在磁盤能存儲數(shù)據(jù)之前,它必須分成扇區(qū)以便磁盤控制器能進(jìn)行讀和寫的操作,這個過程稱為低級格式化(物理分區(qū))。低級格式化為磁盤的每個扇區(qū)采用特別的數(shù)據(jù)結(jié)構(gòu)。每個扇區(qū)的數(shù)據(jù)結(jié)構(gòu)通常由頭、數(shù)據(jù)區(qū)域(通常為512B)大小和尾部組成。頭部和尾部包含了一些磁盤控制器所使用的信息。

為了使用磁盤存儲文件。操作系統(tǒng)還需要將自己的數(shù)據(jù)結(jié)構(gòu)記錄在磁盤上:第一步將磁盤分為一個或多個柱面組成分區(qū);第二步對物理分區(qū)進(jìn)行邏輯格式化,操作系統(tǒng)將初始的文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu)存儲在磁盤上,這些數(shù)據(jù)結(jié)構(gòu)包括空閑和已分配的空間以及一個初始為空的目錄。

(2)引導(dǎo)塊

計算機(jī)啟動時需要運(yùn)行一個初始化程序(自舉程序),它初始化CPU、寄存器、設(shè)備控制器和內(nèi)存等,接著啟動操作系統(tǒng)。為此,該自舉程序應(yīng)找到磁盤上的操作系統(tǒng)內(nèi)核,裝入內(nèi)存,并轉(zhuǎn)到起始地址,從而開始操作系統(tǒng)的運(yùn)行。

自舉程序通常保存在ROM中,為了避免改變自舉代碼需要改變ROM硬件的問題,故指在ROM中保留很小的自舉裝入程序,將完整功能的自舉程序保存在磁盤的啟動塊上,啟動塊位于磁盤的固定位。擁有啟動分區(qū)的磁盤稱為啟動磁盤或者系統(tǒng)磁盤。

(3)壞塊

由于磁盤有移動部件且容錯能力弱,所以容易導(dǎo)致一個或多個扇區(qū)損壞。部分磁盤甚至從出廠時就有壞扇區(qū)。根據(jù)所使用的磁盤和控制器,對這些壞塊有多種處理方式。

對于簡單磁盤,壞扇可手工處理;對于復(fù)雜的磁盤,其控制器維護(hù)一個磁盤壞塊鏈表。該鏈表在出廠前進(jìn)行低級格式化就初始化了,并在磁盤的整個使用過程中不斷更新。低級格式化將一些塊保留作為備用,對操作系統(tǒng)透明??刂破骺梢允褂脗溆脡K來邏輯地代替壞塊,這種方案稱為扇區(qū)備用。

*SSD


操作系統(tǒng)(六)——文件管理的評論 (共 條)

分享到微博請遵守國家法律
安图县| 绥棱县| 绩溪县| 竹山县| 保康县| 中卫市| 河北区| 绍兴市| 辰溪县| 永胜县| 白城市| 新闻| 留坝县| 平安县| 酒泉市| 墨竹工卡县| 龙里县| 合江县| 萨迦县| 桐梓县| 界首市| 襄汾县| 延安市| 阳春市| 新巴尔虎左旗| 延边| 孝昌县| 巴里| 清流县| 手游| 罗定市| 鸡泽县| 儋州市| 耿马| 荆门市| 苍山县| 青河县| 闽清县| 偃师市| 腾冲县| 铜鼓县|