天堂中文最新版,果冻传媒在线观看视频,AA区一区二区三无码精片,欧美折磨另类系列sm

時(shí)代焦點(diǎn)網(wǎng) - 專業(yè)財(cái)經(jīng)新聞門戶

你管這叫文件系統(tǒng)?

發(fā)布時(shí)間:2022-09-27 12:25   來源:IT之家   閱讀量:6111   

你手里有個(gè)硬盤,1T大小。

你還有一堆文件。

這些文件在硬盤視圖中只是一堆二進(jìn)制數(shù)據(jù)。

你準(zhǔn)備把這些文件存儲在硬盤上,需要的時(shí)候把它們讀出來。

應(yīng)該設(shè)計(jì)什么樣的軟件來更方便地讀寫硬盤中的這些文件。

首先我不想處理復(fù)雜的扇區(qū),設(shè)備驅(qū)動等細(xì)節(jié),所以我先實(shí)現(xiàn)了一個(gè)簡單的功能,邏輯上把硬盤分成塊,可以分塊讀寫。

每個(gè)塊定義為兩個(gè)物理扇區(qū)的大小,即1024字節(jié),也就是1KB。

硬盤太大,無法分析,我們假設(shè)你的硬盤只有1MB,這個(gè)硬盤有1024塊。

好了,我們開始保存文件吧!

準(zhǔn)備一份文件。

選任何一塊放進(jìn)去,第三塊!

成功!第一次勝利!

再存一個(gè)文件!

呃發(fā)現(xiàn)問題了萬一這個(gè)文件也保存在Block 3中,不是會覆蓋原來的文件嗎不,必須有一個(gè)地方記錄現(xiàn)在哪些區(qū)塊是可用的,就像這樣

0:未使用

1:未使用

2:未使用

第3部分:已使用

第4塊:未使用

...

塊1023:未使用

讓我們用block 0來記錄所有block的使用情況!怎么錄。

位圖!

那么我們給block 0起個(gè)名字,叫block bitmap,然后這個(gè)block 0會用來記錄所有塊的使用情況,而不是存儲具體的文件。

當(dāng)我們保存一個(gè)新文件時(shí),我們只需要在塊位圖中找到第一位0,然后我們就可以找到第一個(gè)未使用的塊并保存文件同時(shí),不要忘記在塊位圖中設(shè)置相應(yīng)的位置1

完美!

接下來,讓我們嘗試讀取剛才的文件。

呃還有一個(gè)問題我怎么才能找到剛才的文件根據(jù)街區(qū)號太蠢了這就好比你去書店找一本書,店員要求你提供書號而不是書名,這顯然是不合理的

因此,我們給每個(gè)文件一個(gè)名字,叫做文件名,并通過它尋找這個(gè)文件。

必須有一個(gè)地方記錄文件名和塊號的對應(yīng)關(guān)系,像這樣。

向日葵收藏. txt: Block 3

數(shù)學(xué)期末復(fù)習(xí)資料。MP4:第五街區(qū)

低并發(fā)編程的秘密. pdf: Block 10

...

別急,既然要選擇一個(gè)地方記錄文件名,我們不妨多記錄一些我們關(guān)心的信息,比如文件大小,文件創(chuàng)建時(shí)間,文件權(quán)限等。

自然,這些東西也要存在硬盤里我們選擇一個(gè)固定大小的空間來表示這些信息多大空間請給我28字節(jié)

為什么是128字節(jié)我很樂意

我們稱這種128字節(jié)的結(jié)構(gòu)為inode。

之后我們每保存一個(gè)新文件,不僅要占用一個(gè)塊來存儲文件本身,還要占用一個(gè)inode來存儲文件的元信息,這個(gè)inode的block number字段指向這個(gè)文件的塊號。

如果一個(gè)索引節(jié)點(diǎn)是128字節(jié),那么一個(gè)塊可以容納8個(gè)索引節(jié)點(diǎn),我們可以對這些索引節(jié)點(diǎn)進(jìn)行編號。

如果你覺得inode的數(shù)量不夠,你也可以使用兩個(gè)或者更多的塊來存儲inode信息,但是這樣存儲數(shù)據(jù)的塊就少了就看你自己的平衡了

類似地,像塊位圖的使用一樣,我們也需要一個(gè)inode位圖來管理inode的使用。讓我們把索引節(jié)點(diǎn)位圖放在塊1中!

同時(shí),我們將inode信息放在塊2中,其中有8個(gè)inode共存,因此我們的塊2稱為inode表。

現(xiàn)在,我們的文件系統(tǒng)結(jié)構(gòu)變成了下面這樣。

注意:塊位圖用于管理可用的塊,每一位代表一個(gè)塊的使用索引節(jié)點(diǎn)位圖逐個(gè)管理索引節(jié)點(diǎn),而不是索引節(jié)點(diǎn)所占用的塊例如,如果上圖中有8個(gè)inode,那么inode位圖中有8位來管理它們的使用與否

現(xiàn)在,我們的文件很小,一個(gè)街區(qū)就能裝下。

但是如果需要兩塊,三塊,四塊呢。

很簡單,我們只需要采用連續(xù)存儲的方式,而inode只記錄文件的第一塊,以及后面需要多少塊。

這種方法的缺點(diǎn)是容易留下大小孔洞新文檔到達(dá)后,很難找到合適的空白塊,空間會被浪費(fèi)

這種方式好像行不通,怎么辦。

既然inode中記錄了文件的塊號,為什么不擴(kuò)展一下,記錄更多的塊呢。

最初,inode中只記錄了一個(gè)塊號現(xiàn)在,展開它,記錄8個(gè)塊號!并且這些塊不必是連續(xù)的

嗯,這是一個(gè)可行的辦法!

但這只能代表8塊,能記錄的最大文件是8K現(xiàn)在文件很容易超過這個(gè)限制我該怎么辦

很簡單,我們可以將其中一個(gè)塊作為間接索引。

這樣一瞬間就有了263塊這種指標(biāo)稱為一級間接指標(biāo)

如果還不夠,再弄一個(gè)一級間接索引或者二級間接索引的塊。

我們的文件系統(tǒng),暫時(shí)只有一級間接索引硬盤只有1024塊,一個(gè)文件263塊就夠大了再大也是這么任性愛不愛

好了,現(xiàn)在可以保存大文件了,可以通過文件名和文件大小準(zhǔn)確的讀出來了!

但是我們必須不斷進(jìn)步讓我們想想這個(gè)文件系統(tǒng)有什么問題

例如,我們?nèi)绾沃纈node的數(shù)量何時(shí)不夠需要在inode位圖中查找嗎找不到就知道不夠用

同樣,當(dāng)塊數(shù)不足時(shí),也是如此。

如果有個(gè)全球的地方把這一切都記錄下來就好了,方便隨時(shí)調(diào)整,比如這個(gè)。

信息節(jié)點(diǎn)數(shù)量

空閑信息節(jié)點(diǎn)數(shù)量

塊數(shù)

空閑塊數(shù)

那我們再占用一個(gè)塊來存儲這些數(shù)據(jù)吧!因?yàn)樗麄兯坪跏菑纳系鄣慕嵌葋砻枋鲞@個(gè)文件系統(tǒng),所以我們把它放在初始塊上,稱之為超級塊現(xiàn)在布局如下

我們繼續(xù)追求卓越。

現(xiàn)在,塊位圖,索引節(jié)點(diǎn)位圖和索引節(jié)點(diǎn)表都占據(jù)了塊1,塊2和塊3這三個(gè)位置。

如果inode數(shù)量太大,以至于inode表或inode位圖需要占用多個(gè)塊怎么辦。

或者,伴隨著塊數(shù)的增加,塊位圖需要占用多個(gè)塊我該怎么辦

程序已經(jīng)死了如果你不告訴它哪個(gè)方塊代表什么,它就不會自己去猜

很簡單就像超級塊記錄信息一樣,你可以選擇一塊來記錄這些信息,這樣你就不會害怕了那么我們就選擇緊接超級塊之后的第一個(gè)塊來記錄這些信息,稱之為塊描述符

當(dāng)然,這些塊號只記錄起始塊號,塊位圖,inode位圖,inode表可以分別占用多個(gè)塊。

好了,你完成了!

現(xiàn)在,讓我們嘗試保存另一批文件。

葵花寶典. txt

materials.mp4數(shù)學(xué)期末復(fù)習(xí)

低并發(fā)Programming.pdf的秘密

呃這看起來不舒服所有的文件都放平了可以有等級關(guān)系嗎

葵花寶典. txt

materials.mp4數(shù)學(xué)期末復(fù)習(xí)

住在妻子父母家的女婿

低并發(fā)Programming.pdf的秘密

我們稱之為向日葵收藏txt一個(gè)普通文件,我女婿一個(gè)目錄文件

女婿/女婿1.mp4。

如何做到這一點(diǎn)那么我們又要說inode結(jié)構(gòu)了

此時(shí)需要一個(gè)屬性來區(qū)分這個(gè)文件是普通文件還是目錄文件。

彌補(bǔ)缺失的東西我們已經(jīng)很熟悉了我們添加一個(gè)4字節(jié)來表示文件類型

如果是正常文件,這個(gè)inode指向的數(shù)據(jù)塊還是和以前一樣,也就是文件本身的完整內(nèi)容。

但如果是目錄文件,這個(gè)inode指向的數(shù)據(jù)塊就需要重新規(guī)劃了。

這個(gè)數(shù)據(jù)塊應(yīng)該是什么樣子它可以是指向彼此相鄰的不同inode的結(jié)構(gòu),比如這樣

這樣我們就可以先找到這個(gè)目錄文件中的數(shù)據(jù)塊然后,根據(jù)該數(shù)據(jù)塊中包含inode信息的結(jié)構(gòu),找到該目錄中的所有文件

完美!

但是,仔細(xì)想想如果你想檢查這個(gè)目錄下的所有文件,并顯示文件名和文件類型呢

需要從inode表中取出每個(gè)結(jié)構(gòu)所指向的inode,然后再取出文件名和文件類型,很浪費(fèi)時(shí)間。

讓用戶看到一個(gè)目錄下的所有文件是一個(gè)很常見的操作。

因此,最好將結(jié)構(gòu)中的文件名和文件類型等常用信息放在數(shù)據(jù)塊中。

同時(shí),inode結(jié)構(gòu)中的文件名似乎也沒什么用這種變長的東西在這種定長結(jié)構(gòu)里很煩,早就想擺脫了它還可以為其他信息節(jié)省空間,比如文件所在的塊數(shù)組,這樣就可以多一些

太好了,擺脫它!

好了,你完成了?,F(xiàn)在我們可以將文件分類到不同的目錄中,也可以在目錄中創(chuàng)建目錄,無限娃娃!

現(xiàn)在的文件系統(tǒng)已經(jīng)比較完善了,但是還是有一點(diǎn)點(diǎn)不適。

當(dāng)我們訪問一個(gè)目錄時(shí),我們可以很舒服地看到目錄中的文件,然后根據(jù)它們的名稱訪問這個(gè)目錄中的文件或目錄整個(gè)過程都是套路

但是,頂層目錄中的所有文件仍然需要通過遍歷所有inode來獲取可以和上面的套路統(tǒng)一嗎

答案很簡單。我們規(guī)定inode表中的數(shù)字0 inode表示根目錄,所有訪問都從這個(gè)根目錄開始!

好了,沒有了!

最后,讓我們來欣賞一下我們的文件系統(tǒng)架構(gòu)。

你覺得沒什么大不了的。

但是這個(gè)愚蠢的東西,叫做文件系統(tǒng)。

附言

這個(gè)文件系統(tǒng)和linux上的經(jīng)典文件系統(tǒng)ext2基本相同。

下面是我畫的ext2文件系統(tǒng)的結(jié)構(gòu)。

我猜你看不清楚。我來說說主要的異同點(diǎn):

1.超級塊前面是引導(dǎo)塊,是PC聯(lián)盟為硬盤指定的1KB獨(dú)占空間,任何文件系統(tǒng)都不能使用。

2.EXT2文件系統(tǒng)首先將整個(gè)硬盤劃分為許多塊組,但如果只有一個(gè)塊組,那么它將與我們文件系統(tǒng)的整體結(jié)構(gòu)完全相同,即超級塊,塊描述符,塊位圖,inode位圖,inode表和數(shù)據(jù)塊。

3.在EXT2文件系統(tǒng)的inode表中,有15個(gè)塊用于定位文件,其中第13個(gè)塊是一級間接索引,14個(gè)是二級間接索引,15個(gè)是三級間接索引。

4.ext2文件系統(tǒng)有更多的文件類型,如塊設(shè)備文件,字符設(shè)備文件,管道文件,套接字文件等。

5.EXT2文件系統(tǒng)的超級塊,塊描述符和inode表記錄的信息更多,但核心和我們的文件系統(tǒng)是一樣的,在后續(xù)的ext3和ext4中不斷增加這些字段,保持向前兼容。

6.6.ext2文件系統(tǒng)的2號inode是根目錄,而我們的系統(tǒng)是0號inode的根目錄這是非常武斷的你設(shè)計(jì)一個(gè)文件系統(tǒng),設(shè)置一個(gè)187號inode作為根目錄,沒人攔你

如果你想知道ext2文件系統(tǒng)的所有細(xì)節(jié),有三種方法。

1.看源代碼linux1.0以后的源碼有ext2文件系統(tǒng)的實(shí)現(xiàn),源碼最準(zhǔn)確

2.看官方文件這里有一個(gè)pdf鏈接

3.閱讀高質(zhì)量的博客這里我推薦一個(gè)

如果看源代碼和官方文檔比較容易,當(dāng)然我是提倡這兩個(gè)的,因?yàn)楫吘故堑谝皇仲Y料。

但是大部分人可能做不到,有時(shí)候也沒必要,所以也可以看一些有質(zhì)量的博客。

入門,我覺得我這個(gè)是質(zhì)量非常高的一個(gè)它將帶你理解你為什么從設(shè)計(jì)者的角度來設(shè)計(jì)文件系統(tǒng)

如果介紹細(xì)節(jié)的話,別看那些連文件系統(tǒng)的格式和字段都寫不正確的,所以我在這里良心推薦一個(gè),也就是上面的第三種方式,你可以放心的逐字逐句的吃下去。

聲明:本網(wǎng)轉(zhuǎn)發(fā)此文章,旨在為讀者提供更多信息資訊,所涉內(nèi)容不構(gòu)成投資、消費(fèi)建議。文章事實(shí)如有疑問,請與有關(guān)方核實(shí),文章觀點(diǎn)非本網(wǎng)觀點(diǎn),僅供讀者參考。