版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第6章文件管理6.1文件管理概述6.2Linux文件系統(tǒng)6.3Ext2文件系統(tǒng)6.4虛擬文件系統(tǒng)習題
6.1文件管理概述
6.1.1文件與文件系統(tǒng)
1.文件
文件是具有名字的一組相關信息的有序集合,存放在外部存儲器中。文件的名字稱為文件名,它是文件的標識。文件的信息可以是各種各樣的,一個程序、一批數(shù)據(jù)、一張圖片、一段視頻等都可以作為文件的內(nèi)容。文件的存儲空間是具有長久記憶特性的外部存儲器(如磁盤、磁帶等),因而文件是可以長久保存的信息形式。所有需要在系統(tǒng)關機后仍能保留的信息都應以文件的形式存在。
2.文件系統(tǒng)
文件系統(tǒng)是操作系統(tǒng)的一個重要組成部分,它負責管理系統(tǒng)中的文件,為用戶提供使用文件的操作接口。文件系統(tǒng)由實施文件管理的軟件和被管理的文件組成。文件系統(tǒng)軟件屬于系統(tǒng)內(nèi)核代碼,文件則按特定的格式存放在磁盤分區(qū)中。文件系統(tǒng)通常以磁盤分區(qū)劃分,每個分區(qū)對應一個獨立的文件系統(tǒng)。
歸納起來,文件系統(tǒng)的功能包括以下幾項:
●實現(xiàn)文件的“按名存取”,包括按名建立、讀/寫、檢索、修改、刪除文件等操作。
●管理分區(qū)存儲空間,實施存儲空間的分配、回收與重組。
●實現(xiàn)對文件的共享、保密和保護措施。
●提供文件訪問接口。
3.文件的描述
為了實施和控制對文件的各種訪問操作,文件系統(tǒng)為每個文件都建立了一個文件控制塊(FileControlBlock,F(xiàn)CB)。文件的FCB的作用類似于進程的PCB,它記錄了文件的使用者和管理者所關心的所有信息,包括文件名、屬主、文件大小、物理存儲位置、修改和訪問時間、存取權(quán)限等。當用戶創(chuàng)建一個新文件時,文件系統(tǒng)就為這個文件建立起一個FCB。隨著文件的操作,F(xiàn)CB的內(nèi)容也相應地變化。當文件被刪除時,它的FCB也就消失了。
4.文件目錄
計算機系統(tǒng)中通常存有大量的文件,系統(tǒng)須采用某種有效的形式來組織和管理這些文件。由于文件與文件的FCB一一對應,因此,管理文件就是管理文件的FCB。
文件系統(tǒng)采用目錄來組織文件。目錄是FCB的有序集合,通過目錄將所有的FCB分層分類地組織在一起,方便了文件的檢索操作。由于目錄的信息是需要長久保存的,所以目錄也需以文件的形式存在。為此,系統(tǒng)定義了一種特殊的文件——目錄文件,其內(nèi)容是一組FCB構(gòu)成的文件列表,每個表項是一個文件的FCB,在目錄里就稱為目錄項了。由于目錄本身也是文件,因此目錄的FCB也可以作為另一個目錄中的目錄項,從而構(gòu)成目錄的層次關系。目錄的主要功能是實現(xiàn)文件的“按名存取”,即用戶只需提供文件名就可以對文件進行各種操作。目錄實現(xiàn)了文件名到文件物理存放位置的映射。
目錄的另一個功能是合理地組織文件?,F(xiàn)在,幾乎所有的操作系統(tǒng)都采用樹形目錄結(jié)構(gòu),就是將文件分層分類地組織成一個樹狀結(jié)構(gòu),從根目錄開始向下延伸。樹形目錄結(jié)構(gòu)的特點是層次清楚,便于文件分類管理,可加快文件的檢索速度。另外,樹形目錄還允許文件重名,即只要文件不在同一目錄下便可以使用相同的名字。
5.文件的結(jié)構(gòu)
文件結(jié)構(gòu)是文件內(nèi)容的組織方式。從不同層面上看到的文件結(jié)構(gòu)有所不同。圖6-1所示是文件在三個不同抽象層次上的結(jié)構(gòu)。圖6-1文件的結(jié)構(gòu)
1)文件的格式
終端用戶是通過應用程序來使用文件的,從他們的角度看到的是文件的應用結(jié)構(gòu),也就是文件的格式。文件的格式由處理文件的應用程序定義和使用,通常以后綴名相區(qū)分。如“.doc”文件是由Word程序使用的格式,“.bmp”是圖片處理程序使用的格式。
根據(jù)文件格式的結(jié)構(gòu)類型,文件大致可分為結(jié)構(gòu)化文件(如列表文件、數(shù)據(jù)庫文件等)、半結(jié)構(gòu)化文件(如Web文檔、圖片、圖像等)和無結(jié)構(gòu)文件(如純文本文件等)。
2)文件的邏輯結(jié)構(gòu)
文件的邏輯結(jié)構(gòu)是文件系統(tǒng)的直接用戶(也就是應用程序)所看到的文件結(jié)構(gòu)。文件的邏輯結(jié)構(gòu)取決于文件系統(tǒng)接口的設計,它決定了文件存取的方式。應用程序按邏輯結(jié)構(gòu)訪問文件系統(tǒng)中的文件,并在此基礎上構(gòu)造出各種應用結(jié)構(gòu)呈現(xiàn)給應用程序的用戶。也就是說,應用程序負責文件的格式與邏輯結(jié)構(gòu)之間的映射。
文件的邏輯結(jié)構(gòu)有記錄式文件和流式文件兩種,具體介紹見6.1.2小節(jié)。
3)文件的物理結(jié)構(gòu)
文件的物理結(jié)構(gòu)又稱為存儲結(jié)構(gòu),是指文件在外存上的存儲組織形式。文件系統(tǒng)負責文件的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)之間的映射。
文件的物理結(jié)構(gòu)分為連續(xù)文件、鏈接文件和索引文件3種,具體介紹見6.1.3小節(jié)。
操作系統(tǒng)所關心的是文件的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)。邏輯結(jié)構(gòu)是供文件系統(tǒng)的用戶使用的,物理結(jié)構(gòu)是文件系統(tǒng)內(nèi)部使用的。將邏輯結(jié)構(gòu)與物理結(jié)構(gòu)相區(qū)分,是為了向用戶屏蔽有關文件存儲的細節(jié),使用戶可以只憑簡單的邏輯結(jié)構(gòu)來使用文件。6.1.2文件的邏輯結(jié)構(gòu)與存取方式
1.文件的邏輯結(jié)構(gòu)
文件的邏輯結(jié)構(gòu)是從文件的使用者角度所看到的文件信息的組織形式,它獨立于文件的物理存儲特性。
文件的邏輯結(jié)構(gòu)主要分為兩種類型:一種是記錄式文件,另一種是流式文件。
1)記錄式文件
記錄式文件由若干記錄組成,記錄具有固定的長度和一致的內(nèi)部結(jié)構(gòu),其中有一個用于標識記錄的記錄號字段。用戶程序預先定義好文件記錄的格式,文件系統(tǒng)就按此格式創(chuàng)建文件。訪問文件時要向文件系統(tǒng)提供記錄號,文件系統(tǒng)則以記錄為單位進行文件的定位和讀/寫。
記錄式文件是結(jié)構(gòu)化的文件,它就像一張表格,用戶程序要按預先規(guī)定的格式填寫數(shù)據(jù)和讀取數(shù)據(jù),使用起來不夠靈活,也不便于構(gòu)造不規(guī)則的應用格式。另外,記錄的大小與存儲塊的大小難以匹配,讀/寫操作的復雜度較高。由于這些原因,記錄式文件已漸被淘汰。
2)流式文件
流式文件是由字節(jié)序列組成的文件,是無結(jié)構(gòu)的文件。用戶程序訪問文件時只要指定文件的偏移位置和要讀/寫的字節(jié)數(shù),文件系統(tǒng)即可方便地存取指定部分的文件內(nèi)容。
流式文件就像一張白紙,沒有任何格式上的限制。用戶程序可任意地在字節(jié)流上構(gòu)造自己的應用格式。寫文件時,用戶程序按自己定義的結(jié)構(gòu)來組織數(shù)據(jù),然后把它們作為字節(jié)流寫入文件;讀文件時,將讀出的字節(jié)流再解釋成自己使用的結(jié)構(gòu)。因此說,無結(jié)構(gòu)實際上就是不限制結(jié)構(gòu)的意思,這為應用程序提供了很大的靈活性,同時又簡化了文件系統(tǒng)的操作。所以現(xiàn)代流行的操作系統(tǒng),如Unix、Linux、Windows、OS/2等均采用流式文件作為文件的邏輯結(jié)構(gòu)。
2.文件的操作
對文件的操作主要有建立/刪除、打開/關閉、讀/寫、修改屬性等。
建立文件時用戶要為文件指定一個文件名,文件系統(tǒng)以文件名為標識建立文件的FCB,并為文件分配存儲空間等資源。刪除文件的操作與此相反,用戶指定要刪除的文件名,文件系統(tǒng)刪除該文件的FCB,并釋放其占用的存儲空間等資源。
對文件的讀/寫操作都要經(jīng)過文件的FCB來進行。由于FCB存放在外存空間中,如果每次讀/寫文件都要訪問外存FCB的話,存取速度將很低。因此在對文件進行任何讀/寫操作前,需要先打開文件。打開文件就是在內(nèi)存中生成文件的FCB,并返回一個標識其內(nèi)存FCB的文件標識符,隨后的讀/寫操作將通過此文件標識符進行。所有讀/寫完成后應關閉文件。關閉文件操作將內(nèi)存FCB的內(nèi)容寫回外存FCB,回收文件描述符,并刪除內(nèi)存中的文件FCB。
3.文件的存取方式
不論是記錄式文件還是流式文件,其邏輯結(jié)構(gòu)都是一維的,但存取方式有所不同。這里針對流式文件的存取方式介紹如何根據(jù)邏輯結(jié)構(gòu)存取文件。
存取文件指的是對文件的讀/寫操作。每個打開的文件都有一個指示讀/寫位置的指針offset,如圖6-2所示。文件剛打開時,讀/寫位置位于文件頭0字節(jié)處。每次讀/寫文件時(比如用C函數(shù)read()和write()等),根據(jù)給定的長度參數(shù)讀/寫count個字節(jié),完成后位置指針會自動移到讀/寫完的位置之后,這樣下次讀/寫就接著本次的位置順序地進行下去。必要時,也可以通過設置讀/寫位置指針來改變讀/寫的次序。例如,需要追加寫入時,需先將位置指針定位到文件尾。
應用程序?qū)α魇轿募拇嫒》绞接袃煞N,即順序存取和隨機存取。圖6?2流式文件的存取
1)順序存取
順序存取就是從文件頭開始順序地訪問文件的每一段信息,直到文件尾。應用程序在加載、保存、傳輸文件時,或?qū)ξ募瞿承┻^濾性處理時,都要對文件進行順序存取操作。
順序存取的通常做法是在一個循環(huán)中調(diào)用文件讀/寫函數(shù),直到遇到文件結(jié)束符(EOF)。
2)隨機存取
隨機存取也稱為直接存取,就是從文件的指定位置開始存取一段數(shù)據(jù)。很多應用場合需要隨機存取,例如,數(shù)據(jù)庫管理程序從數(shù)據(jù)庫表文件中讀取或修改一個記錄就是一種隨機存取。
隨機存取的方法是:先將讀/寫指針定位到文件的指定位移處(比如用C函數(shù)lseek()等),然后從此位置開始存取指定字節(jié)數(shù)的一段數(shù)據(jù)。6.1.3文件的物理結(jié)構(gòu)與存儲方式
文件的物理結(jié)構(gòu)是文件在外存中的組織和存放形式,是文件系統(tǒng)底層所使用的文件結(jié)構(gòu)。文件的物理結(jié)構(gòu)與存儲介質(zhì)的物理特性有關。在介紹文件的物理結(jié)構(gòu)之前有必要了解一些存儲設備的知識和存儲空間的結(jié)構(gòu)。
文件的存儲設備包括磁帶、磁盤、閃存、光盤等,典型的存儲設備是磁盤。下面簡單介紹磁盤的物理結(jié)構(gòu)及磁盤空間的邏輯結(jié)構(gòu)。
1.磁盤的物理結(jié)構(gòu)
磁盤的結(jié)構(gòu)如圖6-3所示。磁盤由一組盤片組成,每個盤片有兩個盤面,在對磁盤進行物理格式化時,在盤面上劃分出多個同心圓,稱為磁道(track)。所有盤面的相同位置的磁道組成的圓柱體,稱為柱面(cylinder)。每個磁道又劃分為多個弧段,稱為扇區(qū)(sector),通常的大小是512字節(jié)。扇區(qū)是磁盤的物理塊,是磁盤上可尋址的最小存儲單位。文件的數(shù)據(jù)就存儲在一系列扇區(qū)中。圖6-3磁盤結(jié)構(gòu)示意圖(上為俯視圖,下為側(cè)視圖)磁盤在啟動后高速旋轉(zhuǎn)。每個磁面上有一個磁頭,可以在不同磁道之間來回移動。扇區(qū)的定位參數(shù)有三個,即柱面號、磁頭號和扇區(qū)號。訪問磁盤時,先將磁頭移動到指定的柱面上,等待要訪問的扇區(qū)轉(zhuǎn)到磁頭下,然后指定的磁頭開始讀/寫數(shù)據(jù)。
2.磁盤空間的邏輯結(jié)構(gòu)
由于磁盤是高速設備,一次讀/寫操作可以同時訪問多個相鄰的扇區(qū)(通常是在同一柱面上)。因此,文件系統(tǒng)在讀/寫磁盤時不是以扇區(qū)為單位,而是以塊為單位的。塊(block)由若干個相鄰的扇區(qū)組成,它是對存儲空間的邏輯劃分。塊的大小依賴于文件系統(tǒng)的設置和磁盤容量,但必須是扇區(qū)大小的2的整數(shù)倍,并且要小于內(nèi)存頁幀的大小。通常塊的大小是512?B、1?KB或4?KB。
在文件系統(tǒng)看來,磁盤的存儲空間是由許多在邏輯上連續(xù)的塊組成的,它們從0到n編號,如圖6-4所示。文件系統(tǒng)以塊為單位保存文件數(shù)據(jù),也以塊為單位傳輸數(shù)據(jù)。所以稱這類存儲設備為塊設備。訪問文件時,只要指定塊號即可,不必關心它對應的扇區(qū)的位置,磁盤驅(qū)動程序會進行邏輯塊到物理塊(扇區(qū))的轉(zhuǎn)換。圖6-4磁盤存儲空間的邏輯結(jié)構(gòu)
3.文件的物理結(jié)構(gòu)
文件的物理結(jié)構(gòu)主要有3種:連續(xù)文件、鏈接文件和索引文件。
1)連續(xù)文件
連續(xù)文件的存儲方案是將文件的內(nèi)容按邏輯順序存放在連續(xù)的存儲塊中,這是最簡單的存儲分配方案,如圖6-5所示。假設磁盤空間采用4K大小的塊,文件A的大小為25K,系統(tǒng)為它分配了連續(xù)的7塊。文件B的大小為10K,系統(tǒng)為它分配了連續(xù)的3塊。它們的存儲空間是連續(xù)的,起始塊號和占用的塊數(shù)都記錄在它們各自的目錄項中。圖6-5連續(xù)文件的存儲結(jié)構(gòu)示意圖連續(xù)存儲方案的優(yōu)點是簡單、存取速度快。由于文件內(nèi)容是連續(xù)存放的,訪問時磁頭移動較少,因而無論順序存取還是隨機存取,其性能都很好。它的缺點之一是限制了文件的動態(tài)增長。另一個缺點是磁盤碎片問題,即經(jīng)過一系列的文件空間分配和回收操作后,空閑空間逐漸變得支離破碎,無法容納新文件。磁盤碎片降低了外存空間的利用率,需要經(jīng)常進行磁盤壓縮整理。由于這些缺點,連續(xù)文件不適合用于磁盤等直接存取設備。它主要用于在順序存取設備(如磁帶)或只讀存儲設備(如只讀光盤)上存儲文件。
2)鏈接文件
鏈接文件的存儲思想是:文件內(nèi)容可以存放在彼此不連續(xù)的存儲塊中,用指針拉鏈的方式表示文件內(nèi)容的邏輯順序。做法是:每個塊留出一個空間來存放指向下一塊地址的指針。在目錄項中記錄了文件首塊的磁盤地址,從首塊出發(fā)可以依次找到其他各塊,如圖6-6所示。圖中,文件A占用了4個存儲塊,依次是1→2→9→11;文件B占用了5個存儲塊,依次是5→6→3→15→18。與連續(xù)存儲方案相比,鏈接存儲中不再有磁盤碎片問題,因為每個塊都可以被利用。然而,鏈接文件的主要缺點是存取效率問題。由于不是連續(xù)存放,造成訪問時磁頭移動次數(shù)較多,順序存取還算方便,但直接存取就相當緩慢了。另外,由于指針占去了一些字節(jié),每個塊的字節(jié)數(shù)不再是2的冪,增加了讀/寫操作的復雜度。因為大多數(shù)程序都是以2的冪為長度來讀/寫塊的。圖6-6鏈接文件的存儲結(jié)構(gòu)示意圖目前,實際使用的鏈接文件是針對以上問題進行了改進的方案。改進的思想是將指針部分從存儲塊中提出來,單獨存放在一個鏈接表中。鏈接表的每一項對應一個存儲塊,其內(nèi)容是該塊所鏈接的下一個塊的塊號。圖6-7所示是文件分配鏈接表方案的示意圖。圖中描述了與圖的分配情形相同的兩條塊號鏈,一條是文件A的鏈,從表項1開始;另一條是文件B的鏈,從表項5開始。圖6-7文件分配鏈接表示意圖鏈接表占用的空間小,可以放在內(nèi)存中。當需要訪問文件時,只要在表中順著鏈進行查找即可,不需要訪問磁盤,因而提高了文件定位的速度。Windows的FAT文件系統(tǒng)采用的就是這種改進的鏈接文件結(jié)構(gòu)。
鏈接文件的優(yōu)點是允許文件長度動態(tài)變化,外存空間利用率高;缺點是存取效率(尤其是直接存取的效率)較連續(xù)文件低。對小文件來說沒有問題,但文件越大存取效率就越低。因此,鏈接文件更適合于小型文件系統(tǒng)。雖然在建立文件時文件系統(tǒng)會盡量為文件分配連續(xù)的區(qū)域,但經(jīng)過一段時間的文件動態(tài)增長或縮減操作后,文件的各存儲塊可能會變得過度分散,各文件的塊鏈穿插交錯,使存取效率大大降低。為解決這個問題,Windows的FAT文件系統(tǒng)采用了磁盤整理的方法。當文件訪問效率下降時,通過磁盤整理來重新調(diào)整文件在存儲空間中的分布,使其盡可能連續(xù)。
3)索引文件
索引文件的存儲方案也是允許將文件內(nèi)容存放在不連續(xù)的存儲塊中,但它是用索引表來建立文件內(nèi)容與存儲塊之間的聯(lián)系的。索引文件的分配思想與頁式內(nèi)存分配很相似,索引表就如同頁表的作用。圖6-8所示為索引文件的存儲結(jié)構(gòu)示意圖,文件A占用了4塊,依次是第7、0、9、14塊。通過文件的索引表可以直接找到各塊。圖6-8索引文件的存儲結(jié)構(gòu)示意圖索引文件具有鏈接文件的優(yōu)點,文件定位速度更快,順序存取和隨機存取效率都比較高。索引文件的缺點是占用的存儲空間較多,因為索引表本身需占用一定的存儲空間。對于只有1~2塊的小文件來說,雖然其索引表很小,但也要占用同樣的存儲空間。因此,對于小文件較多的系統(tǒng)來說,空間的浪費比較明顯,索引表的查找速度優(yōu)勢也并不明顯??偟恼f來,索引文件更適合于追求性能的大中型文件系統(tǒng),如Unix、Linux的文件系統(tǒng)都采用了一種多重索引的文件結(jié)構(gòu),具體介紹見6.3.1小節(jié)。6.1.4文件的共享與保護
1.文件共享
在多用戶系統(tǒng)中,有時會有多個用戶需要使用同一個文件的情況,比如一個項目組成員都要用到某些項目文件。如果每個用戶都保存一個文件副本則會浪費很多的存儲空間。文件共享是指允許一個文件被多個用戶或進程共同使用。這樣可以節(jié)省存儲空間和傳輸時間,并可避免因存在多個文件副本而可能發(fā)生的不一致的現(xiàn)像。實現(xiàn)文件共享的方法是鏈接法。當需要共享某個已存在的文件時,可以建立一個特殊的文件,稱為鏈接文件。這個文件有獨立的文件名,但并無實際的文件內(nèi)容,它的作用是建立一條到共享文件的通路。因此,鏈接文件名可以看做原共享文件的別名,它們都指向相同的文件內(nèi)容,訪問鏈接文件就是在訪問共享文件本身。在Linux系統(tǒng)中,鏈接文件被作為一種特殊的文件類型來對待,關于鏈接法的更詳細的介紹見6.3.1小節(jié)。
對于共享文件,可能會發(fā)生多個進程同時存取同一文件的情況,文件系統(tǒng)必須提供同步控制機制,以保證文件內(nèi)容的完整性。
2.文件的保護
文件保護的目的是防止文件被未授權(quán)的用戶訪問,造成泄密或意外的破壞。在多用戶系統(tǒng)環(huán)境下,文件保護特重要。
保護文件的主要手段是控制用戶對文件的存取權(quán)限。文件的存取權(quán)限包括讀、寫和執(zhí)行權(quán)。適當?shù)卦O置存取權(quán)限可以防止文件泄密、毀壞和被非法使用。
不同的用戶對文件的權(quán)限要求也是不同的,因此在權(quán)限分配時要根據(jù)用戶的性質(zhì)、職能、需求等對用戶進行分類,對不同種類的用戶分別授權(quán)。當用戶進行文件操作時,系統(tǒng)根據(jù)用戶的身份和文件的權(quán)限設置判斷用戶是否有權(quán)執(zhí)行這個操作。符合存取權(quán)限的操作將被執(zhí)行,違反權(quán)限的操作系統(tǒng)將拒絕執(zhí)行。通常有兩種用戶分類方法:一是將用戶分為系統(tǒng)管理員和普通用戶兩類,所有普通用戶具有相同的訪問權(quán)限。這是一種比較粗糙的分類,一般用于個人操作系統(tǒng)。另一種是Unix/Linux采用的分類方法,將用戶分為超級用戶、文件屬主、組用戶和其他用戶4類??梢詾槊款愑脩粼O置不同的訪問權(quán)限,從而實現(xiàn)了細粒度的權(quán)限控制。6.1.5文件存儲空間的管理
文件系統(tǒng)要對文件的存儲空間進行管理,管理工作包括:建立文件時為文件分配存儲空間;刪除文件時回收文件占用的存儲空間;修改文件時動態(tài)地分配和回收文件的存儲空間。不同的文件系統(tǒng)對文件存儲空間的管理方案也不同,常用的管理方案有以下3種:
1.位示圖
位示圖是由若干個字節(jié)組成的一張表,如圖6-9所示。每個字節(jié)的每一位對應一個存儲塊的狀態(tài),為“1”表示該塊已被占用,“0”表示該塊空閑。
位示圖法適合于索引文件。分配時,先掃描位示圖,找到足夠的空閑塊(對應位為“0”),分配給文件,并將對應的位改為“1”;回收時,將對應的位改為“0”即可。
由于位示圖的體積較小,可以全部或部分保存的內(nèi)存中,因此可實現(xiàn)高速的分配算法。圖6-9位示圖
2.空閑區(qū)表
空閑區(qū)表是記錄連續(xù)的空閑區(qū)域的表格,表格中的每一項記錄一個空閑區(qū)的起始塊號和塊數(shù),如圖6-10所示。
空閑塊表法適合于連續(xù)文件。分配時,依次掃描空閑區(qū)表,查找大小合適的空閑區(qū),分配給文件。如果空閑區(qū)大小正好是文件需要的塊數(shù),則刪去該表項;否則修改該表項,扣除被文件占用的區(qū)域。回收時,將文件釋放的區(qū)域填入空閑區(qū)表。如果與其他空閑區(qū)發(fā)生鄰接,則將鄰接區(qū)域的表項合并。圖6-10空閑塊表
3.空閑塊鏈表
將所有空閑塊的塊號用鏈表形式鏈在一起就形成了一個空閑塊鏈表,如圖6-11所示。
空閑塊鏈表法適合于鏈式文件。分配時,從鏈表頭取下若干鏈表節(jié)點,將對應的空閑塊分配給文件使用;回收時,將文件釋放的空閑塊的塊號鏈入鏈表中。圖6-11空閑塊鏈表
6.2Linux文件系統(tǒng)
6.2.1Linux文件系統(tǒng)的特點
Linux繼承了Unix文件系統(tǒng)的優(yōu)秀設計,并結(jié)合了一些現(xiàn)代文件系統(tǒng)的先進技術,在開放性、可擴展性和性能方面都十分出色。以下介紹Linux文件系統(tǒng)的幾個主要特征。
1.支持多種文件系統(tǒng)
許多操作系統(tǒng)(如DOS、Windows等)只支持一種或幾種專用的文件系統(tǒng),而Linux系統(tǒng)則可以支持幾乎所有流行的文件系統(tǒng)。這使得Linux可以和許多其他操作系統(tǒng)共存,允許用戶訪問其他操作系統(tǒng)分區(qū)中的文件。用戶可以使用標準的系統(tǒng)調(diào)用操作各個文件系統(tǒng)中的文件,并可在它們之間自由地復制和移動文件。這種兼容性帶來的另一個好處是Linux用戶可以根據(jù)應用需要選擇最適合的文件系統(tǒng),并可體驗眾多文件系統(tǒng)新產(chǎn)品的先進特色。
2.樹型可掛裝目錄結(jié)構(gòu)
Linux系統(tǒng)采用了樹型目錄和分區(qū)掛裝的概念,系統(tǒng)分區(qū)上的文件系統(tǒng)稱為根文件系統(tǒng),其他所有分區(qū)的文件系統(tǒng)都要掛裝(mount)到根文件系統(tǒng)下的某個目錄下,然后通過根目錄來訪問。因此,與Windows系統(tǒng)將每個分區(qū)獨立為一棵樹不同,Linux文件系統(tǒng)總是只有一棵樹,不管掛入的是本地磁盤分區(qū)還是網(wǎng)絡上的文件系統(tǒng),它們都與根文件系統(tǒng)無縫結(jié)合,用戶訪問這些分區(qū)就如同訪問根文件系統(tǒng)所在分區(qū)一樣。另外,Linux支持動態(tài)地掛裝和卸載文件系統(tǒng),允許用戶靈活地組織和擴充存儲空間。
3.文件、設備統(tǒng)一管理
Linux將設備也抽象為文件來處理,使用戶可以像讀/寫文件一樣地操作設備進行I/O操作。這樣做既簡化了系統(tǒng)結(jié)構(gòu)和代碼,又方便了用戶對設備的使用。在第7章中將介紹Linux如何通過文件系統(tǒng)來管理設備。6.2.2Linux文件系統(tǒng)的結(jié)構(gòu)
Linux文件系統(tǒng)采用了分層結(jié)構(gòu)的設計,如圖6-12所示。
Linux文件系統(tǒng)由以下幾個主要部分組成:圖6-12Linux文件系統(tǒng)的結(jié)構(gòu)
1.設備驅(qū)動程序
文件系統(tǒng)需要利用存儲設備來存儲文件,因此,存儲設備是文件系統(tǒng)的物質(zhì)基礎。除此之外,Linux系統(tǒng)中的其他設備也是作為文件由文件系統(tǒng)統(tǒng)一管理的。所有這些設備都由特定的設備驅(qū)動程序直接控制,它們負責設備的啟動、數(shù)據(jù)傳輸控制和中斷處理等工作。
Linux的各種設備驅(qū)動程序都通過統(tǒng)一的接口與文件系統(tǒng)連接。文件系統(tǒng)向用戶提供使用文件的接口,設備驅(qū)動程序則控制設備實現(xiàn)具體的文件I/O操作。
2.實際文件系統(tǒng)
文件系統(tǒng)是以磁盤分區(qū)來劃分的,每個磁盤分區(qū)由一個具體的文件系統(tǒng)管理,不同分區(qū)的文件系統(tǒng)可以不同。Linux系統(tǒng)支持多種不同格式的文件系統(tǒng),除了專為Linux設計的Ext2/Ext3、JFS、XFS、ReiserFS和NFS之外,還支持Unix系統(tǒng)的sysv、ufs、bfs,Minix系統(tǒng)的minx、XIA,Windows系統(tǒng)的FAT32、NTFS,DOS系統(tǒng)的FAT16,以及OS/2系統(tǒng)的hpfs等。這些文件系統(tǒng)都可以在Linux系統(tǒng)中工作。Linux默認使用的文件系統(tǒng)是Ext2/Ext3。
3.虛擬文件系統(tǒng)
實際文件系統(tǒng)通常是為不同的操作系統(tǒng)設計和使用的,它們具有不同的組織結(jié)構(gòu)和文件操作接口函數(shù),相互之間往往差別很大。為了屏蔽各個文件系統(tǒng)之間的差異,為用戶提供訪問文件的統(tǒng)一接口,Linux在具體的文件系統(tǒng)上增加了一個稱為虛擬文件系統(tǒng)(VirtualFileSystem,VFS)的抽象層。
虛擬文件系統(tǒng)運行在最上層,它采用一致的文件描述結(jié)構(gòu)和文件操作函數(shù),使得不同的文件系統(tǒng)按照同樣的模式呈現(xiàn)在用戶面前。有了VFS,用戶覺察不到文件系統(tǒng)之間的差異,可以使用同樣的命令和系統(tǒng)調(diào)用來操作不同文件系統(tǒng),并可以在它們之間自由地復制文件。
4.緩存機制
文件系統(tǒng)和存儲設備進行數(shù)據(jù)傳輸時采用了緩存技術來提高外存數(shù)據(jù)的訪問效率。緩存區(qū)是在內(nèi)存中劃分的特定區(qū)域。每次從外設讀取的數(shù)據(jù)都暫時存放在這里。下次讀取數(shù)據(jù)時,首先搜索緩存區(qū),如果有需要的數(shù)據(jù),則直接從這里讀??;如果緩存區(qū)中沒有,則再啟動設備讀取相應的數(shù)據(jù)。對于寫入磁盤的數(shù)據(jù),也先放入到緩存區(qū)中,然后再分批寫出到磁盤中。使用緩存技術使得大多數(shù)數(shù)據(jù)傳輸都直接在進程的內(nèi)存空間和緩存區(qū)之間進行,減少了外部設備的訪問次數(shù),提高了系統(tǒng)的整體性能。
VFS文件系統(tǒng)使用了緩沖區(qū)緩存、目錄項緩存以及i節(jié)點緩存等技術,使得整個文件系統(tǒng)具有相當高的效率。
6.3Ext2文件系統(tǒng)
Ext2(Extended-2)文件系統(tǒng)是專為Linux系統(tǒng)設計的一種文件系統(tǒng)。它采用的是Unix文件系統(tǒng)的設計思想,運行穩(wěn)定,存取效率也很高,可支持最大4?TB(1T=1024G)的磁盤分區(qū)。2000年以前,它一直是幾乎所有的Linux發(fā)行版的默認的文件系統(tǒng)。
Ext2的弱點在于它是一個非日志文件系統(tǒng)。日志文件系統(tǒng)可以在系統(tǒng)發(fā)生斷電或者其他系統(tǒng)故障時保證文件數(shù)據(jù)的完整性,這對關鍵行業(yè)的應用是十分重要的。近年來Ext2已逐漸被它的升級版Ext3取代。Ext3是一個基于Ext2開發(fā)的日志文件系統(tǒng)。它具有健全的日志功能,可靠性很高。在非正常關機后,文件系統(tǒng)可在數(shù)十秒鐘內(nèi)自行修復。另外,Ext3文件系統(tǒng)的容量有了很大的提高,可以支持最大32?TB的文件系統(tǒng)和最大2?TB的文件。目前Ext3已被許多Linux發(fā)行版作為默認安裝的文件系統(tǒng)。目前,第4代Ext文件系統(tǒng)Ext4正處于試用階段。Ext4最為顯著的改進是文件和文件系統(tǒng)的大小。Ext4文件系統(tǒng)的容量達到1024?PB(1P=1024T),而文件大小則可達到16?TB。
本節(jié)對Ext2文件系統(tǒng)進行分析和介紹,其基本結(jié)構(gòu)和操作同樣也適用于Ext3和Ext4。6.3.1Ext2文件的結(jié)構(gòu)
Ext2文件的邏輯結(jié)構(gòu)是無結(jié)構(gòu)的流式文件?;谧止?jié)流的概念,使得Linux系統(tǒng)可以把目錄、設備等都當作文件來統(tǒng)一對待。Ext2文件的物理結(jié)構(gòu)采用易于擴展的多重索引方式,便于文件動態(tài)增長,同時也可以方便地實現(xiàn)順序和隨機訪問。
1.Ext2文件的描述
Ext2文件系統(tǒng)采用了改進的FCB結(jié)構(gòu)來描述文件。
FCB要描述的信息比較多,所以一般要占較多的空間。當目錄下的文件很多時,目錄文件(其內(nèi)容是目錄項列表)就會很大,往往需要占用多個存儲塊,這將導致目錄檢索的效率下降。改進的方法是將FCB分解為兩個部分:主部和次部。FCB主部包含除文件名之外的全部信息,稱為索引節(jié)點或i節(jié)點。次部只包含文件名和主部的標識號碼(即i節(jié)點號)。文件目錄由各文件的FCB次部組成,主要實現(xiàn)按名檢索的目的。由于目錄項(即FCB次部)很小,目錄文件也就很小,按文件名檢索的速度很快,檢索到后就可以立即找到文件的i節(jié)點了。
Ext2目錄項(directoryentry)主要包括文件名和i節(jié)點號兩部分。i節(jié)點號用于指示i節(jié)點的存放位置,文件名用于文件檢索。Ext2文件系統(tǒng)支持最長255個字符的長文件名。
Ext2文件系統(tǒng)采用索引節(jié)點(inode)方式來描述文件,系統(tǒng)中的所有文件(包括目錄和設備)都對應一個唯一的i節(jié)點。i節(jié)點的內(nèi)容包含文件說明信息和索引表兩部分,文件說明信息部分包括模式(訪問權(quán)限與類型)、所有者(屬主和屬組)、長度、時間戳、連接數(shù)等信息。索引表部分是指向文件存儲塊的索引指針。
圖6-13是Ext2文件的目錄項和索引節(jié)點的結(jié)構(gòu)。圖6-13Ext2文件的描述
2.?Ext2索引結(jié)構(gòu)
Ext2文件采用了多重索引的物理結(jié)構(gòu),用i節(jié)點中的索引表描述,見圖6-14。
索引表中前12個表項是直接指針,直接指向文件的數(shù)據(jù)塊。這些塊稱為直接塊。第13個表項是一個一級間接指針,它指向一個索引塊。索引塊中存放的是間接索引表,通過間接索引表中的指針再指向數(shù)據(jù)塊。這些由間接指針指向的塊稱為間接塊。類似的,索引表的第14項和第15項提供了一個二次間接和一個三次間接指針,可提供對更多的間接塊的索引。提供多級間接指針的目的是為了表達大型文件的結(jié)構(gòu)。圖6-14Ext2文件的多重索引結(jié)構(gòu)
Ext2文件系統(tǒng)的默認塊大小是1?KB。對于12K以下的小文件,不需要使用間接索引,所有信息均在i節(jié)點中,因此訪問的速度非???。大一些的文件,需要用到一個間接索引塊。
一個間接索引表含有256個間接指針(每個指針占4字節(jié),則1K大的塊可容納256個指針),可以索引256個間接塊。因此,大小在12K~268K的文件需要一次間接,訪問速度會有所降低。而對于大型的文件,可以使用二次間接甚至三次間接指針,得到最大約16?GB的文件。
3.Ext2目錄文件的描述
目錄文件的描述結(jié)構(gòu)與普通文件一樣,每個目錄文件對應一個目錄項(在其父目錄中)以及一個i節(jié)點。不同之處在于目錄文件的內(nèi)容數(shù)據(jù)塊中存放的是一個目錄項列表,包含了該目錄下的所有文件的目錄項,頭兩個目錄項是“.”和“..”。Ext2目錄結(jié)構(gòu)如圖6-15所示。圖6-15
Ext2目錄結(jié)構(gòu)目錄文件A的內(nèi)容是一個含有6個目錄項的列表,其中“.”文件就是本文件的別名,它的i節(jié)點域指向了本文件的i節(jié)點,“..”文件是父目錄文件的別名,它的i節(jié)點域指向了父目錄文件的i節(jié)點(根目錄的“..”就是其自身)。其余4個表項分別對應了目錄A下的B、C、D、E子文件,其中文件B是一個子目錄,文件C是一個普通文件。文件D和E是一個共享文件。
4.?Ext2文件的定位
按名查找是文件系統(tǒng)要提供的一項重要功能。當用戶需要打開某個文件時,只要指定文件的路徑和名稱即可。文件系統(tǒng)根據(jù)路徑和文件名,從根目錄開始逐級向下找到文件所在的目錄,再找到文件的索引節(jié)點,然后就可以通過索引節(jié)點訪問文件中的數(shù)據(jù)了。這個過程就是文件的定位。例如,要查找文件/home/zhuge/memo文件,定位過程如下:
(1)在超級塊中找到根目錄“/”的索引節(jié)點(1號i節(jié)點),通過它找到根目錄文件的內(nèi)容,即根目錄項列表,如圖6-16(a)所示。
(2)在根目錄項列表中查找home目錄文件的索引節(jié)點(6號i節(jié)點),通過它找到/home目錄的目錄項列表,如圖6-16(b)所示。
(3)在/home目錄項列表中查找zhuge目錄文件的索引節(jié)點(17號i節(jié)點),通過它找到/home/zhuge目錄的目錄項列表,如圖6-16(c)所示。
(4)在/home/zhuge目錄項列表中查找memo文件的索引節(jié)點(60號i節(jié)點),這就是目標文件的索引節(jié)點。通過它找到/home/zhuge/memo文件的內(nèi)容,如圖6-16(d)所示。
隨后的文件訪問操作都將通過這個索引節(jié)點進行。圖6-16文件的定位過程
5.文件的鏈接
文件鏈接是實現(xiàn)文件共享的主要方式。Linux系統(tǒng)提供了兩種文件鏈接方式,即符號鏈接和硬鏈接,用link()系統(tǒng)調(diào)用實現(xiàn)。用戶可以用ln命令建立文件鏈接。
符號鏈接(symboliclink)很像Windows系統(tǒng)中的快捷方式,即建立一個符號鏈接文件,其內(nèi)容是到一個實際存在的文件的路徑描述。訪問符號鏈接文件時,系統(tǒng)將根據(jù)其記載的內(nèi)容轉(zhuǎn)去訪問那個實際文件。符號鏈接文件與目標文件是兩個獨立的文件,有著各自的i節(jié)點和數(shù)據(jù)塊。它們之間通過文件內(nèi)容而邏輯地鏈接在一起。硬鏈接(hardlink)則是將兩個或多個文件通過i節(jié)點物理地鏈接在一起。硬鏈接的文件具有不同的文件名和同一個i節(jié)點,通過其中任何一個文件名訪問得到的都是同一內(nèi)容,這就如同是一個文件具有多個別名。圖中的文件D和E就是硬鏈接的一個例子。硬鏈接文件的目錄項可以在同一目錄下,也可以在不同的目錄下,但不能跨越文件系統(tǒng)(即分區(qū))。
文件的i節(jié)點中記錄了該文件的連接數(shù),用ls-l命令可以顯示出文件的連接數(shù)。連接數(shù)表示連接到該i節(jié)點的文件目錄項的數(shù)目。新建的普通文件的連接數(shù)為1,每建立一個與它相連的硬鏈接文件時其連接數(shù)就增1。圖中的文件C的連接數(shù)是1,文件D和E的連接數(shù)都是2。刪除一個文件時,實際是刪除它的目錄項并將其i節(jié)點的連接數(shù)減1,若連接數(shù)為0才真正釋放文件的i節(jié)點和數(shù)據(jù)塊。新建目錄的連接數(shù)為2,對應了兩個文件名,即本目錄名與“.”。每當在其下建立一個子目錄時,它的連接數(shù)就增1,因為它在子目錄下又有了它的另一個文件名,即“..”。例如,圖中的目錄A的連接數(shù)為3,目錄B的連接數(shù)為2。
6.3.2Ext2文件系統(tǒng)的格式
Ext2文件系統(tǒng)在格式化時把它所占用的磁盤分區(qū)分為一個引導塊和若干個塊組。每一個塊組都由超級塊、組描述符表、塊位圖、i節(jié)點位圖、i節(jié)點區(qū)和數(shù)據(jù)塊區(qū)組成,如圖6-17所示。圖6-17Ext2文件系統(tǒng)的物理布局
1.引導塊與塊組
引導塊位于磁盤主分區(qū)的頭部,一般占用一個扇區(qū),用來存放引導程序。引導程序負責加載操作系統(tǒng),它不是文件系統(tǒng)的組成部分。
除引導塊外,分區(qū)的其他存儲空間以存儲塊為單位劃分。Ext2文件系統(tǒng)的存儲塊大小可以是1?KB、2?KB或4?KB,在創(chuàng)建文件系統(tǒng)的時候指定。塊大小的選取要合適,過大會降低存儲空間的利用率,過小則會降低文件系統(tǒng)的時間效率,默認值是1?KB。大型磁盤分區(qū)包含的存儲塊數(shù)量眾多,為便于管理,Ext2文件系統(tǒng)它們劃分為若干個塊組(blockgroup),每個塊組中包含一定數(shù)量的連續(xù)的存儲塊。塊組的大小取決于磁盤分區(qū)的大小。在軟盤等一些小容量分區(qū)里一般只使用一個塊組,它包含了文件系統(tǒng)里所有的塊。而在大磁盤分區(qū)里通常會劃分出許多個塊組。
每個塊組中有一部分塊是用來保存該塊組的管理信息的,包括超級塊、組描述符、塊位圖和i節(jié)點位圖。其余的塊是用于保存文件的,包括i節(jié)點區(qū)和數(shù)據(jù)塊區(qū)。
2.超級塊和組描述符
每個Ext2的磁盤分區(qū)有一個超級塊(superblock),它占用一個存儲塊,用來記錄整個文件系統(tǒng)的基本管理信息,如文件系統(tǒng)類型標識、數(shù)據(jù)塊大小、塊組大小、空閑塊和空閑i節(jié)點數(shù)量、第一個i節(jié)點(即根目錄的i節(jié)點)的塊號等。這些都是文件系統(tǒng)掛裝、檢查、分配、檢索等操作的基本參數(shù),是文件系統(tǒng)中最重要的數(shù)據(jù)。若超級塊損壞則整個分區(qū)的文件系統(tǒng)不再可用。
Ext2文件系統(tǒng)的每個塊組都有一個組描述符(groupdescriptor),用來記錄該塊組的使用信息,包括塊組中的塊位圖、i節(jié)點位圖和i節(jié)點區(qū)的位置、塊組內(nèi)存儲塊的分配情況等。所有塊組的組描述符集中在一起就形成了組描述符表,它是文件系統(tǒng)管理和訪問各塊組的依據(jù)。組描述符表位于超級塊之后,可能占用多個存儲塊。
為提高文件系統(tǒng)的可靠性,每個塊組中都保存有超級塊和組描述符表的一個副本。文件系統(tǒng)只使用第一個塊組中的超級塊和組描述符表,其他塊組中的則作為冗余備份,以便在系統(tǒng)崩潰時用來恢復文件系統(tǒng)。
3.i節(jié)點區(qū)
塊組中所有可用的i節(jié)點都集中存放在一起,形成i節(jié)點區(qū),或稱為索引節(jié)點表。塊組中的每個文件都在此表中占有一個i節(jié)點,通過i節(jié)點號檢索。索引節(jié)點表要占用多個連續(xù)的存儲塊。
4.數(shù)據(jù)塊區(qū)
數(shù)據(jù)塊區(qū)包含了大量的存儲塊,用于存放文件的內(nèi)容以及各級間接索引表。每個文件根據(jù)大小不同在數(shù)據(jù)塊區(qū)占有1至多個存儲塊。
5.位示圖
Ext2系統(tǒng)采用位示圖方式來管理空閑空間,一個位示圖用于記錄數(shù)據(jù)塊的分配情況,稱為“塊位圖”;另一個位示圖用于記錄i節(jié)點的分配情況,稱為“i節(jié)點位圖”。它們各占用1個存儲塊。位示圖中每一位代表一個塊的使用情況,為“0”表示相應的塊或i節(jié)點空閑,為“1”則表示已經(jīng)分配。6.3.3Ext2文件存儲分配策略
當建立一個新的文件時,文件系統(tǒng)要為它分配一個i節(jié)點和一定數(shù)目的數(shù)據(jù)塊。當該文件被刪除時,文件系統(tǒng)將回收其占有的i節(jié)點和數(shù)據(jù)塊。當文件在讀/寫過程中擴充或縮減了內(nèi)容時,文件系統(tǒng)也需要動態(tài)地為它分配或回收數(shù)據(jù)塊。
分配時根據(jù)位示圖的記錄為文件分配i節(jié)點和數(shù)據(jù)塊。分配策略在一定程度上決定著文件系統(tǒng)的整體效率。系統(tǒng)會盡可能把同一個文件所使用的塊、同一個目錄所關聯(lián)的i節(jié)點存放在相鄰的單元中,至少是在同一個塊組內(nèi),以提高文件的訪問效率。另外,Ext2文件系統(tǒng)還采用稱為預分配的機制來保證文件內(nèi)容擴展時塊的分配效率和效果。在文件建立的時候,如果有足夠的空閑塊,就在相鄰的位置為文件分配多于當前使用的塊,稱為預分配塊。當文件內(nèi)容擴展時,優(yōu)先使用這些塊,可以提高分配效率,也可以保證這些塊具有連續(xù)關系。如果預分配的塊用完或者是根本沒有啟動預分配機制,分配新塊時也要盡可能保證與原有塊相鄰。
6.4虛擬文件系統(tǒng)
虛擬文件系統(tǒng)(VFS)位于整個文件系統(tǒng)的最上層。向下,它與實際的文件系統(tǒng)接口,通過它們實現(xiàn)具體的文件操作;向上,它為用戶進程及內(nèi)核其他模塊提供使用文件系統(tǒng)的統(tǒng)一接口。VFS接受來自上層的有關文件系統(tǒng)的系統(tǒng)調(diào)用,把用戶所請求的文件操作進行適當?shù)霓D(zhuǎn)換,轉(zhuǎn)交給具體的文件系統(tǒng)進行處理,然后再把具體的操作結(jié)果返回給上層的調(diào)用者。此外,VFS還要負責管理文件系統(tǒng)的各種緩沖區(qū),保證文件系統(tǒng)的整體效率。虛擬文件系統(tǒng)之所以稱為虛擬,是因為它只存在于內(nèi)存中,在系統(tǒng)啟動時建立起來,在系統(tǒng)關閉時消失。VFS不能直接操作文件,所有對文件的實際操作都要通過實際存在于磁盤分區(qū)的文件系統(tǒng)來完成。因此,虛擬文件系統(tǒng)必須和某個或某些實際的文件系統(tǒng)一起才能實現(xiàn)完整的文件管理功能。
引入虛擬文件系統(tǒng)的目的是為了屏蔽各種文件系統(tǒng)的差異。它對實際文件系統(tǒng)進行抽像,采用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中描述所有實際的文件系統(tǒng),向用戶提供一組標準的文件操作函數(shù)。VFS負責將標準文件操作映射到實際文件系統(tǒng)的操作。正是這種抽像和映射,保證了Linux系統(tǒng)可以支持多種不同的文件系統(tǒng),使所有文件系統(tǒng)都具有基本相同的外部表現(xiàn)。6.4.1VFS的文件對象
VFS雖然是用C語言寫成的,但它其實是采用了面向?qū)ο蟮脑O計思想。VFS使用一族數(shù)據(jù)結(jié)構(gòu)來描述通用的文件對象,這些結(jié)構(gòu)體除了包含有一些數(shù)據(jù)外還包含了操作這些數(shù)據(jù)的函數(shù)指針。構(gòu)成VFS文件系統(tǒng)的基本對象有以下4類:
●
VFS超級塊(superblock),描述一個文件系統(tǒng);
●
VFS目錄項(dentry),描述一個文件的邏輯屬性;
●
VFS索引節(jié)點(inode),描述一個文件的物理屬性;
●
VFS文件(file),描述一個文件的當前使用信息。
VFS的對象存在于內(nèi)存。它們在適當?shù)臅r候被建立起來。建立時,結(jié)構(gòu)體的數(shù)據(jù)由實際文件系統(tǒng)的相應的數(shù)據(jù)來填充,操作函數(shù)由實際的文件系統(tǒng)實現(xiàn)。VFS依據(jù)這些對象提供的信息和操作函數(shù)來完成將用戶的文件請求映射到實際文件系統(tǒng)的操作。
Unix/Linux風格的文件系統(tǒng)與VFS文件系統(tǒng)有著相同的概念和很好的對應關系,可以直接從它們的對應結(jié)構(gòu)中構(gòu)造出VFS文件系統(tǒng)的對象。但像FAT或NTFS這樣的非Unix風格的文件系統(tǒng)則必須經(jīng)過封裝,使其符合Unix文件系統(tǒng)的概念結(jié)構(gòu)并滿足VFS的要求,這樣它們就可以像Ext2文件系統(tǒng)那樣和VFS一起工作了,只是在性能上多少會受些影響。
1.?VFS超級塊
VFS超級塊對應實際文件系統(tǒng)的超級塊,它代表一個實際的文件系統(tǒng)。VFS超級塊的內(nèi)容包括:設備標識符、文件系統(tǒng)標志、數(shù)據(jù)塊大小、文件系統(tǒng)的特殊信息、文件系統(tǒng)的使用信息以及超級塊操作集等。設備標識符用來標識一個文件系統(tǒng);文件系統(tǒng)類型和數(shù)據(jù)塊大小用來描述這個文件系統(tǒng)的基本特征;文件系統(tǒng)的特殊信息對應著該文件系統(tǒng)的實際超級塊,在掛裝時被復制過來;文件系統(tǒng)的使用信息描述文件系統(tǒng)的當前狀態(tài)和緩沖區(qū)指針等;超級塊操作集由一組函數(shù)指針組成,主要實現(xiàn)對文件系統(tǒng)和i節(jié)點的各種管理操作。
VFS為每個已掛裝的文件系統(tǒng)建立一個VFS超級塊,通過它來訪問和管理實際文件系統(tǒng)。VFS超級塊在掛裝文件系統(tǒng)時建立,在文件系統(tǒng)卸載后撤銷。在此期間,由于文件操作會修改VFS超級塊的內(nèi)容,造成與磁盤上的超級塊內(nèi)容不一致,VFS通過周期性地將所有發(fā)生改變的超級塊寫回磁盤來實現(xiàn)超級塊的同步更新。
2.?VFS索引節(jié)點
VFSi節(jié)點對應于實際文件系統(tǒng)中的i節(jié)點,它代表虛擬文件系統(tǒng)中的一個具體的文件。VFSi節(jié)點的內(nèi)容包括了實際的磁盤i節(jié)點的信息,如i節(jié)點號(i_no)、訪問權(quán)限(i_mode)等,另外還包括了當前文件打開狀態(tài)(i_state)以及i節(jié)點操作集指針(i_op)等信息。i節(jié)點操作集用inode_operations結(jié)構(gòu)描述,它由一組函數(shù)指針組成,包含了針對具體文件的各種操作,如建立和打開文件(create)、鏈接文件(link)等。系統(tǒng)為每個打開的文件都建立一個VFSi節(jié)點。在一個文件被打開時,VFS讀入該文件的磁盤i節(jié)點的信息,為它在內(nèi)存建立一個VFSi節(jié)點,并通過它來訪問這個文件。文件關閉后它的VFSi節(jié)點被撤銷。與超級塊相同,i節(jié)點也存在同步更新的問題,所以,VFS也會周期性地將所有發(fā)生改變的i節(jié)點寫回磁盤。
3.?VFS目錄項
從圖6-16所示例子可以看出,在定位一個文件時需要沿該文件的路徑逐級訪問路徑中的各個目錄。如果每次都要從磁盤讀取目錄文件的話,訪問文件的效率就會很低。為了方便查找操作,VFS引入了目錄項(dentry)的概念。目錄項代表的是一個路徑分量。路徑由一系列的分量組成,每個分量都是一個目錄或文件。例如,路徑名/home/zhuge/memo中包含了“/”、“home”、“zhuge”和“memo”4個分量。當VFS首次解析一個路徑名時,它依次讀取路徑中的每個目錄或文件,為它建立一個dentry結(jié)構(gòu),每個dentry結(jié)構(gòu)都與一個VFSi節(jié)點相連。VFS將這些已建立的dentry結(jié)構(gòu)按目錄關系鏈接在一起,在后續(xù)的文件查找操作中,VFS只需沿dentry的鏈接結(jié)構(gòu)進行查找,可以很快地找到目標文件的dentry結(jié)構(gòu),然后得到它的VFSi節(jié)點。
dentry的內(nèi)容包含目錄項的文件名(d_name)以及構(gòu)成結(jié)構(gòu)關系的各種指針,還有指向i節(jié)點的指針(d_inode)和目錄項操作集的指針(d_op)等。目錄項操作集用dentry_operations結(jié)構(gòu)描述,它包含了對目錄項的各種操作,如文件名比較(d_compare)、刪除(d_delete)、釋放(d_release)等。
概括地講,目錄項是對文件的邏輯描述,它描述的是文件的邏輯標識(文件名)以及該文件與其他文件的邏輯關系(其在目錄樹中的位置),而關于該文件的物理描述則包含在它所指向的VFSi節(jié)點中。目錄項與VFSi節(jié)點合起來才能完整地表示一個文件。目錄項可以看作是訪問一個文件的入口,查找文件就是在目錄項鏈表中沿路徑找到目標目錄項的過程。
目錄項并不對應實際文件系統(tǒng)中的任何成分,因此也不存在同步更新的問題。
4.?VFS文件
從用戶(也就是進程)的角度來看,它們直接處理的是文件,它們關心的是文件的訪問模式、讀/寫位置等屬性以及讀、寫等操作,而不是超級塊和i節(jié)點。VFS用file對象來描述進程所關心的文件,每當進程打開一個文件,VFS都將為它建立一個file結(jié)構(gòu)。file結(jié)構(gòu)的內(nèi)容包括文件打開模式(f_mode)、讀/寫位置指針(f_pos)、文件訪問計數(shù)(f_count)、文件的目錄項指針(f_dentry)和文件操作集指針(f_op)等。打開模式、讀/寫位置和訪問記數(shù)描述了文件的當前使用狀態(tài),目錄項指針用于連接文件的目錄項。文件操作集用file_operations結(jié)構(gòu)描述,它由一組對文件內(nèi)容進行操作的函數(shù)指針組成,包含了標準系統(tǒng)調(diào)用的那些函數(shù),如read()、wirte()、lseek()等。
VFS的i節(jié)點、目錄項和文件對象的結(jié)構(gòu)關系如圖6-18所示。圖6-18VFS文件的描述結(jié)構(gòu)圖中3個對象完整地表示了一個進程可用的文件。各個對象都帶有自己的操作集,它們的作用是將對該文件執(zhí)行的標準操作映射到實際文件系統(tǒng)的具體操作函數(shù)上。這也是VFS實現(xiàn)標準接口功能的關鍵。6.4.2VFS緩存
為了提高文件訪問的速度,VFS使用了一些復雜的緩存技術。VFS系統(tǒng)設置了目錄項緩存(dcache)、i節(jié)點緩存(icache)和緩沖區(qū)緩存(buffercache),見圖。這些緩存都是由VFS管理的。設置緩存的目的是為了減少訪問磁盤的次數(shù),提高文件的查找和讀/寫效率。
文件系統(tǒng)經(jīng)常會訪問某些常用的文件和目錄(比如/usr目錄等),為避免重復創(chuàng)建i節(jié)點和目錄項的操作,VFS設置了i節(jié)點緩存和目錄項緩存,用于保留已創(chuàng)建的VFSi節(jié)點和dentry結(jié)構(gòu)。每當需要訪問一個i節(jié)點時,系統(tǒng)先在i節(jié)點緩存區(qū)中找,如果找到就直接使用,否則再從磁盤讀入i節(jié)點并構(gòu)造VFSi節(jié)點。同樣,每當需要訪問一個目錄項時,VFS先在目錄項緩存中查找,如果有就直接使用,沒有時再去創(chuàng)建它的dentry結(jié)構(gòu)。文件內(nèi)容的讀/寫是一件耗時的操作。為減少實際訪問磁盤的次數(shù),VFS設置了緩沖區(qū)緩存。當文件系統(tǒng)與磁盤設備交換文件數(shù)據(jù)時,它們通過緩沖區(qū)緩存對I/O操作進行緩沖,同時將傳輸?shù)臄?shù)據(jù)緩存起來。當下一次讀/寫文件時,VFS先在緩存區(qū)中查找,若命中則直接使用,否則再啟動設備傳輸數(shù)據(jù)。有關緩沖與緩存技術的進一步介紹見7.2.2小節(jié)。6.4.3VFS與進程的接口
VFS為進程提供了訪問文件系統(tǒng)的統(tǒng)一接口。接口由fs_struct和file_struct結(jié)構(gòu)構(gòu)成。
fs_struct結(jié)構(gòu)描述進程與文件系統(tǒng)的關系,主要內(nèi)容包括進程使用的創(chuàng)建文件掩碼(umask)、根目錄的目錄項指針(root)和當前目錄的目錄項指針(pwd)等。
file_struct結(jié)構(gòu)體包含了該進程已經(jīng)打開的所有文件的信息,主要是一個fd數(shù)組,數(shù)組的每一項fd[i]是一個指向一個file結(jié)構(gòu)的指針。fd[i]的下標i稱為文件描述符。進程初啟時,自動打開stdin、stdout和stderr三個文件,文件描述符分別為0、1和2。以后每當進程打開一個新文件,系統(tǒng)就在fd數(shù)組中選定第一個空閑的單元來存放指向該文件的file結(jié)構(gòu)的指針,并返回對應的數(shù)組下標作為文件描述符。圖描述了進程和文件系統(tǒng)的接口結(jié)構(gòu)。進程控制塊task_struct中包括兩個指針,一個是fs,指向進程的fs_struct;另一個是files,指向進程的file_struct。進程通過這兩個指針得到有關文件系統(tǒng)和打開文件的信息,再通過它們獲得文件的目錄項、i節(jié)點以及它們的操作集。
圖6-19中右側(cè)3列是VFS系統(tǒng)部分,包括系統(tǒng)打開文件表、目錄項表和i節(jié)點表。它們分別是由系統(tǒng)中所有打開文件的file結(jié)構(gòu)、dentry結(jié)構(gòu)和inode結(jié)構(gòu)形成的鏈表。最左側(cè)是進程PCB。中間的fs_struct結(jié)構(gòu)和file_struct結(jié)構(gòu)起到進程與VFS接口的作用。
fd[0]、fd[1]和fd[2]所連接的file結(jié)構(gòu)是系統(tǒng)為進程自動打開的文件,通常是終端設備的file結(jié)構(gòu)。如果進程的I/O環(huán)境被重定向,則相應的fd項就改為連接其他文件的file結(jié)構(gòu)。圖6-19進
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 礦物加工設備創(chuàng)新與發(fā)展-石墨滑石考核試卷
- 照明燈具的色彩溫度選擇考核試卷
- 礦業(yè)勘查技術進展與應用考核試卷
- 毛皮制品加工企業(yè)生產(chǎn)管理信息系統(tǒng)考核試卷
- 相機攝影藝術與創(chuàng)意表達考核試卷
- 皮革服裝生產(chǎn)過程質(zhì)量控制考核試卷
- DB5132T 66-2021 釀酒葡萄種植技術規(guī)程
- 高職人體解剖生理復習題復習試題及答案
- 《富勒烯材料的制備及其在壓裂液中的應用研究》
- 《詠嘆調(diào)《他是祖國的敵人》的演唱研究》
- 部編六年級語文上冊 讀音易錯字
- 2023高中學業(yè)水平合格性考試歷史重點知識點歸納總結(jié)(復習必背)
- 低壓用電客戶電能計量裝置典型設計
- 桑樹栽培技術課件
- 精編-人教版八年級上冊物理-第四章光現(xiàn)象全單元課件設計(5課時)
- 管道和設備保溫工程檢驗批質(zhì)量驗收記錄
- 電纜槽橋架安裝檢查記錄
- 中班美術教案:美麗的社區(qū)教案及教學反思
- 2022年江蘇小高考生物試題(含答案)
- 游戲王統(tǒng)一規(guī)則
- 五年級上冊數(shù)學課件-9.3 多邊形的面積(復習)丨蘇教版 (共15張PPT)
評論
0/150
提交評論