操做系統的主要幾大管理系統,如進程管理調度系統、內存管理系統、文件系統。在咱們平時使用操做系統的過程當中,咱們接觸最多的就是文件系統。由於咱們平時不管工做仍是生活,咱們都要編輯文件 建立文件 來記錄具體的工做或事情。下面我們就說一下文件系統,咱們仍是從外部使用與內部實現兩部分來分開講。node
咱們知道咱們操做系統內核的外面也就是用戶空間下,咱們是經過系統調用來使用操做系統提供的功能的,如讀取數據包 建立文件等等。那下面咱們簡單的介紹一下關於文件和目錄的系統調用,不管是咱們平時使用某類高級語言的函數仍是使用shell命令,它們只是封裝了這些系統調用來完成功能,因此咱們要知道或瞭解這些系統調用。linux
文件系統調用shell |
|
Fd=create(fileName,mode);緩存 |
建立文件系統調用(文件名,權限狀態位)網絡 |
Fd=open(filename,how);函數 |
打開文件 (文件名,模式(讀or寫))性能 |
Close(fd)spa |
關閉一個文件,意味着對一個文件的操做所有結束操作系統 |
N=read(fd,buffers,nbytes)設計 |
讀取文件(文件句柄,緩存區,讀取的字節大小) |
N=write(fd,buffer,nbytes) |
把數據從緩衝區寫入文件(文件句柄,緩衝區,要寫入的字節數) |
Position=lseek(fd,offset,whence); |
移動文件指針 |
S=stat(name,&buf) |
獲取文件狀態信息 |
S=fstat(fd,&bug); |
獲取文件狀態信息 |
關於目錄的系統調用 |
|
S=mkdir(path,mode) |
建立目錄(目錄路徑,權限) |
S=rmdir(path) |
刪除目錄 |
S=link(oldPath,newPaht) |
建立指向已有文件的連接 |
S=unlink(path); |
刪除已有連接 |
S=chdir(path) |
改變工做目錄 |
Dir=opendir(path); |
打開目錄 |
S=closedir(dir) |
關閉目錄 |
dirInfo=readdir(path); |
讀取目錄項 |
下面咱們以linux下ext2文件系統來講一下文件系統的內部實現。
咱們首先看一下磁盤的分區示意圖.
引導區(啓動時讀取哪一個分區上的操做系統) |
分區表(記錄各個分區的位置) |
分區一 |
分區2 |
分區3 |
再看一下每一個分區下的數據塊
超級塊(記錄了文件系統的類型,包含的i節點的個數、磁盤塊數、以及空閒塊鏈表的其實位置) |
組描述符(存放了空閒塊位圖以及i節點位圖的位置、目錄的個數) |
塊位圖用來記錄空閒塊的位置 |
I節點位圖用來記錄空閒i節點 |
I節點存儲區 |
數據存儲區 |
由於文件系統要知道全部文件的屬性信息,好比做者 保護狀態 大小 類型,還要知道文件數據在磁盤上的實際存儲位置,因此還要記錄一個文件所佔用的磁盤塊。不管是採用鏈表或者位圖來存儲一個硬盤上的文件和目錄信息,都是要耗費很多的磁盤空間和內存空間(由於在文件修改或建立時是要根據記錄來分配空間的),磁盤越大,文件或目錄項或空閒塊就越多。爲了解決這個問題,這些操做系統的設計者就想出了這個i節點的注意,而且很好的在文件系統上實現和應用了。這樣在內存中就沒必要存儲全部文件的位置信息了,須要打開哪些文件就將那些文件的i節點存儲到內存中便可,咱們平時用到打開文件的函數,也就是將文件的i節點信息裝入內存。Stat等獲取文件信息的函數或系統調用其實也是讀取i節點返回的結果。
每一個節點都有一個節點號,不管目錄仍是文件都有一個單獨的節點,都是一個單獨的小文件,這裏面記錄了文件類型,是文件仍是目錄仍是可執行文件,還記錄了一些屬性信息 如大小 做者修改時間等。每個文件或目錄都有一個節點,因此當咱們要打開或定位到一個文件時,咱們首先要找到第一個目錄,在linux下每一個目錄下都有.和..,.的意思是當前目錄,這個裏面記錄了當前目錄的節點號,..的意思是上一級目錄,記錄了上一級的目錄的節點號,。
因此不管是咱們採用絕對路徑仍是相對路徑,咱們都要一級一級的找到目錄的節點號,而後讀取i節點信息,這個i節點若是是目錄裏面就會存有這個目錄下的目錄名稱或文件名稱以及對應的i節點號,獲得i節點號讀取i節點而後繼續尋找目標文件,直到最後找到目標文件的i節點號,讀取節點信息裏面的磁盤塊位置,獲取文件的內容。
操做系統根據文件中空間塊位圖以及i節點位圖來分配和回收文件的建立和消除的存儲分配。
爲了防止因爲系統崩潰或電源忽然中斷致使正在進行的文件操做中斷所形成的數據丟失,ext2文件系統就必須在每一個數據塊建立或修改後即刻寫入磁盤。磁盤的尋道操做對於cpu來說是如此的之長,爲了提升性能,因此寫操做數據被緩存,寫操做被延遲。但這樣也帶來了數據丟失的風險,假如數據還沒來得及寫入磁盤,電源忽然中斷,數據將會丟失。爲了解決這個問題,因此有了ext3文件系統。
Ext3其實只是ext2文件系統加上了一個日誌維護功能,加強了文件系統的健壯性。每個磁盤操做都會將其具體的操做位置以及數據記錄到日誌裏。當發生系統崩潰或電源中斷時,再次啓動時,文件系統會比對日誌與磁盤是否一致,不一致則根據日誌來完善操做。這也是當系統崩潰後,咱們再次啓東時,硬盤要自檢的緣由。
網絡功能在linux中佔據着不可動搖的地位,固然文件系統也要強大到支持非本地文件系統。其實網絡文件系統就是在linux操做系統下,將遠程機器上的目錄掛載到本地的文件系統上,首先遠程機器會檢查客戶機器的掛載請求以及權限驗證,經過則將本身的文件系統類型以及被掛載目錄的i節點信息組成的一個惟一標識放到本地。當本地有對此文件操做時,文件系統就會檢查當前被掛載的目錄是本地文件系統仍是網絡文件系統。若是是網絡文件系統,則經過網絡文件系統協議發送讀取文件或者打開文件的請求,包含文件名以及讀取的位置或要寫入的數據或位置,而後遠程機器返回相應。
其實在上面說網絡文件系統時,咱們就已經提到了。那個檢查要操做的文件是本地仍是遠程的文件系統就是虛擬文件系統,咱們全部的文件系統調用都應用到這個系統裏,這個文件系統包含本地文件系統處理辦法和遠程文件處理辦法,好比當檢測是本地文件,則使用本地文件系統不管是ext2仍是ext3進行操做,若是是網絡文件,則採用當前文件的網絡文件系統協議進行通訊完成操做,這樣咱們就沒必要去關心文件是在本地仍是在遠程,是在內存仍是在磁盤上。
文件系統的工做就是幫咱們完成文件在磁盤上的存儲功能,並且是高效的、節約的。最後仍是那句話,不管是什麼技術,都是一步一步的完善的,剛開始的文件系統就是在磁盤上連續分配,後來一步一步的改良,到達如今的局面。如今咱們有了更加健壯的文件系統 有了更加快速的內存文件系統 還有更方便的網絡文件系統。還有另外一個更重要的就是磁盤陣列來分散讀寫請求以及實時備份數據。