操作系統4-文件系統
文件
-
文件是計算機系統中信息存放的一種組織形式
-
文件的分類
- 普通文件:如保存在磁盤上的c文件,可執行文件,以及目錄等。這種文件的特性是數據在存儲設備上存放,內核提供了對數據的抽象訪問。
- 字符設備文件:一種能夠像文件一樣被訪問的設備,如控制台,串口等。
- 塊設備文件:磁盤是此類文件的經典代表,操作系統對這種數據的訪問進行重新的格式設計。
- socket文件:Linux通過網絡進行通信的方式,對網絡的訪問可以通過文件描述符的抽象實現,訪問網絡和訪問普通文件類似,進程通過對socket文件讀寫來實現消息的傳遞。
Linux對於這些文件的訪問時類似的,因為Linux強大的虛擬文件系統(VFS)為這些文件提供了一套統一的API。
-
文件的性質
- 普通文件
- 目錄文件:記錄目錄裡面的文件列表信息
- 設備文件:把設備作為文件管理和使用(typical Linux)
-
文件屬性:指定文件的類型、操作特性和存取保護等信息,存放在文件所在目錄的目錄文件中。
MS-DOS系統中:文件屬性佔目錄的一個字節
-
文件結構
- 邏輯結構:強調文件信息項的構成方式和用戶的存取方式
- 記錄式文件:文件頭要包含文件的各種控制信息和說明信息
- 流式文件:只有文件的內容,沒有額外的內容。現在操作系統都是流式文件,由應用程序解釋和處理文件。
- 物理結構:文件在存儲設備上的存儲結構
- 邏輯結構:強調文件信息項的構成方式和用戶的存取方式
-
文件存取
- 順序存取:文件讀取時,讀寫指針指向第一個信息項
- 隨機存取:存取操作時指定存取的位置。
文件物理結構
-
連續文件:文件按邏輯塊的順序存放在硬盤連續的物理存儲塊中。
文件目錄記錄文件的長度和第一個存儲塊的塊號。
缺點:不利於文件的動態增長,不利於文件的插入和刪除。
-
索引文件
不連續地存儲在物理塊中,文件目錄記錄文件的邏輯塊和物理塊之間的對應關係。
顯然索引文件結構比連續文件結構更加適合更加頻繁更改的文件。
-
串聯文件(索引順序文件)
不連續地存儲在物理塊中,每個存儲塊有一個指針指向下一個存儲塊。
不利於文件的隨機存取。
串聯文件的應用:FAT文件系統
-
直接文件
根據給出文件的鍵值直接給出文件的物理地址。
-
哈希文件
使用最為廣泛的直接文件。通過Hash函數將鍵值轉換為一個目錄表目的相應指針,表目的內容則是指向相應記錄的物理塊。
FAT文件系統(File Allocation Table)
-
文件分配表(FAT表)
FAT系統應用了串聯文件的結構,但是將每個文件的next指針統一地有序地存儲在了一個表中,稱為FAT表。
訪問方式:如果當前的存儲塊號是i,那麼下一個存儲塊的地址就是FAT(i)。
所以可以說FAT系統巧妙地結合索引和串聯系統的特點。
-
扇區
磁盤上最小的可尋址的存儲單元(512字節)
-
簇(cluster) = 存儲塊
設備的最小存取單元,固定數量的扇區
示例:
- 369KB硬盤:簇 = 2個扇區(1024字節)
- 2GB硬盤:簇 = 64個扇區(32KB)
一般硬盤容量越大,簇包含的扇區數量越大。
FAT元素數目和簇的數目一致,FAT元素的寬度與可以標識的簇的數量的關係為(2^n)。
磁盤容量 = FAT長度 * 簇扇區數 * 扇區大小
常說的FAT16文件系統就是說FAT表支持的最大的元素寬度為16位,能標識的簇容量為(2^{16})位。通過FAT長度計算出來磁盤容量就是FAT支持的最大磁盤分區容量。
-
FAT16格式化的磁盤
啟動扇區 FAT1 FAT2 根目錄 其他目錄和文件 FAT1和FAT2的內容一致,為了防止被破壞而有一個備份。
存儲空間管理
記錄磁盤使用情況,管理和分配、回收存儲空間
-
空閒空間表
- 空閒文件:把連續空閒區看成一個特殊文件
- 空閒文件目錄:每個表項對應一個空閒文件,記錄有第一個空閒塊號,空閒塊個數和響應的物理塊號。
-
空閒塊鏈
把所有的空閒塊鏈接在一起,當申請者需要空閒塊時,從鏈頭開始搜索空閒塊直到遇到合適的空閒塊。回收空間時,把釋放的空閒塊逐個加在鏈尾。這個和內存管理的機制是一樣的。
-
空闲塊成组链接法
Linux采用这个方法克服了空閒空間表和空閒塊鏈均有的表太長的缺點
-
空閒盤塊的組織
- 將文件區的所有空閒盤塊依次進行分組。如將100個空閒塊劃分成一組,将組中的第1塊設為組長塊,第1組為99塊,以後的都是100塊,最後剩下的為1組。
- 將每一組的盤塊總數和該組所有的盤塊號放入後一組的“組長塊”中,每一組的第一個盤塊構成一條鏈。
- 第一組只有99個盤塊,但是仍然記為100,第2組的組長塊記其為0號,作為空閒盤塊結束的標誌。
- 將最後一組的盤塊總數和空閒盤塊和空閒盤塊好存入空閒盤塊專用棧中,空閒盤塊的分配和回收都在這個棧中進行。
-
空閒盤塊的分配
分配空閒盤塊時,專用棧的棧深減一,並作為索引取出分配的盤塊。如果索引減到了0,則需要先將盤塊中的信息存入另外的棧中才能分配。如果這還是第2組的盤塊,說明接下來只有99個盤塊用了。所有盤塊用完後,接下來的進程只能等待。
-
空閒盤塊的回收
若空閒盤塊專用棧沒有滿,那麼將要回收的空閒盤塊的盤塊號壓入棧,棧深+1。如果棧滿了,那麼需要本棧的信息(棧深值和個空閒塊號)放入回收塊中,將其作為一個新的分組的組長塊。再將專用棧的棧深和盤塊號清零。
-
-
位示圖
從內存中劃出若干個字節,每個bit表示一個存儲塊空閒或佔用。1表示空閒。
文件目錄管理
-
文件控制塊
文件控制塊(FCB):通常由基本信息、存取控制信息和使用信息組成。
- 基本信息:
- 文件名
- 文件類型
- 文件物理地址:文件在外存的物理位置和範圍,包括文件的設備名、在外存的起始地址和文件長度
- 文件的邏輯結構:指明文件是記錄式文件或者流式文件等。
- 文件的物理結構
- 基本信息:
-
索引節點
-
索引節點的引入
在之前的文件系統中,檢索文件的時候需要將文件的全部信息都調入內存,但是進行比對的只有文件名,所以Linux為了避免系統在檢索文件的時候將整個文件都調入內存。將文件名和文件信息實現了分離,文件的描述信息單獨構成一個節點,稱為索引節點,簡稱I節點。
於是文件目錄中的每個目錄項僅由文件名和指向該文件名所對應文件的索引節點的指針構成。在Linux中,一個目錄項佔16B,文件名佔14B。
-
磁盤索引節點
存放在磁盤上的索引節點,每個文件有唯一的磁盤索引節點。
包含了文件的一些基本信息
-
內存索引節點
每次文件打開時,要將磁盤索引節點複製到內存索引節點中,便於以後使用。內存索引節點包含:
- 編號
- 狀態:指示該節點是夠已被修改或上鎖
- 訪問計數:計數訪問的進程數量
- 鏈接指針:指向空閒鏈錶和散列隊列的指針
- 邏輯設備名:含有該文件的文件系統的邏輯設備名。
-
-
文件目錄
記錄文件名和存放地址的目錄表
具有將文件名轉換為物理地址的功能
還記錄有文件屬性
-
目錄文件:文件目錄以文件形式存與外存,這個文件叫做目錄文件。
-
目錄結構
不同系統的結構不一樣
- DOS系統(32字節):文件名 擴展名 屬性 保留 時間日期 首塊號 大小
- Unix
- 索引節點
- 文件名
文件共享和安全性
-
文件的共享
-
連接法
在樹形結構目錄中,當有多個用戶要共享目錄或文件時,必須將共享文件或子目錄鏈接到兩個用戶的目錄中,此時文件系統的目錄結構是非循環樹形目錄結構
建立連接的思想就是用一個文件目錄項直接指向要共享文件的目錄項,目錄項中包含的就是索引節點的指針,如同C語言中新建一個指針指向同一個地址。
在Linux系統中,對文件的連接命令就是ln,格式為:
ln <帶路徑指引的文件名稱> <帶路徑指引的目錄名稱>
如果要刪除有鏈接的文件,則必須將其鏈接的所有目錄下的該文件都刪除才能徹底刪除。這個方法可以用來防止誤刪一些文件。
但是無法對目錄創建應鏈接,因為如果要對一個目錄創建硬鏈接,意味著目錄下面所有的文件都要創建響應的鏈接,這將是一個相當大的工作量。
順便說一下Linux下的軟鏈接(Symbolic link):Symbolic link就是創建一個獨立的文件,而這個文件會讓數據的讀取指向它link的那個文件的文件名。其link的文件再鏈接到正確的iNode。
Linux中創建軟鏈接的格式為:
ln -s <帶路徑指引的文件名稱> <帶路徑指引的目錄名稱>
-
Linux文件系統
-
虛擬文件系統VFS
Virtual File System是Linux內核的一個軟件層,用於給用戶空間的程序提供文件系統接口,它允許不同的文件系統共存。
-
EXT2
Linux最常用的文件系統。
-
EXT2磁盤佈局
由邏輯塊組成,分為引導塊、超級塊、inode區及數據區。
-
對於Linux中的文件系統,這篇文章講解得非常清楚,感興趣的可以了解一下:https://www.cnblogs.com/f-ck-need-u/p/7016077.html