linux的虚拟文件系统VFS
本文將描述Linux內(nèi)核中的VFS(Virtual File System)。對(duì)于VFS這個(gè)概念其實(shí)非常容易理解,無非是一個(gè)抽象的統(tǒng)一接口:它定義了所有文件系統(tǒng)都支持的基本的和概念上的接口和數(shù)據(jù)結(jié)構(gòu),這樣就 在用戶上層看來,無論對(duì)何種文件系統(tǒng)都擁有統(tǒng)一的接口,和操作方式。其實(shí),對(duì)VFS的理解停留在這個(gè)層面上對(duì)于掌握其思想已經(jīng)夠用了,剩下要討論的也就是 它的實(shí)現(xiàn)和一些和進(jìn)程和文件系統(tǒng)的外延部分了。
目前總有一些困惑就是對(duì)于一個(gè)問題或者概念的抽象層次的把握,比如對(duì)于一個(gè)軟件工程師,他需要對(duì)計(jì)算機(jī)有所了解,不過不可能做到樣樣深入,比如內(nèi)存,我們 需要知道它是用來存儲(chǔ)臨時(shí)數(shù)據(jù)的,性能介于寄存器和磁盤之間,我們不需要知道它是如何設(shè)計(jì)的,經(jīng)過多少工藝制作而成的。所以有的時(shí)候,你對(duì)一個(gè)問題的抽象 層次決定著你對(duì)問題的把握。因?yàn)椴豢赡芡耆褑栴}從最底層剖析,我們只能在我們所熟知的層面或者說是我們所需要的層面去剖析問題。
話題有些扯遠(yuǎn)了,不過我想表達(dá)的是,如果只是想知道VFS是什么東西的話,第一段的幾句話我認(rèn)為已經(jīng)夠用了。那么繼續(xù)深入的意義究竟何在呢?或者說目的究竟何在呢?我認(rèn)為有這么幾點(diǎn)吧:
1. 文件系統(tǒng)的內(nèi)存表示
文件系統(tǒng)一方面定義了如何在磁盤上組織用戶的數(shù)據(jù)信息,那如何高效的讀寫管理文件就是內(nèi)核要考慮的事情了。VFS就是linux用來管理文件系統(tǒng)的方式(當(dāng)然不僅僅是vfs,還牽涉到I/O等等方面)。
2. VFS設(shè)計(jì)
VFS是一個(gè)比較成功的例子,它為所有的文件系統(tǒng)提供統(tǒng)一的接口,這個(gè)思想和設(shè)計(jì)可以被借鑒到其他地方。另外VFS用到的面向?qū)ο蟮母拍?#xff0c;所以這又是一個(gè)c語言實(shí)現(xiàn)的面向?qū)ο蠓独?/p>
3. 算法
對(duì)dcache中用到LRU. slab存儲(chǔ)dentry
?
好了,有了目標(biāo),那接下來就是各取所需了。
文件系統(tǒng)的內(nèi)存表示
這個(gè)標(biāo)題有點(diǎn)起大了,更貼切的應(yīng)該說是vfs中的一些數(shù)據(jù)結(jié)構(gòu)。
首先來說一下Linux中用到的和文件系統(tǒng)相關(guān)的傳統(tǒng)抽象概念:文件,目錄項(xiàng),i-node,mount point
這里我想從i-node說起,因?yàn)閕-node本身的概念使得文件和目錄項(xiàng)并不是我們通常說想象的那樣了。i-node是*nux文件系統(tǒng)中用來表示文件和目錄的數(shù)據(jù)結(jié)構(gòu)。也就是說通過i-node我們可以知道文件的所有信息。具體的描述可以參考另一篇文章:Ext3 File system Disk Layout
那么如果i-node已經(jīng)代表文件和目錄,那么這里的文件和目錄項(xiàng)又是什么意思呢?
文件對(duì)象
我們先說文件對(duì)象,這里的文件對(duì)象是指打開的文件在內(nèi)存中的表示。該對(duì)象由open()系統(tǒng)調(diào)用創(chuàng)建,由close()系統(tǒng)調(diào)用銷毀。也就是說一個(gè)文件系 統(tǒng)中的文件可能存在多個(gè)對(duì)應(yīng)的文件對(duì)象。它其實(shí)是用在進(jìn)程的角度的,多個(gè)進(jìn)程可以同時(shí)打開同一個(gè)文件,不過打開的文件會(huì)有自己特有的狀態(tài)信息,比如文件的 偏移量。所有在內(nèi)存中需要有這個(gè)對(duì)象記錄這些信息。
這個(gè)對(duì)象是以struct file **fd;形式存儲(chǔ)的,如下圖所示,一個(gè)fd指向一個(gè)File Object。
?
當(dāng)然File Object又應(yīng)該指向其對(duì)應(yīng)的i-node,雖然事實(shí)上File Object并沒有存inode的指針,而是存著dentry的指針(dentry指向i-node)。這里就引出了下一個(gè)概念:目錄項(xiàng)(dentry)
目錄項(xiàng)與目錄項(xiàng)緩存
我們既然有了i-node來表示目錄,那為什么還需要dentry呢?原因是VFS經(jīng)常需要執(zhí)行目錄相關(guān)的操作,比如路徑名查找等。路徑名查找需要不斷的 解析路徑,為了方便起見,就引入了dentry這個(gè)概念。目錄項(xiàng)沒有對(duì)應(yīng)的磁盤數(shù)據(jù)結(jié)構(gòu),VFS根據(jù)字符串形式的路徑名現(xiàn)場(chǎng)創(chuàng)建它。
dentry就是目錄的內(nèi)存表示,比如/tmp/test這個(gè)路徑,內(nèi)核為根目錄"/”創(chuàng)建一個(gè)目錄項(xiàng)對(duì)象,為tmp創(chuàng)建一個(gè)第二級(jí)目錄項(xiàng)對(duì)象,為 test創(chuàng)建第三級(jí)目錄項(xiàng)對(duì)象。這里要說明的是/tmp/test和/home/test中test目錄項(xiàng)有什么不同,雖然名字同是test,不過很顯然 它們指的是不同的文件,所以它們的i-node不同。另外,在dentry中會(huì)記錄其父目錄的目錄項(xiàng)對(duì)象d_parent。當(dāng)然,如果/home /test是鏈接到/tmp/test文件上,它們就會(huì)有相同的i-node,不過它們的父目錄的目錄項(xiàng)不同,一個(gè)是tmp,而另一個(gè)是home。可見, 對(duì)目錄項(xiàng)的hash就應(yīng)該是針對(duì)當(dāng)前文件名和父目錄的目錄項(xiàng)對(duì)象。
現(xiàn)在我們來說一下目錄項(xiàng)高速緩存:
1. 所有未使用的目錄項(xiàng)對(duì)象都存放在一個(gè)LRU的雙向鏈表中,既然是LRU,那當(dāng)目錄項(xiàng)高速緩存空間減少的時(shí)候會(huì)從LRU的尾部刪除。這個(gè)鏈表頭存放在dentry_unsued變量中,鏈表由每個(gè)dentry的d_lru變量鏈接。
2. 在使用的目錄項(xiàng)對(duì)象是被相應(yīng)的i-node節(jié)點(diǎn)的i_dentry變量所指向,i_dentry同樣是一個(gè)list頭指針,這里用list的原因是每個(gè) i-node節(jié)點(diǎn)可能與若干硬連接關(guān)聯(lián)。而目錄項(xiàng)對(duì)象的d_alias變量存放這個(gè)鏈接表的相鄰元素。當(dāng)在使用的目錄項(xiàng)對(duì)象被刪除時(shí)就會(huì)被移動(dòng)到上面所說 的未使用目錄項(xiàng)的LRU中。
3. 散列表dentry_hashtable是一個(gè)鏈表的數(shù)組,其作用是用來快速定位dentry的,其hash函數(shù)是由目錄項(xiàng)的parent指針和文件名決定的。
這里順便提一下,dentry對(duì)象是存儲(chǔ)在kernel的slab分配器高速緩存中的,是在Dcahce.c中的dentry_cache。slab高速緩存是內(nèi)存對(duì)象管理的一種算法,這個(gè)已經(jīng)超出了本文的范圍。
Mount Point
//TODO:
?
路徑名查找
//TODO:
以上引用來自http://blog.sina.com.cn/s/blog_55465b4701017qoz.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/pxguoo/archive/2013/04/07/3003977.html
總結(jié)
以上是生活随笔為你收集整理的linux的虚拟文件系统VFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用EditPlus 删除文本文件中多余
- 下一篇: 股票跳水什么意思