正如解決數(shù)學(xué)問題通常我們會談“思想”缩抡,諸如反證法、化繁為簡等包颁,解決計算機問題也有很多非常出色的思想瞻想。思想之所以稱為思想,是因為“思想”有拓展性與引導(dǎo)性娩嚼,可以解決一系列問題蘑险。根據(jù)我自己的學(xué)習(xí)體驗,解決計算機科學(xué)問題有三個非常重要的思想:虛擬岳悟、緩存佃迄、分層。
這些思想的應(yīng)用可以在計算機科學(xué)的各個方面找到贵少。計算機科學(xué)的文件系統(tǒng)的構(gòu)成充分體現(xiàn)了這三個思想的應(yīng)用呵俏;這篇文章以小見大,來說明文件系統(tǒng)是如何體現(xiàn)這三個思想的滔灶。
虛擬
虛擬的思想很像數(shù)學(xué)中的“抽象”的思想普碎。虛擬通過將結(jié)構(gòu)、性質(zhì)不同的底層實現(xiàn)進行封裝录平,向上提供統(tǒng)一的API接口麻车,讓使用者覺得就是在使用一個統(tǒng)一的資源,或者讓使用者覺得自己在使用一個本來底層不直接提供萄涯、“虛擬”出來的資源绪氛。
虛擬文件系統(tǒng)(VFS, Virtual File System)是一個分層結(jié)構(gòu)。向下統(tǒng)一設(shè)備I/O等硬件資源涝影,向上提供統(tǒng)一的文件/文件系統(tǒng)API枣察,讓用戶覺得自己用的就是一套統(tǒng)一的文件系統(tǒng)。例如燃逻,在unix系統(tǒng)中序目,“一切都是文件”就是這種虛擬文件系統(tǒng)思想的體現(xiàn)。
虛擬文件系統(tǒng)主要由三部分構(gòu)成:
- 文件卷控制塊
- 文件控制塊
- 目錄項
其結(jié)構(gòu)如下圖所示:
當(dāng)文件系統(tǒng)掛載的時候伯襟,文件卷控制塊就加載到掛載點猿涨;當(dāng)訪問某個文件時,文件控制塊就被加載到內(nèi)存姆怪;目錄項只會在做遍歷等操作時才會加載叛赚。這些信息都會被持久存在外存中澡绩。(磁盤中有一部分空間用來儲存這些信息)
在這個統(tǒng)一的框架下,不通類型的文件系統(tǒng)(例如磁盤文件系統(tǒng)FAT,NTFS,數(shù)據(jù)庫文件系統(tǒng)WinFS,日志文件系統(tǒng)俺附,網(wǎng)絡(luò)文件系統(tǒng)等)與不同結(jié)構(gòu)的文件(字節(jié)序列肥卡、簡單記錄結(jié)構(gòu)、復(fù)雜結(jié)構(gòu)如word等)就成為了這個虛擬文件系統(tǒng)的一個實例事镣。例如步鉴,網(wǎng)絡(luò)文件系統(tǒng)可能被掛載在/net/
下,當(dāng)我們插入USB時璃哟,在/Volumns
中就掛載了USB介質(zhì)氛琢。
緩存
緩存這個機制,非常巧妙地解決了讀速度與寫速度不一致的問題随闪。計算機的虛擬內(nèi)存阳似、路由器的數(shù)據(jù)接收與發(fā)送等,都可以看成緩存思想的應(yīng)用蕴掏。
在文件系統(tǒng)中障般,由于從磁盤上讀取是機械過程,速度比較慢盛杰,解決讀寫速度不一致問題的一個有效方案是緩存∶晔基本思想是將磁盤中的數(shù)據(jù)讀如磁盤控制器(扇區(qū)緩存)即供,在一定條件下,將數(shù)據(jù)緩存到內(nèi)存于微。
通常緩存數(shù)據(jù)塊的情景有兩種:
- 對數(shù)據(jù)有需求逗嫡。因此計算機會將后面的數(shù)據(jù)塊預(yù)先讀如緩存。
- 數(shù)據(jù)塊使用后將來還可能被用到株依。
緩存從方式上分可以分為兩種:數(shù)據(jù)塊緩存與頁緩存驱证。
在數(shù)據(jù)塊緩存中,文件并不是直接緩存到內(nèi)存中恋腕,而是被緩存到數(shù)據(jù)緩存塊抹锄,頁緩存也被緩存到數(shù)據(jù)緩存塊,文件讀寫操作從數(shù)據(jù)緩存塊讀取文件數(shù)據(jù)荠藤;在頁緩存中伙单,文件緩存在內(nèi)存中(可能是虛擬內(nèi)存),文件的讀寫操作被緩存成對內(nèi)存的訪問哈肖。
通過這種方式吻育,可以大大提高文件的讀寫速度。
分層
當(dāng)一個問題比較復(fù)雜是淤井,通常通過分層布疼,每層利用下層API摊趾,實現(xiàn)一定功能,向上層提供更高級的API游两。這種思想有點類似數(shù)學(xué)中的多尺度(multiscale)严就;許多問題在一個尺度下解決比較困難,但是通過多尺度器罐,可以綜合細網(wǎng)格與粗網(wǎng)格的優(yōu)點梢为,達到解決問題的目的。一個例子是網(wǎng)絡(luò)的7層結(jié)構(gòu)轰坊,通過不穩(wěn)定的硬件铸董,一層層封裝,最終可以提供穩(wěn)定的網(wǎng)絡(luò)服務(wù)肴沫。
文件系統(tǒng)中粟害,文件分配是一個典型應(yīng)用分層思想的文件儲存解決方案。由于一個文件系統(tǒng)中颤芬,文件的大小不相同悲幅,大多數(shù)文件都很小,分配的塊空間不能太大站蝠,同時也要支持一些大文件(64位文件偏移)汰具,并且訪問這些大小不同的文件時我們希望是高效的。
文件分配一般有三種方式:
- 連續(xù)分配
在這種方式中菱魔,文件被分配到一個連續(xù)的物理數(shù)據(jù)塊空間留荔。這種方式支持高效的隨機訪問,但是由于分配的是連續(xù)的磁盤空間澜倦,可能導(dǎo)致磁盤碎片聚蝶。而且由于空間較為固定,增長文件也會出現(xiàn)問題藻治。
- 鏈?zhǔn)椒峙?/li>
文件以數(shù)據(jù)塊鏈表方式儲存碘勉。這種方式下,創(chuàng)建桩卵、增大验靡、減小文件很容易,但是隨機訪問代價比較高吸占。穩(wěn)定性也是一個問題:破壞一個鏈晴叨,可能導(dǎo)致其后的數(shù)據(jù)都丟失。
- 索引分配
索引分配的基本結(jié)構(gòu)是
文件指針 --> 索引 --> 數(shù)據(jù)塊1矾屯,數(shù)據(jù)塊2兼蕊,……
索引分配綜合了上面兩種分配方式的優(yōu)點,但是如果文件比較小件蚕,儲存索引的開銷相比文件大小可能比較昂貴孙技,如果文件比較大产禾,索引可能無法放到一個索引塊中,需要多個索引塊牵啦,這增加了訪問的難度亚情。
Unix系統(tǒng)采用了UFS多級索引分配的方式
UFS有很好的尺度適應(yīng)性:當(dāng)文件比較小時,文件指針inode
直接指向文件數(shù)據(jù)塊哈雏,當(dāng)文件比較大時楞件,索引塊的數(shù)量增加的量級只是log(n)的量級。
通過分層的方式裳瘪,UFS大大提高了文件大小的限制域值土浸,動態(tài)分配數(shù)據(jù)塊,小文件開銷小彭羹,支持大文件黄伊。
另一種思想:分布式
上面的三種思想在計算機科學(xué)的許多方面都有體現(xiàn),除了這些思想派殷,另外還有一種常見的思想是分布式还最。談及分布式,讓人想起Hadoop等現(xiàn)在研究非痴毕В火熱的分布式技術(shù)拓轻,事實上,分布式在文件系統(tǒng)中也有自己的體現(xiàn)虱黄。
分布式的基本思想是:
通過并行提高吞吐量悦即,通過冗余來提高可靠性與可用性。
在文件系統(tǒng)中橱乱,磁盤陣列通過多磁盤管理來實現(xiàn)分布式。我們以RAID-0為例粱甫,文件系統(tǒng)將數(shù)據(jù)塊分為多個字塊泳叠,存儲到獨立的磁盤中,當(dāng)讀取數(shù)據(jù)的時候茶宵,可以同時讀取這些磁盤的數(shù)據(jù)危纫,從而通過并行提高了吞吐量。
RAID-1的方案是將數(shù)據(jù)同時寫入兩個磁盤乌庶,讀數(shù)據(jù)時從任何一個讀取种蝶,這樣某個磁盤的數(shù)據(jù)丟失后,可以從另一個磁盤獲得瞒大,這種方式是通過冗余來提高可靠性與可用性螃征。
還有很多其他的RAID方案,其核心就是通過分布式來獲得吞吐量透敌、可靠性或兩者盯滚。
總結(jié)
我們通過文件系統(tǒng)的一些方面說明了虛擬踢械,緩存,分層思想在計算機科學(xué)中的應(yīng)用魄藕,同時提及了分布式的思想内列。思想是各中計算機問題甚至各個學(xué)科共通的解決問題的利刃,我相信這些思想可以在更多的計算機科學(xué)問題甚至其他學(xué)科問題中發(fā)揮巨大的作用背率。