操作系統 --- 虛擬文件系統

1、虛擬文件系統的分層結構

在這裏插入圖片描述
上層:虛擬文件系統
底層:特定文件系統模塊,例如:網絡文件系統(nfs、smb)等其他類型文件系統

虛擬文件系統的目的:將接口暴露給用戶,屏蔽底層文件系統的差異性,它是對所有不同文件系統的抽象

虛擬文件系統的功能: 
- 提供一致的文件和文件系統接口 
- 管理所有文件和文件系統關聯的數據結構 
- 高效查詢例程,遍歷文件系統 
- 與特定文件系統模塊的交互
基本數據結構: 
- 卷控制塊,總的,superblock,每個文件系統一個,塊,塊大小,空餘塊,計數/指針等 
- 文件控制塊:VNODE/INODE, 單個文件一個,文件的詳細信息 
- 目錄節點:dentry(dictionary entry),每個目錄項一個,將目錄項數據結構及屬性佈局編碼成樹型數據結構

在這裏插入圖片描述數據持續存儲在二級存儲中,當需要時加載進內存。

二級存儲(secondary storage,auxiliary storage)是計算機主存儲器或內存之外的所有可訪問數據存儲器。即爲硬盤、磁帶、光盤等非易失性存儲。
  • 卷控制塊:文件系統掛載時進入內存
  • 文件控制塊:文件被訪問時進入內存
  • 目錄節點: 在遍歷一個文件路徑時進入內存

2、數據塊緩存

如今緩存的概念已被擴充,不僅在CPU和主內存之間有Cache(L1 cache、L2 cache),而且在內存和硬盤之間也有Cache(磁盤緩存),乃至在硬盤與網絡之間也有某種意義上的Cache──稱爲Internet臨時文件夾或網絡內容緩存等。凡是位於速度相差較大的兩種硬件之間,用於協調兩者數據傳輸速度差異的結構,均可稱之爲Cache。

我們這裏說的數據塊緩存是磁盤緩存!
數據塊就是block塊,它是主存和外存傳輸數據的單位,文件存取的最小單位

#緩存過程:
數據塊按需讀入內存,數據塊使用後被緩存
#兩種數據塊緩存方式,緩存的粒度不同
普通緩衝區緩存
頁緩存:統一緩存數據塊和內存頁

文件數據塊的頁緩存

在虛擬內存中文件數據塊被映射成頁
文件的讀/寫操作被轉換成對內存的訪問
可能導致缺頁、髒頁
相應算法,儘量減少對硬盤的讀寫次數,類似之前的算法

在這裏插入圖片描述

3、打開文件的數據結構

我們先看一段python代碼:

fd = open('db.txt',mode='rt',encoding='utf-8') 
res = fd.read()
print(res)
fd.close()

上述代碼是一段用於文件操作的代碼。
打開文件的過程:fd是文件描述符(又叫文件句柄、文件對象),open一個文件,就會產生一個文件描述符,然後將該文件描述符存入打開該文件的進程的打開文件表。

#文件描述符
	每個被打開的文件一個
	文件狀態信息
	目錄,當前文件指針。。。。
#打開文件表 
	一個進程一個(進程打開文件表又叫文件描述符表)
	一個系統級的(系統打開文件表)
	每個超級區塊也會保存一個列表,進程打開文件的基本信息 #這個不是很明白!我猜測前面的系統打開文件表應該是虛擬文件系統的打開文件表,不論nfs、smb、ext2所有的打開文件的情況裏面都有。每個superblock的文件打開表,例如nfs,應該就只是nfs文件系統的打開文件表。

文件描述符表、系統打開文件表、inode之間的關係如圖所示:
在這裏插入圖片描述文件偏移量:即爲文件指針的偏移量,每一個文件被打開之後,內核都維護一個所謂的當前文件位置偏移量,讀和寫操作都會對這個偏移量產生影響。

如果不懂文件指針就看這個博客:https://blog.csdn.net/weixin_44571270/article/details/105891195

inode和文件描述符之間的關係:

在linux中,內核通過inode來找到每個文件,但一個文件可以被許多用戶同時打開或一個用戶同時打開多次。這就有一個問題,如何管理文件的當前位移量,因爲可能每個用戶打開文件後進行的操作都不一樣,這樣文件位移量也不同,當然還有其他的一些問題。所以linux又搞了一個文件描述符(file descriptor)這個東西,來分別爲每一個用戶服務。每個用戶每次打開一個文件,就產生一個文件描述符,多次打開就產生多個文件描述符,一一對應,不管是同一個用戶,還是多個用戶。該文件描述符就記錄了當前打開的文件的偏移量等數據。

#所以一個i節點可以有0個或多個文件描述符與之對應。可以看成文件描述符是對i節點的索引。

4、文件分配

爲應對不同大小的文件,如何爲一個文件分配數據塊呢?

#分配方式
	連續分配
	鏈式分配
	索引分配
#評價指標:
	時間高效
	空間高效

(1)連續分配
I:文件頭
在這裏插入圖片描述上圖中數據塊的分配都是連續的。因爲是連續的,如果再往文件寫內容,那麼我們看A文件內容還能加多少?所以它一般用於寫文件。
優點:文件讀取表現好,高效的順序和隨機訪問
劣勢:碎片,文件增長問題(預分配,按需分配),類似數組 (長度不可變)
注意這種模式:最好用於只讀文件

(2)鏈式分配
在這裏插入圖片描述以數據塊鏈表方式存儲,文件頭包含了到第一塊和最後一塊的指針
訪問鏈表中間一個數,是需要對鏈表進行遍歷的,所以不可隨機訪問。
優點:創建,增大縮小容易,沒有碎片
缺點:不可隨機訪問,可靠性(破壞一個鏈然後整個文件都崩了)

(3)索引分配
在這裏插入圖片描述IB:索引數據塊
每個磁盤塊(索引項),爲每個文件創建一個名爲索引數據塊的非數據數據塊(到文件數據塊的指針列表)
文件頭包含了索引數據塊
優點:創建,增大縮小都很容易,沒有碎片,支持直接訪問
缺點:當文件很小時,存儲索引的開銷,如何處理大文件?
釋意:文件大,佔用數據塊就多,那麼相對的索引數據就變大了,我們一個索引數據塊就不夠用了,所以我們需要多個索引數據塊

大文件採用分層的方式,類似內存管理的思想: 
- 鏈式索引塊 
- 多級索引塊,文件頭包含多個指針 #類似多級頁表

在這裏插入圖片描述

5、空間列表

空間列表的作用:跟蹤在存儲中的所有未分配的數據塊,爲了更好的分配空閒塊。
用位圖代表空閒數據塊列表
11111001111,如果i = 0 代表數據塊爲空閒

假設空閒空間在磁盤中均勻分佈,那麼找到空閒數據塊前需要掃描n/r
n —-磁盤上數據塊的總數
r —- 空閒塊的總數

爲了保護空間列表和實際空閒塊的位置的一致性:

位圖必須保存在磁盤上
不允許block在內存中的狀態爲1而在磁盤中爲0 ,這種不一致情況發生,因此需要在硬盤中完成把位圖中的相應空閒塊置爲1之後再真正爲文件分配數據塊,文件內容寫入數據塊

空間列表的實現方式:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章