1. 程式人生 > >作業系統--檔案系統

作業系統--檔案系統

一、檔案

檔案系統出現是為了解決多使用者儲存、管理資訊時出現的問題。使用者所有的操作都是基於邏輯檔案的,檔案系統最終需要將使用者對邏輯檔案的操作轉換成對物理檔案的操作。物理檔案可以是在儲存裝置上的儲存區域,也可以使一個裝置、管道、套接字,檔案系統將使用者對檔案的操作轉換成使用者對裝置的操作、使用者間的通訊操作和網路操作。

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中登記的函式,動態地從核心讀取所需要的資訊。