操作系統--文件系統

一、文件

文件系統出現是爲了解決多用戶存儲、管理信息時出現的問題。用戶所有的操作都是基於邏輯文件的,文件系統最終需要將用戶對邏輯文件的操作轉換成對物理文件的操作。物理文件可以是在存儲設備上的存儲區域,也可以使一個設備、管道、套接字,文件系統將用戶對文件的操作轉換成用戶對設備的操作、用戶間的通信操作和網絡操作。

1邏輯文件

在文件系統中,用戶所面對的文件是邏輯文件,邏輯文件是由文件名標識的一組信息的集合。文件名是一個字符串。用戶在邏輯文件上對信息進行存儲、操作。

邏輯文件與物理文件的分層結構增加了文件系統的靈活性。完全隔離,不影響。

2邏輯文件組織

最簡單的組織形式是一級目錄結構。

樹型多級目錄結構。不同邏輯文件可以重名,只要它們位於不同目錄中。

3邏輯文件結構

兩種形式記錄式文件和流式文件

記錄式文件:有結構的文件,包含若干邏輯記錄;

流式文件:文件內容只是一串信息集合,又稱字節流文件。每個字節都有一個索引。打開文件的進程使用文件讀寫位置來訪問文件中特定字節。當文件打開時,文件讀寫位置均指向首字節,每k個字節讀或寫操作完成則將文件讀寫位置增加k。大多數現代操作系統系統如Linux 對用戶只提供流式文件

4邏輯文件的存取

存取方法是文件系統爲應用程序提供的訪問文件的方法和手段。

1)順序存取

主要用於磁帶文件,但也適用於磁盤上的順序文件;

2)直接存取

用戶提供給操作系統的是相對塊號,它是相對於文件開始位置的一個位移量,而絕對塊號則有系統換算得到。對於記錄式文件,要爲每個文件記錄指定關鍵字,可通過關鍵字映射直接檢索和存取文件信息。

3)索引存取

用戶提供給操作系統記錄名或記錄鍵後,先搜索記錄名或記錄鍵,再查找到所需記錄。實際系統中,大多采用多級索引,以加速記錄查找的過程。

5物理文件的結構

計算法:實現原理是設計一個映射算法,通常用到線性計算法、雜湊法等,通過對記錄鍵的計算轉換成對應的物理地址,從而找到所需記錄。直接尋址文件、計算尋址文件和順序文件均屬此類。

指針法:設置專門指針,指明相應記錄的物理地址或表達各記錄之間的關聯。索引文件、索引順序文件、連接文件和倒排文件等均屬此類。

1)順序文件:將一個文件中邏輯上連續的信息存放到存儲介質的依次相鄰的物理塊上形成順序結構,又稱連續文件。優點:順序存取時速度較快。所以批處理文件,系統文件用得很多。主要缺點是:建立文件前不能預先確定文件長度,以便分配存儲空間;修改、插入和增加文件的記錄有困難;對可變長記錄的處理困難;磁盤作連續分配,會造成空閒塊的浪費。

2)連接文件:使用連接字(又稱指針)來表示文件中各個記錄之間的關係。使用指針可以將文件的邏輯記錄順序與它所在的存儲空間的物理塊順序完全獨立,即存放信息的物理塊不必連續,而藉助於指針表達記錄之間的邏輯關係;連接結構必須將連接字與數據信息混合存放,破壞了物理塊的完整性;存取信息須通過緩衝區,待獲得連接字後,才能找到下一物理塊的地址。因而,僅適宜於順序存取。連接結構恰好克服了順序結構不適宜於增、刪、改的缺點。

3)直接文件

連接文件很容易把數據記錄組織起來,但是查找某個記錄需遍歷連接結構,效率很低。散列法或雜湊(hash)法可以解決效率問題。在直接存儲設備上,利用hash法把記錄的關鍵字與其他地址之間建立某種對應關係,以便實現快速存取的文件叫直接文件或散列文件。採用hash技術需要建立hash表,爲指針數組,數組通過索引訪問,索引是與數據記錄有關的關鍵字,而記錄在介質上的位置是通過對記錄的鍵施加變換來獲得相應的地址。這種存儲結構用在不能採用順序組織方法,次序較亂,又需在極短時間存取的場合。

計算尋址結構中的難點是“衝突”問題。地址的總數和可能選擇的關鍵字之間不存在一一對應關係。不同的關鍵字可能變換出相同的地址,叫做“衝突”。機率越小,散列算法的性能越好。解決衝突的辦法叫溢處理技術。常用的溢出處理技術有:順序探測法、兩次散列法、拉鍊法和獨立溢出區法等。

4)索引文件

實現非連續存儲的另一種方法。適用於數據記錄保存在隨機存取存儲設備上的文件。系統爲每個文件建立索引表,可有不同的索引形式。一種是記錄組成指定文件的磁盤塊號,這種索引表只是盤塊號的序列,適用於流式文件。另一種是索引表項包含記錄鍵及其磁盤塊號,適用於記錄式文件。

索引結構是連接結構的一種擴展,除具備連接文件的優點外,記錄可以散列存儲,具有直接讀寫任意記錄的能力,便於信息的增、刪、改。缺點是增加了索引表的空間開銷和查找時間。索引項分爲兩類:稠密索引:對每個數據記錄,在索引表裏都有一個索引項;另一種是稀疏索引,對每一組數據記錄保存一個索引項,因而索引表本身較小,但數據記錄必須按某種方式排序,在查找時要花費代價。

索引順序文件是順序文件的擴展。其中各記錄本身在介質上也順序排列。

二、目錄

文件系統通常採用分層結構實現,大致分爲三層:邏輯文件管理、物理文件管理和邏輯文件與物理文件映射管理。

1、文件控制塊

文件系統中存在着邏輯文件和物理文件。對於邏輯文件和物理文件,文件系統都需要對每一個文件記錄相應的管理信息,這樣的數據結構被稱爲文件控制塊(FCB)。

物理文件控制塊中,系統記錄的主要信息如下:

文件控制信息。用戶名、文件主存取權限。

文件使用信息。打開文件的進程數、被修改的情況等。

文件管理信息。建立日期、最近修改日期等。

物理文件類型。如是設備文件、普通文件和套接字文件等。

物理文件的結構信息。如文件所在的設備名,文件物理結構類型,記錄存放在輔存盤塊號或文件信息首塊盤塊號等。

邏輯文件控制塊中,系統可以記錄的主要信息是:

邏輯文件標識符。邏輯文件的文件名。

邏輯文件結構信息。結構,如記錄類型、記錄個數、記錄長度和成組因子數等。

2、目錄、文件目錄與目錄文件

邏輯文件組織結構是一個樹狀結構。文件系統用文件目錄數據結構記錄下這樣的結構。還用文件目錄記錄邏輯文件到物理文件的映射。

目錄可以看成一種具有特殊結構的邏輯文件,該邏輯文件中記錄了所包含的子目錄和邏輯文件的信息。記錄這些信息的數據結構就是文件目錄。每一個目錄對應一個目錄項。每一個目錄項包含一個邏輯文件名和一個物理文件控制塊一個目錄項指明瞭一個邏輯文件到物理文件的映射

目錄是一種特殊的邏輯文件,這種邏輯文件的結構就是文件目錄。每一個邏輯文件都要有一個物理文件與之對應,目錄對應的物理文件就是目錄文件

將物理文件控制塊放入文件目錄項中,會給文件系統造成以下兩個缺點

1)浪費內存。查找過程中,不必讀入所有的物理文件控制塊。

2)不方便文件共享。不同的邏輯文件可以指向同一個物理文件。一個物理文件只能有一個物理文件控制塊。保持物理文件控制塊的同步會增加文件系統的負擔,影響文件系統的效率。

爲了解決這些問題,UNIX/LINUX引入了一種新的方法。在UNIX/LINUX中,文件控制塊被稱爲inode。該方法將所有inode集中存放在磁盤中的一塊區域中。在文件目錄項中只保存文件名和inode索引,即目錄項只保存文件名和inode指針。文件系統還可以將最近訪問過的inode放入主存的緩衝區。當系統要訪問inode時,系統可以根據inode索引號先在緩存區中查找,減少系統訪問磁盤的次數,提高系統效率。

3、文件存儲空間管理

輔存文件空間的有效分配和釋放是文件系統應解決的一個重要問題。“碎片”問題。

輔存文件空間分配通常採用以下兩種辦法:

a連續分配:在建立文件時,用戶必須給出文件大小,然後查找到能滿足的連續存儲區供使用。優點:順序訪問時通常無需移動磁盤頭,查找速度快,結構簡單,但爲了獲得足夠大的連續存儲區,需定時進行“碎片”收集。不適宜文件頻繁進行動態增長的情況,用戶事先不知道文件長度也無法進行分配。

b非連續分配:一種方法是以塊(扇區)爲單位,按文件動態要求分配給它若干扇區,這些扇區不一定要連續,屬於同一文件的扇區按文件記錄的邏輯次序用鏈指針或用位示圖指示。另一種方法是以簇爲單位,簇是若干個連續扇區組成的分配單位;實質上是連續分配和非連續分配的結合。各個簇可以用鏈指針、索引表和位示圖來管理。非連續分配的優點是輔存空間管理效率高,便於文件動態的增長和收縮,訪問文件執行速度快,特別是以簇爲單位的分配方法已被廣泛使用

4、文件共享

文件共享指不同進程共同使用同一文件。文件共享不僅是不同進程完成共同任務所必須的,而且還可以節省存儲空間,減少同步錯誤。文件共享可以靜態共享或動態共享。在UNIX/LINUX系統中,允許多個用戶靜態共享,或動態共享同一個文件,當一個文件被多個進程動態共享時,每個進程可以擁有各自的讀寫指針,也可以共用同一讀寫指針。

1靜態共享

文件的靜態共享指的是將多個邏輯文件映射到同一個物理文件。當一個用戶對其中一個邏輯文件進行操作時,其他邏輯文件也被修改。由於這種共享關係不管進程是否正在工作,其文件的共享關係都是存在的,因此稱爲靜態共享。

文件靜態共享主要方式有兩種:硬鏈接法和符號鏈接法

a、硬鏈接法

通過修改文件目錄項把不同的邏輯文件映射到同一物理文件來實現文件的共享。在硬鏈接法中,需要共享的不同邏輯文件在文件目錄項中具有相同的inode索引,通過此方法映射到同一個物理文件。在UNIX/LINUX中,文件硬鏈接的系統調用形式爲:link(oldnamep,newnamep)

b、符號鏈接法

UNIX/linux中,每個分區有自己的文件目錄樹,當有多個文件系統時,可以通過安裝(mount)的辦法整合成一顆更大的文件目錄樹。在每個分區中,系統中的每個物理文件有一個Inode,但是出於兩個不同的磁盤或分區的物理文件可以含有相同的inode號,因而無法做到從不同的文件系統生成指向同一文件的鏈接,對於像Link之類的系統調用,只能拒絕創建跨越文件系統的鏈接。

另一種解決靜態共享的方法是符號鏈接法。符號鏈接法中,文件系統中存在一種稱爲鏈接文件的物理文件。存儲方法和普通物理文件一直,但是內容是一個包含完整路徑的邏輯文件名。

硬件鏈接是一種用inode引用文件的方法,符號鏈接是一種用邏輯文件名引用文件的方法。符號鏈接優點是能用於鏈接計算機系統中不同文件系統的文件,也可以用於鏈接目錄;進一步可以鏈接計算機網絡中不同機器上的文件。此時,僅需提供文件所在機器地址和該機器中文件的路徑。

缺點:鏈接文件需要耗費額外的存儲空間,多耗費一次路徑查詢的開銷,並可能產生“死鏈”。

2動態共享

文件的動態共享是指系統中,不同用戶的進程或者同一用戶的不同進程併發地訪問同一個文件,這種共享關係只有當進程存在時纔可能出現,一但進程消亡,其共享關係自動消失。

兩個需求:兩個進程能夠協同完成同一任務;兩個進程希望獨立地讀、寫這個文件。區別是是否通過文件的讀/寫指針。

用戶打開文件表-->系統打開文件表---->活動inode表的三層關聯。如果兩個進程共享文件時希望共享讀/寫指針,兩進程的用戶打開文件表中的表項只要指向同一個系統打開文件表表項即可。因爲該表項中含有讀/寫指針。

如果兩個進程共享時不希望共享讀/寫指針,兩進程的用戶打開文件表中的表項需要指向不同系統打開文件表中的表項,並且這兩個系統打開文件表的表項要指向同一個inode。

5 linux文件系統

虛擬文件系統(VFS)是linux內核的一個子系統,提供了一個通用文件系統模型,該模型概括了所能見到的文件系統常用功能和行爲,併爲應用程序提供一致性的文件系統接口。

VFS可以分爲三層:應用層、虛擬層、實現層。實現各種具體文件系統的細節,每一個都是自包含的,包含文件系統實現的各種設施,如超級塊、節點區、數據區以及各種數據結構和文件類的操作函數。

LINUX虛擬文件系統VFS採用面向對象的設計思想,文件系統中定義的VFS相當於面向對象系統中的抽象基類。但從效率考慮內核純粹使用C語言編程,故並沒有直接利用面向對象的語義。實際上是結構體,但它代表的確實是一個對象。

VFS虛擬文件系統模型由4個對象類型組成:

超級塊(super block)對象:代表一個文件系統。存放已安裝的文件系統信息。每個文件系統都對應一個超級塊對象。

索引節點(inode)對象:代表一個文件,存放通用的文件信息。每個文件都有一個inode對象。

目錄項(dentry)對象:代表路徑中的一個組成部分。存放目錄項與對應文件進行鏈接的各種信息。VFS把最近常使用的dentry對象放在目錄項高速緩存中,加快文件路徑名搜索過程,以提高系統性能。

文件(file)對象:代表進程中已打開的一個文件。存放已打開的文件與進程的交互信息,這些信息僅當進程訪問文件期間才存於主存中。文件對象在執行系統調用open()時創建,執行系統調用close()時撤銷。

每個主要對象都包含一個操作對象,它描述了內核針對主要對象可以使用的方法:

super_operation對象。其中包括內核針對特定文件系統所能調用的方法。

inode_operation對象。其中包括內核針對特定文件所能調用的方法。

dentry_operation對象。其中包括內核針對特定目錄所能調用的方法。

file_operation對象。其中包括進程針對已打開文件所能調用的方法。

a超級塊對象

VFS超級塊是各個具體文件系統安裝時才建立的,並在這些具體文件系統卸載時自動刪除,可見VFS超級塊僅存於主存中。

b索引節點對象

inode對象中包含了內核在操作文件或目錄時需要的全部信息,文件名可以更改,但inode對文件時唯一的,且隨文件的存在而存在。

c目錄項對象

VFS把每個目錄看做一個文件,引入dentry主要目的是對目錄進行緩存,加快對文件的快速定位,改進文件系統效率。dentry結構代表邏輯意義上的文件,描述文件的邏輯屬性,它在磁盤上並沒有進行對應的映像;而inode結構代表物理意義上的文件,記錄文件的物理屬性,它在磁盤上有對應的映像。

d與進程相關的文件結構

1)系統打開文件表 ——file結構

每個文件都用一個64位數字來表示下一個讀寫的字節位置,通常它爲文件位置或偏移量。file結構除保存文件當前位置外,還把指向該文件inode的指針也放在其中,並形成一個雙向鏈表,稱系統打開文件表。每當打開文件時,就要創建一個file結構。文件對象的創建和釋放是通過slab分配器實現的。

與文件關聯的方法就是文件操作對象,這些操作由file_operation結構來描述:主要功能函數爲:llseek()修改文件指針;read()從文件的偏移處讀出若干字節;write()向文件指定偏移處寫入若干字節;aio_read()以異步方式從文件偏移處讀出若干字節;mmap()文件到主存的映射;open()打開一個文件;ioctl()向硬件設備發送命令;flush()關閉文件時刷新文件;release()釋放文件對象;fsyns()將文件在緩衝的數據寫回磁盤。

2)用戶打開文件表——file_struct

文件描述符fd用來描述打開的文件,每個進程用一個file_struct結構來記錄文件描述符的使用情況,這個結構稱爲用戶打開文件表。指向該結構的指針被保存在進程的task_struct結構的成員files中。

3)根目錄和當前工作目錄——fs_struct

當程序通過文件名訪問一個文件時,內核首先通過遍歷文件系統樹找到相對應的目錄,然後在該目錄中找到該文件名和存放它的inode號。有了inode號也就確定了文件在磁盤上的物理位置。爲了進行文件查找,每個進程都有一個當前工作目錄和當前工作目錄所在文件系統的根目錄。這是進程狀態的一部分,以便用戶既可以使用相對路徑名也可以用絕對路徑名來訪問索要的文件。

絕對路徑名纔可以唯一地指定一個文件,絕對路徑名要求給出在目錄樹中從目錄訪問文件的路徑上的所有節點。

5、linux文件系統的邏輯結構

LINUX中的每個進程都有兩個數據結構來描述進程與文件的相關信息,一個進程所處的位置時由fs_struct結構來描述,他包含兩個指向VFS dentry的指針,分別指向根目錄節點(root)和當前目錄節點(pwd);而進程打開的文件是由file_struct結構來描述,最多能同時打開的文件爲OPEN_MAX(默認256)個,由fd[0]~fd[255]所表示的指針指向對應的file結構。

5.5.5proc文件系統

/proc形成了一個特殊的文件系統,該文件系統的類型即爲proc內核通過proc文件系統將一些信息輸出給用戶。/proc目錄下每個文件的讀寫都可以綁定到一個內核函數上。用戶通過proc文件系統可以瞭解進程的地址空間信息、系統的硬件信息、系統的中斷信息和系統的I/O信息。在proc文件系統中,大多數文件都是隻讀的,用戶只能從這些文件中讀取內核中的信息。但也有一些proc文件被設置成可寫,用戶就可以通過這些proc文件將參數傳遞給內核。

在proc文件系統中,代表各個文件節點的是proc_dir_entry結構,管理着從操作系統的用戶空間到內核空間對文件讀寫的驅動。在系統初始化時,主要的工作就是建立proc文件系統樹。由於proc文件系統沒有外部設備,只存在內存裏,因此在讀操作時,不像其他文件系統那樣從外存中讀取inode信息,而是從proc樹種讀取inode信息,然後再調用Inode中登記的函數,動態地從內核讀取所需要的信息。

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章