一、為何需要文件系統?
磁盤具有大容量、低成本以及持久化的特點,即使發生斷電,磁盤上的數據也不會丟失。但是,對於一般用戶而言,使用磁盤是非常苦難的,因為他們不知道如何驅動一個磁盤,以及計算數據在磁盤上的存放位置。從上一篇《磁盤基礎》可以知道,了解磁盤的各項技術細節將使用戶不堪重負。
操作系統是一個魔術師,其提供給用戶的就是各種幻想:抽象。進程抽象的是CPU,虛擬內存抽象的是內存,對於磁盤來說,操作系統提供給用戶的幫助就是在磁盤外面包裹一層容易使用的抽象,用戶直接與這層抽象打交道,而無需了解磁盤的技術細節。在操作系統中,這層為磁盤提供的抽象就是:文件系統。
二、文件系統的基本概念
2.1 文件系統是什么
文件系統是操作系統為磁盤和用戶之間提供的一個抽象,它是一個子虛烏有的,看不見摸不着的接口,如下圖所示:
(1)文件系統使得用戶能夠很方便的使用磁盤:將用戶從數據存放的細節中解放出來,用戶不需要知道內容存放在什么地方,也不需要知道如何存放,更不需要知道磁盤到底是如何工作的。
(2)簡單地說,文件系統將其接觸的磁盤物理特性轉換為用戶看到的路徑名和文件名。用戶對磁盤進行訪問只需要給出文件名和路徑名即可,而無需知道磁柱、磁道、扇面、數據塊等信息。
(3)文件系統的主要特性就是存儲大量的信息,多個進程可以同時訪問一個文件,進程結束也不會影響文件的持續存在。
2.2 文件系統的目標
(1)地址獨立
一個文件在產生的時候無需擔心其存放的磁盤地址,即文件數據的產生與文件將來存放的磁盤地址相互獨立。
(2)地址保護
地址保護需要對文件的訪問進行一定的限制,即不是任何人都可以訪問任何文件。
Difference:文件系統的地址保護與內存管理下的地址保護不同,內存管理下地址保護指的是一個進程不能訪問另一個進程空間,而文件系統下的地址保護不是一個文件不能訪問另一個文件空間,而是一個文件的訪問時有限制的。
2.3 文件的基本知識
(1)文件命名
文件名可以便於訪問一個文件,這個文件名既可以是英語名、中文名,也可以是圖像名。當用戶給出一個文件名,操作系統就可以根據這個名字找到對應文件的內容。具體來說,就是找到該文件存放在磁盤上的所有數據塊。
操作系統將文件名翻譯為其數據塊在磁盤上存放的地址,由於磁盤的尋址單位是扇面,而這些磁盤地址實際上就是一個個的扇面號。
(2)擴展名
擴展名通常用來表明文件的類型,如何文本文件、二進制文件等等。例如:file.c 表明該文件是一個C語言的源文件。擴展名對文件類別的指示僅僅是指示性的,並不具有強制性。
(3)內容尋址
除了給出文件名外,還可以給出文件的內容,供操作系統查找使用。數據庫系統是這種實現方式的典型應用。
(4)文件訪問
①順序訪問:從開頭開始訪問,按照先來后到的順序讀取數據。
②隨機訪問:可以按照任意順序讀取數據記錄,就像我們看DVD一樣可以隨機選擇想要觀看的段落。
(5)文件屬性
每個文件除了一個文件名外,還有許多信息也是我們感興趣的,所以,文件還擁有一些屬性。不同的操作系統,文件的屬性種類和數量都不同,但每一種屬性都有自己的用途,下表列出了常見的文件屬性:
(6)文件操作
可以對文件進行操作有:創建/刪除、打開/關閉、讀寫添加、尋找訪問位置、讀取屬性/設置屬性、重命名等等。
三、文件夾實現地址獨立
3.1 為何要有文件夾
我們可以對文件進行讀寫操作,那么給一個文件名,操作系統是如何知道從什么地方讀取文件內容的呢?換句話說,文件在磁盤上的什么位置,操作系統是如何知道的呢?這需要一個數據結構來記錄每個文件在磁盤上的地址,這個數據結構就是文件夾。
文件夾也稱為目錄夾(Folder),它的角色就是跟蹤文件,里面存放的是從文件到文件所在磁盤的地址的映射,即“文件名→文件所在磁盤上的地址”。文件夾對於文件來說,就相當於從虛擬地址到實際地址的一種翻譯機制。
3.2 文件夾結構
由於文件夾里面可以有子文件夾,因此就形成了一個層次結構,這個層次結構的頂端就是根文件夾(也稱為根目錄),如下圖所示:
根目錄是一個文件系統的總起點,它在操作系統啟動的時候加載到內存。從根目錄開始,該文件系統里面的所有文件都可以找出來。
四、文件系統的調用
4.1 操作系統提供的“接口”
操作系統為用戶提供的文件系統接口就是文件系統調用,用戶可以在程序中通過這些系統調用來對文件系統進行讀寫操作。這些系統調用包括:打開文件、關閉文件、讀文件內容、寫文件內容等等。
4.2 文件系統調用實例
下圖展示了一個C語言編寫的使用文件系統調用實現文件拷貝的簡單實例程序:
上述文件拷貝程序實現的是打開源文件和目標文件,然后循環往復地將源文件內容讀取到一個緩沖區,然后將緩沖區的內容寫到輸出目標文件里。當拷貝結束后,關閉源文件和目標文件。
參考資料
鄒恆明,《操作系統之哲學原理》,機械工業出版社