淺談儲存一個檔案操作內部發生了什麼

小弟季義欽發表於2012-11-09

比如新建一個word,寫了一行字,然後點選儲存。

發生了什麼?這個資料會不會馬上寫到磁碟上?

1 檔案系統:

檔案系統是一套實現了資料的儲存、分級組織、訪問和獲取等操作的抽象資料型別(Abstract data type)。

檔案系統是一種用於向使用者提供底層資料訪問的機制。它將裝置中的空間劃分為特定大小的塊(扇區),一般每塊512位元組。資料儲存在這些塊中,大小被修正為佔用整數個塊。由檔案系統軟體來負責將這些塊組織為檔案和目錄,並記錄哪些塊被分配給了哪個檔案,以及哪些塊沒有被使用。檔案系統各式各樣,如fat,ntfs,ext2,ext3等。

核心中檔案系統會將虛擬檔案系統中的檔案操作,轉換成塊IO操作。

2 虛擬檔案系統:

為了向使用者空間提供一個統一的檔案系統介面。出現了虛擬檔案系統。Linux中的虛擬檔案系統由四個資料結構來表示,其中最主要的是表示檔案的索引節點inode。inode描述了操作檔案和目錄所需的所有屬性資訊以及方法。其方法對應於核心中檔案系統的系統呼叫。比如你的終端(或者英語程式)中使用mkdir命令,這個命令會呼叫system call是symlik(),然後這個系統呼叫會呼叫inode節點的mkdir(struct inode *dir,struct dentry, int mode)方法來真正建立一個檔案。

3 塊裝置驅動:

塊裝置驅動只處理塊IO操作。

一個塊IO操作請求由很多bio組成,bio又是由bio_vec段陣列組成,bio_vec是記憶體中的“片段”。

有了上面知識,我們就可以知道這樣一個大概流程:

(1) 首先新建word檔案,寫了一行字,點選儲存,會呼叫對應的檔案建立,資料讀寫等使用者空間的API

(2) 這些application的API會呼叫核心空間的系統呼叫system call

(3) 這些system call會呼叫虛擬檔案系統的統一的檔案操作介面。如mkdir,create,readlink等函式。

(4) 核心中具體的檔案系統EX2,EX3等會將虛擬檔案系統的檔案操作轉換成對應的塊IO操作

(5) 這些塊IO操作請求會先在cache中檢視對應的塊是否在cache中,如果在的話,直接讀取/修改cache中的塊即可。否則將告知驅動程式處理這個快IO請求,真正將資料寫到磁碟,或者從磁碟讀取資料。

相關文章