日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
深入了解Linux文件系統(tǒng)實(shí)驗(yàn)原理(linux文件系統(tǒng)實(shí)驗(yàn)原理)

Linux是一個(gè)開源的操作系統(tǒng),廣泛應(yīng)用于各種領(lǐng)域。Linux文件系統(tǒng)是其中一個(gè)重要的組成部分,它的實(shí)現(xiàn)原理影響著Linux系統(tǒng)的性能和穩(wěn)定性。本文將介紹Linux文件系統(tǒng)的實(shí)現(xiàn)原理,并介紹一個(gè)簡(jiǎn)單的實(shí)驗(yàn),幫助讀者深入理解文件系統(tǒng)的工作方式。

一、Linux文件系統(tǒng)概述

Linux文件系統(tǒng)是指在Linux操作系統(tǒng)中負(fù)責(zé)存儲(chǔ)和管理文件的一組軟件程序和數(shù)據(jù)結(jié)構(gòu)。在Linux系統(tǒng)中,文件系統(tǒng)使用一種樹形結(jié)構(gòu)來組織文件和目錄,這個(gè)樹形結(jié)構(gòu)稱為目錄樹。目錄樹的頂層是根目錄,其他目錄和文件都存放在根目錄下或者它的子目錄里。

文件系統(tǒng)的實(shí)現(xiàn)原理是在一個(gè)物理設(shè)備(通常是硬盤)上劃分一塊空間,然后在這個(gè)空間上創(chuàng)建一個(gè)或多個(gè)文件系統(tǒng),每個(gè)文件系統(tǒng)對(duì)應(yīng)著一個(gè)根目錄。文件系統(tǒng)中包含多個(gè)文件和目錄,它們以一定的方式存儲(chǔ)在設(shè)備上。當(dāng)我們打開一個(gè)文件或者創(chuàng)建一個(gè)新文件時(shí),文件系統(tǒng)會(huì)將文件所在的數(shù)據(jù)塊讀入內(nèi)存,我們?cè)趦?nèi)存中編輯或讀取文件,當(dāng)我們關(guān)閉文件或者保存文件時(shí),數(shù)據(jù)塊會(huì)被寫回到設(shè)備上。

二、linux文件系統(tǒng)實(shí)驗(yàn)原理

在Linux系統(tǒng)中,每個(gè)設(shè)備都有一個(gè)設(shè)備文件,例如硬盤的設(shè)備文件是/dev/hda,其中hda表示硬盤的之一塊物理分區(qū)。我們可以通過在設(shè)備文件上創(chuàng)建一個(gè)文件系統(tǒng),實(shí)現(xiàn)在硬盤上創(chuàng)建并管理文件的目的。下面介紹一個(gè)簡(jiǎn)易的Linux文件系統(tǒng)實(shí)驗(yàn),幫助讀者了解文件系統(tǒng)的實(shí)現(xiàn)原理。

1. 準(zhǔn)備工作

我們需要一個(gè)空白的硬盤分區(qū),可以使用如下命令查看硬盤的分區(qū)情況:

fdisk -l

然后選擇一個(gè)空白的分區(qū)(例如/dev/hda2),用如下命令格式化分區(qū)并創(chuàng)建文件系統(tǒng):

mkfs.ext2 /dev/hda2

2. 掛載分區(qū)

接下來,我們需要在Linux系統(tǒng)中掛載分區(qū),使得文件系統(tǒng)可以訪問。我們可以使用如下命令創(chuàng)建一個(gè)掛載點(diǎn):

mkdir /mnt/myfs

然后,可以使用如下命令將分區(qū)掛載到該掛載點(diǎn)上:

mount /dev/hda2 /mnt/myfs

3. 測(cè)試文件系統(tǒng)

我們可以使用如下命令測(cè)試文件系統(tǒng):

cd /mnt/myfs

touch myfile.txt

echo “Hello World” > myfile.txt

cat myfile.txt

這些命令完成了以下操作:

– 進(jìn)入文件系統(tǒng)的根目錄。

– 創(chuàng)建了一個(gè)名為myfile.txt的文件。

– 將字符串“Hello World”寫入myfile.txt文件。

– 用cat命令讀取myfile.txt文件并在屏幕上顯示。

通過測(cè)試命令,我們可以看到在/mnt/myfs目錄下創(chuàng)建了一個(gè)名為myfile.txt的文件,文件內(nèi)容是字符串“Hello World”。

4. 卸載文件系統(tǒng)

當(dāng)我們不再需要使用文件系統(tǒng)時(shí),我們需要卸載文件系統(tǒng),以便安全地卸載硬盤分區(qū)。我們可以使用如下命令卸載文件系統(tǒng):

umount /mnt/myfs

這個(gè)命令會(huì)將/mnt/myfs目錄下的文件系統(tǒng)從/dev/hda2設(shè)備上卸載。

三、結(jié)論

Linux文件系統(tǒng)是一個(gè)重要的組成部分,它存儲(chǔ)和管理著Linux系統(tǒng)中的文件和目錄。本文介紹了Linux文件系統(tǒng)的實(shí)現(xiàn)原理,并通過一個(gè)簡(jiǎn)單的實(shí)驗(yàn)幫助讀者加深對(duì)文件系統(tǒng)工作方式的理解。我們了解到,文件系統(tǒng)的實(shí)現(xiàn)原理是在一個(gè)物理設(shè)備上劃分出一塊空間,并在空間上創(chuàng)建一個(gè)或多個(gè)文件系統(tǒng),每個(gè)文件系統(tǒng)對(duì)應(yīng)一個(gè)根目錄。當(dāng)我們打開、讀取、保存或關(guān)閉文件時(shí),文件系統(tǒng)會(huì)將數(shù)據(jù)塊讀入內(nèi)存,我們?cè)趦?nèi)存中編輯文件,數(shù)據(jù)塊會(huì)被寫回到設(shè)備上。通過這篇文章,讀者可以更好地理解Linux文件系統(tǒng)的工作原理。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220

Linux文件系統(tǒng)特點(diǎn)?

Linux之所以能在嵌人式系統(tǒng)領(lǐng)域取得如此輝煌的成績(jī),與其自身的優(yōu)良特性是分不開的。與其他操作系統(tǒng)相比,Linux具有以下一系列顯著的特點(diǎn)。

1.模塊化程度高

Linux的內(nèi)核設(shè)計(jì)非常精巧,分成進(jìn)程調(diào)度、內(nèi)存管理、進(jìn)程間通信、虛擬

文件系統(tǒng)

和網(wǎng)絡(luò)接口五大部分;其獨(dú)特的模塊機(jī)制可根據(jù)用戶的需要,實(shí)時(shí)地將某些模塊插入或從內(nèi)核中移走,使得Linux系統(tǒng)內(nèi)核可以裁剪得非常小巧,很適合于

嵌入式系統(tǒng)

的需要。

2.源碼公開

由于Linux系統(tǒng)的開發(fā)從一開始就與GNU項(xiàng)目緊密地結(jié)合起來,所納歷以它的大多數(shù)組成部分都直接來自GNU項(xiàng)目。任何人、任何組織只要遵守GPL條款,就可以自由使用Linux

源代碼

,為用戶提供了更大限度的

自由度

。這一點(diǎn)也正投嵌入式系統(tǒng)所好,因?yàn)榍度胧较到y(tǒng)應(yīng)用千差萬別,設(shè)計(jì)者往往需要針對(duì)具體的應(yīng)用對(duì)源碼進(jìn)行修改和優(yōu)化,所以是否能獲得源代碼 對(duì)于嵌入式系統(tǒng)的開發(fā)是至關(guān)重要的。加之Linux的軟件資源十分豐富,每種通用程序在Linux上幾乎都可以找到,并且數(shù)量還在不斷增加。這一切就使設(shè)計(jì)者在其基礎(chǔ)之上進(jìn)行二次開發(fā)變得非常容易。另外,由于Linux源代碼公開,也使用戶不用擔(dān)心有“后閘”等

安全隱患

同時(shí),源碼開放給各教育機(jī)構(gòu)提供極大的方便,從而也促進(jìn)了Linux的學(xué)習(xí)、推廣和應(yīng)用。

3.廣泛的硬件支持

Linux能支持x86、ARM、MIPS、ALPHA和PowerPC等多種體系結(jié)構(gòu)的洞備搜

微處理器

。目前已成功地移植到數(shù)十種硬件平臺(tái),幾乎能運(yùn)行在所有流行的處理器上。

由于世界范圍內(nèi)有眾多開發(fā)者在為L(zhǎng)inux的擴(kuò)充貢獻(xiàn)力量,所以Linux有著異常豐富的

驅(qū)動(dòng)程序

資源,支持各種主流硬件設(shè)各和最新的硬件技術(shù),甚至可在沒有存儲(chǔ)管理單元MMU 的處理器上運(yùn)行,這滾讓些都進(jìn)一步促進(jìn)了Linux在嵌入式系統(tǒng)中的應(yīng)用。

4.安全性及可靠性好

內(nèi)核高效穩(wěn)定。

Linux內(nèi)核

的高效和穩(wěn)定已在各個(gè)領(lǐng)域內(nèi)得到了大量事實(shí)的驗(yàn)證。

Linux中大量網(wǎng)絡(luò)管理、網(wǎng)絡(luò)服務(wù)等方面的功能,可使用戶很方便地建立高效穩(wěn)定的防火墻、路由器、工作站、服務(wù)器等。為提高安全性,它還提供了大量的網(wǎng)絡(luò)管理軟件、網(wǎng)絡(luò)分析軟件和網(wǎng)絡(luò)安全軟件等。

5.具有優(yōu)秀的開發(fā)工具

開發(fā)嵌入式系統(tǒng)的關(guān)鍵是需要有一套完善的開發(fā)和調(diào)試工具。傳統(tǒng)的

嵌入式開發(fā)

調(diào)試工具是在線仿真器(In Circuit Emulator,ICE),它通過取代目標(biāo)板的微處理器,給目標(biāo)程序提供一個(gè)完整的仿真環(huán)境,從而使開發(fā)者能非常清楚地了解到程序在目標(biāo)板上的工作狀態(tài),便于監(jiān)視和調(diào)試程序。在線仿真器的價(jià)格非常高,而且只適合做非常底層的調(diào)試。如果使用的是嵌人式Linux,一旦軟硬件能支持正常的串口功能,即使不用在線仿真器,也可以很好地進(jìn)行開發(fā)和調(diào)試工作,從而節(jié)省了一筆不小的開發(fā)費(fèi)用。嵌入式Linux為開發(fā)者提供了一套完整的工具鏈(Tool Chain),能夠很方便地實(shí)現(xiàn)從操作系統(tǒng)到應(yīng)用軟件各個(gè)級(jí)別的調(diào)試。

6.有很好的網(wǎng)絡(luò)支持利文件系統(tǒng)支持

Linux從誕生之日起就與Internet密不可分,支持各種標(biāo)準(zhǔn)的Internet

網(wǎng)絡(luò)協(xié)議

,并且很容易移植到嵌入式系統(tǒng)當(dāng)中。目前,Linux幾乎支持所有主流的網(wǎng)絡(luò)硬件、網(wǎng)絡(luò)協(xié)議和文件系統(tǒng),因此它是NFS的一個(gè)很好的平臺(tái)。

另一方面,由于Linux有很好的文件系統(tǒng)支持(例如,它支持Ext2、FAT32、romfs等文件系統(tǒng)),是數(shù)據(jù)各份、同步和復(fù)制的良好平臺(tái),這些都為開發(fā)嵌入式系統(tǒng)應(yīng)用打下了堅(jiān)實(shí)的基礎(chǔ)。

7.與UNIX完全兼容

目前,在Linux中所包含的工具和實(shí)用程序,可以完成UNIX的所有主要功能。

但由于Linux不是為實(shí)時(shí)而設(shè)計(jì)的,因而這就成了Linux在實(shí)時(shí)系統(tǒng)中應(yīng)用的更大遺憾。不過,目前有眾多的自由軟件愛好者正在為此進(jìn)行不懈的努力,也取得了諸多成果

類似于 Windows下的C、D、E等各個(gè)盤,Linux系統(tǒng)也可以將磁盤、Flash等存儲(chǔ)設(shè)備劃分為若干個(gè)分區(qū),在不同分區(qū)存放不同類別的文件。與Windows的C盤類似,Linux一樣要在一個(gè)分區(qū)上存放系統(tǒng)啟動(dòng)所必需的文件,比如內(nèi)核映象文件(在嵌入式系統(tǒng)中,內(nèi)核一般單獨(dú)存放在一個(gè)分區(qū)中)內(nèi)核啟動(dòng)后運(yùn)行的之一-個(gè)程序( init)給用戶提供操作界面的 shell程序、應(yīng)用程序所依賴的庫等。這些必需、基本的文件早氏合稱為根文件系統(tǒng),它們存放在一個(gè)分區(qū)中。Linux 系統(tǒng)啟動(dòng)后首先掛接這個(gè)分區(qū),稱為掛接( mount)根文件系統(tǒng)。其他分梁睜數(shù)區(qū)上所有目錄、文件的,也稱為文件系統(tǒng)。Linux 中并沒有C、D、E等盤符的概念,它以樹狀結(jié)構(gòu)管理所有目錄、文件,其他分區(qū)掛接在某個(gè)目錄上,這個(gè)目錄被稱為掛接點(diǎn)或安裝點(diǎn)(mount point),然后就可以通過這個(gè)目錄來訪問這個(gè)分區(qū)上的文件了。比如根文件系統(tǒng)被掛接在根目錄“I”上后,在根目錄下就有根文件系統(tǒng)的各個(gè)目錄、文件:/bin、/in、/mnt等;再將其他分區(qū)掛接到/mnt目錄上,/mnt目錄下就有這個(gè)分區(qū).的各個(gè)目錄、文件。在一個(gè)分區(qū)上存儲(chǔ)文件時(shí),需要遵循一定的格式,這種格式稱為文橡首件系統(tǒng)類型,比如fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs 等。除這些擁有實(shí)實(shí)在在的存儲(chǔ)分區(qū)的文件系統(tǒng)類型外,Linux還有幾種虛擬的文件系統(tǒng)類型,比如proc、sysfs 等,它們的文件并不存儲(chǔ)在實(shí)際的設(shè)備上,而是在訪問它們時(shí)由內(nèi)核臨時(shí)生成。比如 proc文件系統(tǒng)下的uptime文件,讀取它時(shí)可以得到兩個(gè)時(shí)間值(用來表示系統(tǒng)啟動(dòng)后運(yùn)行的秒數(shù)、空閑的秒數(shù)),每次讀取時(shí)都由內(nèi)核即刻生成,每次讀取結(jié)果都不一樣?!拔募到y(tǒng)類型”常被簡(jiǎn)稱為“文件系統(tǒng)”,比如“硬盤第二個(gè)分區(qū)上的文件系統(tǒng)是EXT2”指的就是文件系統(tǒng)類型。所以“文件系統(tǒng)”這個(gè)術(shù)語,有時(shí)候指的是分區(qū)上的文件,有時(shí)候指的是文件系統(tǒng)類型,需要根據(jù)語境分辨,在閱讀各類文獻(xiàn)時(shí)需要注意這點(diǎn)。

第9章 Linux文件系統(tǒng)知識(shí)與格式化應(yīng)用實(shí)踐… 1

9.1 Linux文件系統(tǒng)介紹… 2

9.1.1文件系統(tǒng)知識(shí)預(yù)備… 2

9.1.2什么是文件系統(tǒng)?… 3

9.1.3文件系統(tǒng)有什么用?… 3

9.1.4 常見文件系統(tǒng)類型介紹… 3

9.1.5文件系統(tǒng)的深入體系結(jié)構(gòu)介紹… 9

9.1.6操作系統(tǒng)默認(rèn)文件系統(tǒng)及簡(jiǎn)單對(duì)比… 11

9.1.7文件系統(tǒng)選型簡(jiǎn)單介紹… 12

9.2 mkfs:創(chuàng)建Linux文件系統(tǒng)核心命令… 13

9.2.1 命令詳解… 13

9.2.2 使用范例… 14

9.3 Ext2文件系統(tǒng)介紹… 16

9.3.1 ext2文件系統(tǒng)介紹… 16

9.3.2 ext2文件系統(tǒng)知識(shí)回顧… 16

9.3.3什么是inode?… 18

9.3.4什么是邏輯塊(Block)?… 21

9.4文件系統(tǒng)的磁盤布局… 22

9.4.1磁盤文件系統(tǒng)概述… 22

9.4.2 ext2文件系統(tǒng)總體存儲(chǔ)布局… 23

9.3.1文件系統(tǒng)新增文件操作流程… 36

9.3.2文件系統(tǒng)刪除原理… 37

9.1 Linux文件系統(tǒng)介紹

9.1.1文件系統(tǒng)知識(shí)預(yù)備

分區(qū)與文件系統(tǒng)的關(guān)系比喻:分區(qū)就是給房子打隔斷,創(chuàng)建文件系統(tǒng)就是給房子裝修!

根據(jù)前面課程的講解,以及大家日常對(duì)Linux系統(tǒng)的操作,我們很容易理解,當(dāng)通過fdisk命令對(duì)一個(gè)磁盤進(jìn)行分區(qū)后,并不能直接掛載目錄存放數(shù)據(jù)實(shí)體,還需要格式化操作,才可以進(jìn)行掛載并存放數(shù)據(jù)。這談轎里實(shí)踐下,將一個(gè)未進(jìn)行格式化的分區(qū)sdb1直接掛載。

# mount /dev/sdb1 /mnt

mount: you must specify the filesystem type #

# mount /dev/sdb1 /mnt

mount: /dev/sdb3 is write-protected, mounting read-only #

mount: unknown filesystem type ‘(null)’

為什么磁盤分區(qū)后需要格式化呢?這是因?yàn)榇疟P分區(qū)在沒有格式化前,操作系統(tǒng)是無法識(shí)別系統(tǒng)上磁盤分區(qū)格式的,也就無法存取文件目錄屬性和權(quán)限等內(nèi)容,把分區(qū)格式化成操作系統(tǒng)支持的某個(gè)文件系統(tǒng)后,再存放數(shù)據(jù),系統(tǒng)就會(huì)根據(jù)這個(gè)文件系統(tǒng)的格式進(jìn)行存取文件了。

9.1.2什么是文件系統(tǒng)?

簡(jiǎn)單地說,文件系統(tǒng)就是一種存儲(chǔ)和組織計(jì)算機(jī)中數(shù)據(jù)文件的機(jī)制或方法,它使得對(duì)計(jì)算機(jī)內(nèi)的數(shù)據(jù)的存儲(chǔ)、訪問和查找變得更容易、簡(jiǎn)單含慎肆。如ext2、ext3(CentOS5.x)、ext4(CentOS6.x)、xfs(CentOS7.x)、zfs和Reiserfs或FAT、NTFS等都是常見文件系統(tǒng)。

文件系統(tǒng)也可能是一種訪問數(shù)據(jù)的服務(wù)形式,實(shí)際的數(shù)據(jù)是通過網(wǎng)絡(luò)協(xié)議(如NFS、MFS等)提供的或者系統(tǒng)內(nèi)存里,甚至可能根本沒有對(duì)應(yīng)的文件(如proc文件系統(tǒng))。

因此,如果嚴(yán)格地說,文件系統(tǒng)是一套實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ)、分級(jí)組織、訪問和獲取等操作的抽象數(shù)據(jù)類型,而文件系統(tǒng)落到計(jì)算機(jī)里其實(shí)就是一個(gè)應(yīng)用軟件。

9.1.3文件系統(tǒng)有什么用?

文件系統(tǒng)使用文件和樹形目錄的抽象邏輯概念代替了磁盤等物理設(shè)備使用數(shù)據(jù)塊的概念,用戶使用文件系統(tǒng)來存放數(shù)據(jù),而不必關(guān)心數(shù)據(jù)實(shí)際保存在硬盤(或者光盤)的地址為多少的inode和block上,只需要記住這個(gè)文件的所屬目錄和文件名就好了。

在向磁盤分區(qū)寫入新數(shù)據(jù)之前,用戶不必關(guān)心硬盤上的哪個(gè)索引節(jié)點(diǎn)和塊地址有沒有被使用,硬盤上的存儲(chǔ)空間管理(分配和釋放)功能都是由文件系統(tǒng)自動(dòng)幫用戶完成的,用戶只需要記住數(shù)據(jù)被寫入到了哪個(gè)文件中或文件放于哪個(gè)目錄中即可。

在磁盤實(shí)際工作場(chǎng)景,即使給磁盤分區(qū)了,但如果沒有在磁盤格式化創(chuàng)建文件系統(tǒng),那么磁盤是無法存儲(chǔ)數(shù)據(jù)的。因此,在磁盤分區(qū)后能夠使用之前必須要格孝悄式化成相應(yīng)的文件系統(tǒng)才行。

9.1.4 常見文件系統(tǒng)類型介紹

隨著Linux系統(tǒng)的不斷發(fā)展,它所支持的文件系統(tǒng)格式也在迅速增多,當(dāng)今的Linux系統(tǒng)核心可以支持多種文件系統(tǒng)類型:如Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、B、SysV、PROC等還有一種文件系統(tǒng)是Filesystem in Userspace(FUSE)。它可以將文件系統(tǒng)的請(qǐng)求通過VFS虛擬文件系統(tǒng)發(fā)送回用戶空間。很多分布式文件系統(tǒng)例如:MFS就支持FUSE掛載的方式。。下表是一些常見文件類型的全稱、簡(jiǎn)稱和基本用途對(duì)應(yīng):

Linux支持的每個(gè)文件系統(tǒng)都有自己的優(yōu)缺點(diǎn)和性能特征。文件系統(tǒng)的一個(gè)重要屬性是日志功能,它允許系統(tǒng)在崩潰后更快地恢復(fù)。通常,日志文件系統(tǒng)比非日志文件系統(tǒng)在數(shù)據(jù)保護(hù)方面會(huì)更好一些。

1.ext2 文件系統(tǒng)

也稱為第二擴(kuò)展文件系統(tǒng)(英語:second extended filesystem,縮寫為 ext2),目的是克服早期 Linux 版本中使用的Minix文件系統(tǒng)的缺點(diǎn)。多年來,該文件系統(tǒng)一直廣泛應(yīng)用于Linux。但 ext2 中沒有日志,現(xiàn)在基本上已被ext3(Centos5.x默認(rèn)的文件系統(tǒng))取代,ext3文件系統(tǒng)也正逐漸被ext4取代(Centos6.x默認(rèn)的文件系統(tǒng))。

ext2開始由Rémy Card設(shè)計(jì),用以代替ext,于1993年1月加入linux核心支持之中。ext2的經(jīng)典實(shí)現(xiàn)為L(zhǎng)INUX內(nèi)核中的ext2fs文件系統(tǒng)驅(qū)動(dòng),更大可支持2TB的文件系統(tǒng),至linux核心2.6版時(shí),擴(kuò)展到可支持32TB。其他的實(shí)現(xiàn)包括GNU Hurd, Mac OS X (第3方), Darwin (第3方), BSD。ext2為數(shù)個(gè)LINUX發(fā)行版的默認(rèn)文件系統(tǒng),如Debian、Red Hat Linux、Centos等。

2.ext3 文件系統(tǒng)

為了避免上述提到的ext2文件系統(tǒng)不一致的情況發(fā)生,人們想到了一個(gè)方式, 在filesystem當(dāng)中規(guī)劃出一個(gè)區(qū)塊,該區(qū)塊專門記錄寫入或修訂文件時(shí)的步驟, 就可以簡(jiǎn)化一致性檢查的步驟了。也就是說:

1)預(yù)備:當(dāng)系統(tǒng)要寫入一個(gè)文件時(shí),會(huì)先在日志記錄區(qū)塊中記錄某個(gè)文件準(zhǔn)備要寫入的信息;

2) 實(shí)際寫入:開始寫入檔案的權(quán)限與數(shù)據(jù);開始更新metadata的數(shù)據(jù);

3)結(jié)束:完成數(shù)據(jù)與metadata的更新后,在日志記錄區(qū)塊當(dāng)中完成該檔案的記錄。

在這樣的程序當(dāng)中,萬一數(shù)據(jù)的記錄過程當(dāng)中収發(fā)生了問題,那么我們的系統(tǒng)只要去檢查日志記錄區(qū)塊, 就可以知道那個(gè)文件發(fā)生了問題,針對(duì)該問題來做一致性的檢查即可,而不必針對(duì)整塊 filesystem 去檢查, 這樣就可以達(dá)到快速修復(fù)filesystem的能力了!這就是日志式文件系統(tǒng)最基礎(chǔ)的功能。

Ext3就是日志文件系統(tǒng),Ext3是Ext2的升級(jí)版本,并且可以向下兼容Ext2。目前建議大家直接使用Ext3這個(gè)文件系統(tǒng)。

ext3文件系統(tǒng)向標(biāo)準(zhǔn)ext2文件系統(tǒng)添加了日志功能,因此是一個(gè)非常穩(wěn)定的文件系統(tǒng)的一個(gè)演化發(fā)展。它在大多數(shù)情況下提供合理的性能并且仍舊在改進(jìn)。由于它在可靠的 ext2文件系統(tǒng)之上添加了日志功能,因此可以將現(xiàn)有ext2文件系統(tǒng)轉(zhuǎn)換為ext3文件系統(tǒng),并且在必要時(shí)還可以轉(zhuǎn)換回來。ext3 文件系統(tǒng)是一個(gè)成熟的文件系統(tǒng),用作Redhat/Centos發(fā)行版上的默認(rèn)文件系統(tǒng)。

3.ext4文件系統(tǒng)

Linux kernel 自 2.6.28 開始正式支持新的文件系統(tǒng) Ext4。 Ext4 是 Ext3 的改進(jìn)版,修改了 Ext3 中部分重要的數(shù)據(jù)結(jié)構(gòu),而不僅僅像 Ext3 對(duì) Ext2 那樣,只是增加了一個(gè)日志功能而已。Ext4 可以提供更佳的性能和可靠性,還有更為豐富的功能:

1)與 Ext3 兼容。 執(zhí)行若干條命令,就能從 Ext3 在線遷移到 Ext4,而無須重新格式化磁盤或重新安裝系統(tǒng)。原有Ext3數(shù)據(jù)結(jié)構(gòu)照樣保留,Ext4 作用于新數(shù)據(jù),當(dāng)然,整個(gè)文件系統(tǒng)因此也就獲得了Ext4所支持的更大容量。

2) 更大的文件系統(tǒng)和更大的文件。 較之Ext3目前所支持的更大16TB文件系統(tǒng)和更大2TB文件,Ext4 分別支持1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系統(tǒng),以及16TB的文件。

3) 無限數(shù)量的子目錄。 Ext3 目前只支持 32,000 個(gè)子目錄,而 Ext4 支持無限數(shù)量的子目錄。

4) Extents。 Ext3 采用間接塊映射,當(dāng)操作大文件時(shí),效率低下。比如一個(gè)100MB 大小的文件,在 Ext3 中要建立 25,600 個(gè)數(shù)據(jù)塊(每個(gè)數(shù)據(jù)塊大小為4KB)的映射表。而 Ext4 引入了現(xiàn)代文件系統(tǒng)中流行的extents概念,每個(gè)extent 為一組連續(xù)的數(shù)據(jù)塊,上述文件則表示為“該文件數(shù)據(jù)保存在接下來的25,600個(gè)數(shù)據(jù)塊中”,提高了不少效率。

5) 多塊分配。 當(dāng)寫入數(shù)據(jù)到Ext3文件系統(tǒng)中時(shí),Ext3的數(shù)據(jù)塊分配器每次只能分配一個(gè) 4KB的塊,寫一個(gè)100MB 文件就要調(diào)用25,600次數(shù)據(jù)塊分配器,而Ext4的多塊分配器“multiblock allocator”(mballoc) 支持一次調(diào)用分配多個(gè)數(shù)據(jù)塊。

6) 延遲分配。 Ext3的數(shù)據(jù)塊分配策略是盡快分配,而Ext4和其它現(xiàn)代文件操作系統(tǒng)的策略是盡可能地延遲分配,直到文件在cache中寫完才開始分配數(shù)據(jù)塊并寫入磁盤,這樣就能優(yōu)化整個(gè)文件的數(shù)據(jù)塊分配,與前兩種特性搭配起來可以顯著提升性能。

7) 快速fsck。 以前執(zhí)行fsck之一步就會(huì)很慢,因?yàn)樗獧z查所有的inode,現(xiàn)在Ext4給每個(gè)組的inode表中都添加了一份未使用inode的列表,今后fsck Ext4 文件系統(tǒng)就可以跳過它們而只去檢查那些在用的inode了。

8) 日志校驗(yàn)。 日志是最常用的部分,也極易導(dǎo)致磁盤硬件故障,而從損壞的日志中恢復(fù)數(shù)據(jù)會(huì)導(dǎo)致更多的數(shù)據(jù)損壞。Ext4 的日志校驗(yàn)功能可以很方便地判斷日志數(shù)據(jù)是否損壞,而且它將Ext3的兩階段日志機(jī)制合并成一個(gè)階段,在增加安全性的同時(shí)提高了性能。

9) “無日志”(No Journaling)模式。 日志總歸有一些開銷,Ext4允許關(guān)閉日志,以便某些有特殊需求的用戶可以借此提升性能。

10) 在線碎片整理。 盡管延遲分配、多塊分配和extents能有效減少文件系統(tǒng)碎片,但碎片還是不可避免會(huì)產(chǎn)生。Ext4支持在線碎片整理,并將提供e4defrag工具進(jìn)行個(gè)別文件或整個(gè)文件系統(tǒng)的碎片整理。

inode相關(guān)特性。 Ext4支持更大的inode,較之Ext3 默認(rèn)的inode 大小 128 字節(jié),Ext4 為了在inode中容納更多的擴(kuò)展屬性(如納秒時(shí)間戳或inode版本),默認(rèn)inode大小為256字節(jié)。Ext4 還支持快速擴(kuò)展屬性(fast extended attributes)和inode保留(inodes reservation)。

12) 持久預(yù)分配(Persistent preallocation)。 P2P 軟件為了保證下載文件有足夠的空間存放,常常會(huì)預(yù)先創(chuàng)建一個(gè)與所下載文件大小相同的空文件,以免未來的數(shù)小時(shí)或數(shù)天之內(nèi)磁盤空間不足導(dǎo)致下載失敗。 Ext4在文件系統(tǒng)層面實(shí)現(xiàn)了持久預(yù)分配并提供相應(yīng)的API(libc 中的 posix_fallocate()),比應(yīng)用軟件自己實(shí)現(xiàn)更有效率。

13) 默認(rèn)啟用barrier。 磁盤上配有內(nèi)部緩存,以便重新調(diào)整批量數(shù)據(jù)的寫操作順序,優(yōu)化寫入性能,因此文件系統(tǒng)必須在日志數(shù)據(jù)寫入磁盤之后才能寫commit記錄,若commit記錄寫入在先,而日志有可能損壞,那么就會(huì)影響數(shù)據(jù)完整性。Ext4 默認(rèn)啟用barrier,只有當(dāng)barrier之前的數(shù)據(jù)全部寫入磁盤,才能寫barrier之后的數(shù)據(jù)。(可通過 “mount -o barrier=0” 命令禁用該特性。)

4.ReiserFS 文件系統(tǒng)

ReiserFS是一個(gè)基于B狀樹的文件系統(tǒng),擁有非常好的總體性能,特別是對(duì)于大量小文件。ReiserFS 擁有良好的伸縮性并具有日志功能。但該文件系統(tǒng)不再受到積極開發(fā),不支持SELinux,基本上已被 Reiser4 取代。ReiserFS文件系統(tǒng)多年來一直用作一些發(fā)行版(包括SUSE)的默認(rèn)文件系統(tǒng),但現(xiàn)在用得少了。

5.XFS文件系統(tǒng)

XFS文件系統(tǒng)擁有日志功能,包含一些健壯的特性,并針對(duì)可伸縮性進(jìn)行了優(yōu)化。XFS在RAM中強(qiáng)制緩存中轉(zhuǎn)數(shù)據(jù),因此如果使用 XFS,建議采用不間斷電源供應(yīng)。淘寶的數(shù)據(jù)庫在使用此文件系統(tǒng)。

XFS 最初是由 Silicon Graphics,Inc. 于90年代初開發(fā)的。那時(shí),SGI發(fā)現(xiàn)他們的現(xiàn)有文件系統(tǒng)(existing filesystem,EFS)正在迅速變得不適應(yīng)當(dāng)時(shí)激烈的計(jì)算競(jìng)爭(zhēng)。為解決這個(gè)問題,SGI 決定設(shè)計(jì)一種全新的高性能64位文件系統(tǒng),而不是試圖調(diào)整EFS在先天設(shè)計(jì)上的某些缺陷。因此,XFS 誕生了,并于 1994 年隨 IRIX 5.3 的發(fā)布而應(yīng)用于計(jì)算。它至今仍作為 SGI 基于 IRIX 的產(chǎn)品(從工作站到超級(jí)計(jì)算機(jī))的底層文件系統(tǒng)來使用。現(xiàn)在,XFS 也可以用于 Linux。XFS的Linux 版的到來是激動(dòng)人心的,首先因?yàn)樗鼮?Linux 社區(qū)提供了一種健壯的、優(yōu)秀的以及功能豐富的文件系統(tǒng),并且這種文件系統(tǒng)所具有的可伸縮性能夠滿足最苛刻的存儲(chǔ)需求。

6.vfat 文件系統(tǒng)

vfat 文件系統(tǒng)(也稱為 FAT32)沒有日志功能,且缺乏完整的 Linux 文件系統(tǒng)實(shí)現(xiàn)所需的許多特性。它可用于在 Windows 和 Linux 系統(tǒng)之間交換數(shù)據(jù),因?yàn)?Windows 和 Linux 都能讀取它。不要將這個(gè)文件系統(tǒng)用于 Linux,除非要在 Windows 和 Linux 之間共享數(shù)據(jù)。如果您在一個(gè) vfat 磁盤上解壓縮一個(gè) Linux 歸檔文件,那么您將丟失權(quán)限(比如執(zhí)行權(quán)限),還會(huì)丟失該歸檔文件中可能存儲(chǔ)的符號(hào)鏈接。

7.VFS虛擬文件系統(tǒng)

虛擬文件系統(tǒng)VFS也稱為虛擬文件系統(tǒng)開關(guān)(Virtual filesystem Switch),它是內(nèi)核的一個(gè)子系統(tǒng),提供了一個(gè)通用文件系統(tǒng)模型,該模型囊括了所能見到的文件系統(tǒng)常用功能和行為,并為應(yīng)用程序提供一致性的文件系統(tǒng)接口,安裝的所有物理文件系統(tǒng)不但依賴于VFS共存,而且也依靠VFS協(xié)同工作。它的主要設(shè)計(jì)思想有以下3點(diǎn):

(1)應(yīng)用層:VFS模型源于UNIX文件系統(tǒng),使得用戶可以直接使用標(biāo)準(zhǔn)UNIX文件系統(tǒng)調(diào)用來操作文件,無需考慮具體文件系統(tǒng)特性和物理存儲(chǔ)介質(zhì),通過VFS訪問文件系統(tǒng),才使得不同文件系統(tǒng)之間的協(xié)作性和通用性成為可能。

(2)虛擬層:在對(duì)所有具體文件系統(tǒng)的共同特性進(jìn)行抽象的基礎(chǔ)上,形成一個(gè)與具體文件系統(tǒng)實(shí)現(xiàn)無關(guān)的虛擬層,并在此層次上定義與用戶的一致性接口;

(3)實(shí)現(xiàn)層:該層使用類似開關(guān)表技術(shù)進(jìn)行具體文件系統(tǒng)轉(zhuǎn)接,實(shí)現(xiàn)各種文件系統(tǒng)的物理操作細(xì)節(jié),每個(gè)文件系統(tǒng)是自包含的,包含文件系統(tǒng)實(shí)現(xiàn)的各種設(shè)施,如超級(jí)塊、節(jié)點(diǎn)區(qū)、數(shù)據(jù)區(qū)以及各種數(shù)據(jù)結(jié)構(gòu)和文件類的操作函數(shù)。

一般地說,VFS提供以下功能:

?記錄可用的文件系統(tǒng)類型;

?把文件系統(tǒng)與對(duì)應(yīng)的存儲(chǔ)設(shè)備聯(lián)系起來;

?處理面向文件的通用操作;

?涉及具體文件系統(tǒng)的操作時(shí),把它們映射到相關(guān)的具體文件系統(tǒng)。

VFS抽象層之所以能銜接各種不同的文件系統(tǒng),是因?yàn)樗x了所有文件系統(tǒng)都支持的基本抽象接口和數(shù)據(jù)結(jié)構(gòu),同時(shí)具體的文件系統(tǒng)也將自己的諸如“文件如何打開”、“目錄如何定義”等概念在形式上與VFS的定義保持一致。對(duì)于像FAT和NTFS這類非UNIX風(fēng)格文件系統(tǒng),必須經(jīng)過封裝,提供符合VFS概念的接口。比如,一個(gè)文件系統(tǒng)不支持inode概念,它也必須在內(nèi)存中裝配inode結(jié)構(gòu)體,就像它本身包含inode一樣。這些裝配和轉(zhuǎn)換需要在使用現(xiàn)場(chǎng)引入特別處理,使得非UNIX文件系統(tǒng)能夠兼容UNIX文件系統(tǒng)的使用規(guī)則和滿足VFS的需求,這樣一來,非UNIX文件系統(tǒng)便可與VFS一道工作,只是性能上會(huì)有少許影響。

下面看一個(gè)文件操作的例子,假如應(yīng)用程序執(zhí)行如下文件操作:write(fd,&buf,len);要求將buf指針指向的、長(zhǎng)度為len字節(jié)的數(shù)據(jù)寫入文件描述符fd對(duì)應(yīng)的文件的當(dāng)前位置。

用戶執(zhí)行的系統(tǒng)調(diào)用首先被VFS的sys_write( )處理,該函數(shù)首先處理一些與設(shè)備無關(guān)的操作,并找到f所在的文件系統(tǒng),再根據(jù)VFS結(jié)構(gòu)及它的inode數(shù)據(jù)結(jié)構(gòu)提供的信息,重定向到具體文件系統(tǒng)中相對(duì)應(yīng)的寫函數(shù),由它來處理與特定設(shè)備相關(guān)的操作,并把數(shù)據(jù)寫到物理介質(zhì)。

類似于 Windows下的C、D、E等各個(gè)盤,Linux系統(tǒng)也可以將磁盤、Flash等存儲(chǔ)設(shè)備劃分為若干個(gè)分區(qū),在不同分區(qū)存放不同類別的文件。與Windows的C盤類似,Linux一樣要在一個(gè)分區(qū)上存放系統(tǒng)啟動(dòng)所必需的文件,比如內(nèi)核映象文件(在嵌入式系統(tǒng)中,內(nèi)核一般單獨(dú)存放在一個(gè)分區(qū)中)內(nèi)核啟動(dòng)后運(yùn)行的之一-個(gè)程序( init)給用戶提供操作界面的 shell程序、應(yīng)用程序所依賴的庫等。這些必需、基本的文件早氏合稱為根文件系統(tǒng),它們存放在一個(gè)分區(qū)中。Linux 系統(tǒng)啟動(dòng)后首先掛接這個(gè)分區(qū),稱為掛接( mount)根文件系統(tǒng)。其他分梁睜數(shù)區(qū)上所有目錄、文件的,也稱為文件系統(tǒng)。Linux 中并沒有C、D、E等盤符的概念,它以樹狀結(jié)構(gòu)管理所有目錄、文件,其他分區(qū)掛接在某個(gè)目錄上,這個(gè)目錄被稱為掛接點(diǎn)或安裝點(diǎn)(mount point),然后就可以通過這個(gè)目錄來訪問這個(gè)分區(qū)上的文件了。比如根文件系統(tǒng)被掛接在根目錄“I”上后,在根目錄下就有根文件系統(tǒng)的各個(gè)目錄、文件:/bin、/in、/mnt等;再將其他分區(qū)掛接到/mnt目錄上,/mnt目錄下就有這個(gè)分區(qū).的各個(gè)目錄、文件。在一個(gè)分區(qū)上存儲(chǔ)文件時(shí),需要遵循一定的格式,這種格式稱為文橡首件系統(tǒng)類型,比如fat16、fat32、ntfs、ext2、ext3、jffs2、yaffs 等。除這些擁有實(shí)實(shí)在在的存儲(chǔ)分區(qū)的文件系統(tǒng)類型外,Linux還有幾種虛擬的文件系統(tǒng)類型,比如proc、sysfs 等,它們的文件并不存儲(chǔ)在實(shí)際的設(shè)備上,而是在訪問它們時(shí)由內(nèi)核臨時(shí)生成。比如 proc文件系統(tǒng)下的uptime文件,讀取它時(shí)可以得到兩個(gè)時(shí)間值(用來表示系統(tǒng)啟動(dòng)后運(yùn)行的秒數(shù)、空閑的秒數(shù)),每次讀取時(shí)都由內(nèi)核即刻生成,每次讀取結(jié)果都不一樣。“文件系統(tǒng)類型”常被簡(jiǎn)稱為“文件系統(tǒng)”,比如“硬盤第二個(gè)分區(qū)上的文件系統(tǒng)是EXT2”指的就是文件系統(tǒng)類型。所以“文件系統(tǒng)”這個(gè)術(shù)語,有時(shí)候指的是分區(qū)上的文件,有時(shí)候指的是文件系統(tǒng)類型,需要根據(jù)語境分辨,在閱讀各類文獻(xiàn)時(shí)需要注意這點(diǎn)。

程序員必備知識(shí)(操作系統(tǒng)5-文件系統(tǒng))

本篇與之前的第三篇的內(nèi)存管理知識(shí)點(diǎn)有相似的地方

對(duì)于運(yùn)行的進(jìn)程來說,內(nèi)存就像一個(gè)紙箱子, 僅僅是一個(gè)暫存數(shù)據(jù)的地方, 而且空間有限。如果我們想要進(jìn)程結(jié)束之后,數(shù)據(jù)依然能夠保存下來,就不能只保存在內(nèi)存里,而是應(yīng)該保存在 外部存儲(chǔ) 中。就像圖書館這種地方,不僅空間大,而且能夠永久保存。

我們最常用的外部存儲(chǔ)就是 硬盤 ,數(shù)據(jù)是以文件的形式保存在硬盤上的。為了管理這些文件,我們?cè)谝?guī)劃文件系統(tǒng)的時(shí)候,需要考慮到以下幾點(diǎn)。

之一點(diǎn),文件系統(tǒng)要有嚴(yán)格的組織形式,使得文件能夠 以塊為單位進(jìn)行存儲(chǔ) 。這就像圖書館里,我們會(huì)給設(shè)置一排排書架,然后再把書架分成一個(gè)個(gè)小格子,有的項(xiàng)目存放的資料非常多,一個(gè)格子放不下,就需要多個(gè)格子來進(jìn)行存放。我們把這個(gè)區(qū)域稱為存放原始資料的 倉庫區(qū) 。

第二點(diǎn),文件系統(tǒng)中也要有 索引區(qū) ,用來方便查找一個(gè)文件分成的多個(gè)塊都存放在了什么位置。這就好比,圖書館的書太多了,為了方便查找,我們需要專門設(shè)置一排書架,這里面會(huì)寫清楚整個(gè)檔案庫有哪些資料,資料在哪個(gè)架子的哪個(gè)格子上。這樣找資料的時(shí)候就不用跑遍整個(gè)檔案庫,在這個(gè)書架上找到后,直奔目標(biāo)書架就可以了。

第三點(diǎn),如果文件系統(tǒng)中有的文件是熱點(diǎn)文件,近期經(jīng)常被讀取和寫入,文件系統(tǒng)應(yīng)該有 緩存層 。這就相當(dāng)于圖書館里面的熱門圖書區(qū),這里面的書都是暢銷書或者是常常被借還的圖書。因?yàn)榻柽€的次數(shù)比較多,那就沒必要每次有人還了之后,還放回遙遠(yuǎn)的貨架,我們可以專門開辟一個(gè)區(qū)域, 放置這些借還頻次高此明的圖書。這樣借還的效率就會(huì)提高。

第四點(diǎn),文件應(yīng)該用 文件夾 的形式組織起來,方便管理和查詢。這就像在圖書館里面,你可以給這些資料分門別類,比如分成計(jì)算機(jī)類.文學(xué)類.歷史類等等。這樣你也容易管理,項(xiàng)目組借閱的時(shí)候只要在某個(gè)類別中去找就可以了。

在文件系統(tǒng)中,每個(gè)文件都有友扒敬一個(gè)名字,這樣我們?cè)L問一個(gè)文件,希望通過它的名字就可以找到。文件名就是一個(gè)普通的文本。 當(dāng)然文件名會(huì)經(jīng)常沖突,不同用戶取相同的名字的情況還是會(huì)經(jīng)常出現(xiàn)的。

要想把很多的文件有序地組織起來,我們就需要把它們成為 目錄 或者文件夾。這樣,一個(gè)文件夾里可以包含文件夾,也可以包含文件,這樣就形成了一種 樹形結(jié)構(gòu) 。而我們可以將不同的用戶放在不同的用戶目錄下,就可以一定程度上避免了命名的沖突問題。

第五點(diǎn),Linux 內(nèi)核要在自己的內(nèi)存里面維護(hù)一套數(shù)據(jù)結(jié)構(gòu),來保存哪些文件被哪些進(jìn)程打開和使用 。這就好比,圖書館里會(huì)有個(gè)圖書管理系統(tǒng),記錄哪些書被借閱了,被誰借閱了,借閱了多久,什么時(shí)候歸還。

文件系統(tǒng)是操作系統(tǒng)中負(fù)責(zé)管理持久數(shù)據(jù)的子系統(tǒng),說簡(jiǎn)單點(diǎn),就是負(fù)責(zé)把用戶的文件存到磁盤硬件中,因?yàn)榧词褂?jì)算機(jī)斷電了,磁盤里的數(shù)據(jù)并不會(huì)丟失,所以可以持久化的保存文件。

文件系統(tǒng)的基本數(shù)據(jù)單位是 文件 ,它的目的是對(duì)磁盤上的文件進(jìn)行組織管理,那組織的方式不同,就會(huì)形成不同的文件系統(tǒng)。

Linux最經(jīng)典的一句話是:“一切皆文件”,不僅普通的文件和目錄,就連塊設(shè)備、管道、socket 等,也都是統(tǒng)一交給文件系統(tǒng)管理的。

Linux文件系統(tǒng)會(huì)為每個(gè)文件分配兩個(gè)數(shù)據(jù)結(jié)構(gòu): 索引節(jié)點(diǎn)(index node) 和 目錄項(xiàng)(directory entry) ,它們主要用來記錄文件的元信息和目錄層次結(jié)構(gòu)。

●索引節(jié)點(diǎn),也就是inode, 用來記錄文件的元信息,比如inode編號(hào)、文件大小訪問權(quán)限、創(chuàng)建時(shí)間、修改時(shí)間、 數(shù)據(jù)在磁盤的位置 等等。 索引節(jié)點(diǎn)是文件的唯一標(biāo)識(shí) ,它們之間一一對(duì)應(yīng), 也同樣都會(huì)被 存儲(chǔ)在硬盤 中,所以索引節(jié)點(diǎn)同樣占用磁盤空間。好慎

●目錄項(xiàng),也就是dentry, 用來記錄文件的名字、索引節(jié)點(diǎn)指針以及與其他目錄項(xiàng)的層級(jí)關(guān)聯(lián)關(guān)系。多個(gè)目錄項(xiàng)關(guān)聯(lián)起來,就會(huì)形成 目錄結(jié)構(gòu) ,但它與索引節(jié)點(diǎn)不同的是,目錄項(xiàng)是由內(nèi)核維護(hù)的一個(gè)數(shù)據(jù)結(jié)構(gòu),不存放于磁盤,而是 緩存在內(nèi)存 。

由于索引節(jié)點(diǎn)唯一標(biāo)識(shí)一個(gè)文件,而目錄項(xiàng)記錄著文件的名,所以目錄項(xiàng)和索引節(jié)點(diǎn)的關(guān)系是多對(duì)一,也就是說,一個(gè)文件可以有多個(gè)別字。比如,硬鏈接的實(shí)現(xiàn)就是多個(gè)目錄項(xiàng)中的索引節(jié)點(diǎn)指向同一個(gè)文件。

注意,目錄也是文件,也是用索引節(jié)點(diǎn)唯一標(biāo)識(shí),和普通文件不同的是,普通文件在磁盤里面保存的是文件數(shù)據(jù),而目錄文件在磁盤里面保存子目錄或文件。

(PS:目錄項(xiàng)和目錄不是一個(gè)東西!你也不是一個(gè)東西(^_=), 雖然名字很相近,但目錄是個(gè)文件。持久化存儲(chǔ)在磁盤,而目錄項(xiàng)是內(nèi)核一個(gè)數(shù)據(jù)結(jié)構(gòu),緩存在內(nèi)存。

如果查詢目錄頻繁從磁盤讀,效率會(huì)很低,所以內(nèi)核會(huì)把已經(jīng)讀過的目錄用目錄項(xiàng)這個(gè)數(shù)據(jù)結(jié)構(gòu)緩存在內(nèi)存,下次再次讀到相同的目錄時(shí),只需從內(nèi)存讀就可以,大大提高了 文件系統(tǒng)的效率。

目錄項(xiàng)這個(gè)數(shù)據(jù)結(jié)構(gòu)不只是表示目錄,也是可以表示文件的。)

磁盤讀寫的最小單位是 扇區(qū) ,扇區(qū)的大小只有512B大小,很明顯,如果每次讀寫都以這么小為單位,那這讀寫的效率會(huì)非常低。

所以,文件系統(tǒng)把多個(gè)扇區(qū)組成了一個(gè) 邏輯塊 ,每次讀寫的最小單位就是邏輯塊(數(shù)據(jù)塊) , Linux中的邏輯塊大小為4KB,也就是一次性讀寫 8個(gè)扇區(qū),這將大大提高了磁盤的讀寫的效率。

以上就是索引節(jié)點(diǎn)、目錄項(xiàng)以及文件數(shù)據(jù)的關(guān)系,下面這個(gè)圖就很好的展示了它們之間的關(guān)系:

索引節(jié)點(diǎn)是存儲(chǔ)在硬盤上的數(shù)據(jù),那么為了加速文件的訪問,通常會(huì)把索引節(jié)點(diǎn)加載到內(nèi)存中。

另外,磁盤進(jìn)行格式化的時(shí)候,會(huì)被分成三個(gè)存儲(chǔ)區(qū)域,分別是超級(jí)塊、索引節(jié)點(diǎn)區(qū)和數(shù)據(jù)塊區(qū)。

●超級(jí)塊,用來存儲(chǔ)文件系統(tǒng)的詳細(xì)信息,比如塊個(gè)數(shù)、塊大小、空閑塊等等。

●索引節(jié)點(diǎn)區(qū),用來存儲(chǔ)索引節(jié)點(diǎn);

●數(shù)據(jù)塊區(qū),用來存儲(chǔ)文件或目錄數(shù)據(jù);

我們不可能把超級(jí)塊和索引節(jié)點(diǎn)區(qū)全部加載到內(nèi)存,這樣內(nèi)存肯定撐不住,所以只有當(dāng)需要使用的時(shí)候,才將其加載進(jìn)內(nèi)存,它們加載進(jìn)內(nèi)存的時(shí)機(jī)是不同的.

●超級(jí)塊:當(dāng)文件系統(tǒng)掛載時(shí)進(jìn)入內(nèi)存;

●索引節(jié)點(diǎn)區(qū):當(dāng)文件被訪問時(shí)進(jìn)入內(nèi)存;

文件系統(tǒng)的種類眾多,而操作系統(tǒng)希望 對(duì)用戶提供一個(gè)統(tǒng)一的接口 ,于是在用戶層與文件系統(tǒng)層引入了中間層,這個(gè)中間層就稱為 虛擬文件系統(tǒng)(Virtual File System, VFS) 。

VFS定義了一組所有文件系統(tǒng)都支持的數(shù)據(jù)結(jié)構(gòu)和標(biāo)準(zhǔn)接口,這樣程序員不需要了解文件系統(tǒng)的工作原理,只需要了解VFS提供的統(tǒng)一接口即可。

在Linux文件系統(tǒng)中,用戶空間、系統(tǒng)調(diào)用、虛擬機(jī)文件系統(tǒng)、緩存、文件系統(tǒng)以及存儲(chǔ)之間的關(guān)系如下圖:

Linux支持的文件系統(tǒng)也不少,根據(jù)存儲(chǔ)位置的不同,可以把文件系統(tǒng)分為三類:

●磁盤的文件系統(tǒng),它是直接把數(shù)據(jù)存儲(chǔ)在磁盤中,比如Ext 2/3/4. XFS 等都是這類文件系統(tǒng)。

●內(nèi)存的文件系統(tǒng),這類文件系統(tǒng)的數(shù)據(jù)不是存儲(chǔ)在硬盤的,而是占用內(nèi)存空間,我們經(jīng)常用到的/proc 和/sys文件系統(tǒng)都屬于這一類,讀寫這類文件,實(shí)際上是讀寫內(nèi)核中相關(guān)的數(shù)據(jù)。

●網(wǎng)絡(luò)的文件系統(tǒng),用來訪問其他計(jì)算機(jī)主機(jī)數(shù)據(jù)的文件系統(tǒng),比如NFS. B等等。

文件系統(tǒng)首先要先掛載到某個(gè)目錄才可以正常使用,比如Linux系統(tǒng)在啟動(dòng)時(shí),會(huì)把文件系統(tǒng)掛載到根目錄。

在操作系統(tǒng)的輔助之下,磁盤中的數(shù)據(jù)在計(jì)算機(jī)中都會(huì)呈現(xiàn)為易讀的形式,并且我們不需要關(guān)心數(shù)據(jù)到底是如何存放在磁盤中,存放在磁盤的哪個(gè)地方等等問題,這些全部都是由操作系統(tǒng)完成的。

那么,文件數(shù)據(jù)在磁盤中究竟是怎么樣的呢?我們來一探究竟!

磁盤中的存儲(chǔ)單元會(huì)被劃分為一個(gè)個(gè)的“ 塊 ”,也被稱為 扇區(qū) ,扇區(qū)的大小一般都為512byte.這說明即使一塊數(shù)據(jù)不足512byte,那么它也要占用512byte的磁盤空間。

而幾乎所有的文件系統(tǒng)都會(huì)把文件分割成固定大小的塊來存儲(chǔ),通常一個(gè)塊的大小為4K。如果磁盤中的扇區(qū)為512byte,而文件系統(tǒng)的塊大小為4K,那么文件系統(tǒng)的存儲(chǔ)單元就為8個(gè)扇區(qū)。這也是前面提到的一個(gè)問題,文件大小和占用空間之間有什么區(qū)別?文件大小是文件實(shí)際的大小,而占用空間則是因?yàn)榧词顾膶?shí)際大小沒有達(dá)到那么大,但是這部分空間實(shí)際也被占用,其他文件數(shù)據(jù)無法使用這部分的空間。所以我們 寫入1byte的數(shù)據(jù)到文本中,但是它占用的空間也會(huì)是4K。

這里要注意在Windows下的NTFS文件系統(tǒng)中,如果一開始文件數(shù)據(jù)小于 1K,那么則不會(huì)分配磁盤塊來存儲(chǔ),而是存在一個(gè)文件表中。但是一旦文件數(shù)據(jù)大于1K,那么不管以后文件的大小,都會(huì)分配以4K為單位的磁盤空間來存儲(chǔ)。

與內(nèi)存管理一樣,為了方便對(duì)磁盤的管理,文件的邏輯地址也被分為一個(gè)個(gè)的文件塊。于是文件的邏輯地址就是(邏輯塊號(hào),塊內(nèi)地址)。用戶通過邏輯地址來操作文件,操作系統(tǒng)負(fù)責(zé)完成邏輯地址與物理地址的映射。

不同的文件系統(tǒng)為文件分配磁盤空間會(huì)有不同的方式,這些方式各自都有優(yōu)缺點(diǎn)。

連續(xù)分配要求每個(gè)文件在磁盤上有一組連續(xù)的塊,該分配方式較為簡(jiǎn)單。

通過上圖可以看到,文件的邏輯塊號(hào)的順序是與物理塊號(hào)相同的,這樣就可以實(shí)現(xiàn)隨機(jī)存取了,只要知道了之一個(gè)邏輯塊的物理地址, 那么就可以快速訪問到其他邏輯塊的物理地址。那么操作系統(tǒng)如何完成邏輯塊與物理塊之間的映射呢?實(shí)際上,文件都是存放在目錄下的,而目錄是一種有結(jié)構(gòu)文件, 所以在文件目錄的記錄中會(huì)存放目錄下所有文件的信息,每一個(gè)文件或者目錄都是一個(gè)記錄。 而這些信息就包括文件的起始?jí)K號(hào)和占有塊號(hào)的數(shù)量。

那么操作系統(tǒng)如何完成邏輯塊與物理塊之間的映射呢? (邏輯塊號(hào), 塊內(nèi)地址) -> (物理塊號(hào), 塊內(nèi)地址),只需要知道邏輯塊號(hào)對(duì)應(yīng)的物理塊號(hào)即可,塊內(nèi)地址不變。

用戶訪問一個(gè)文件的內(nèi)容,操作系統(tǒng)通過文件的標(biāo)識(shí)符找到目錄項(xiàng)FCB, 物理塊號(hào)=起始?jí)K號(hào)+邏輯塊號(hào)。 當(dāng)然,還需要檢查邏輯塊號(hào)是否合法,是否超過長(zhǎng)度等。因?yàn)榭梢愿鶕?jù)邏輯塊號(hào)直接算出物理塊號(hào),所以連續(xù)分配支持 順序訪問和隨機(jī)訪問 。

因?yàn)樽x/寫文件是需要移動(dòng)磁頭的,如果訪問兩個(gè)相隔很遠(yuǎn)的磁盤塊,移動(dòng)磁頭的時(shí)間就會(huì)變長(zhǎng)。使用連續(xù)分配來作為文件的分配方式,會(huì)使文件的磁盤塊相鄰,所以文件的讀/寫速度最快。

連續(xù)空間存放的方式雖然讀寫效率高,但是有 磁盤空間碎片 和 文件長(zhǎng)度不易擴(kuò)展 的缺陷。

如下圖,如果文件B被刪除,磁盤上就留下一塊空缺,這時(shí),如果新來的文件小于其中的一個(gè)空缺,我們就可以將其放在相應(yīng)空缺里。但如果該文件的大小大于所

有的空缺,但卻小于空缺大小之和,則雖然磁盤上有足夠的空缺,但該文件還是不能存放。當(dāng)然了,我們可以通過將現(xiàn)有文件進(jìn)行挪動(dòng)來騰出空間以容納新的文件,但是這個(gè)在磁盤挪動(dòng)文件是非常耗時(shí),所以這種方式不太現(xiàn)實(shí)。

另外一個(gè)缺陷是文件長(zhǎng)度擴(kuò)展不方便,例如上圖中的文件A要想擴(kuò)大一下,需要更多的磁盤空間,唯一的辦法就只能是挪動(dòng)的方式,前面也說了,這種方式效率是非常低的。

那么有沒有更好的方式來解決上面的問題呢?答案當(dāng)然有,既然連續(xù)空間存放的方式不太行,那么我們就改變存放的方式,使用非連續(xù)空間存放方式來解決這些缺陷。

非連續(xù)空間存放方式分為 鏈表方式 和 索引方式 。

鏈?zhǔn)椒峙洳扇‰x散分配的方式,可以為文件分配離散的磁盤塊。它有兩種分配方式:顯示鏈接和隱式鏈接。

隱式鏈接是只目錄項(xiàng)中只會(huì)記錄文件所占磁盤塊中的之一塊的地址和最后一塊磁盤塊的地址, 然后通過在每一個(gè)磁盤塊中存放一個(gè)指向下一 磁盤塊的指針, 從而可以根據(jù)指針找到下一塊磁盤塊。如果需要分配新的磁盤塊,則使用最后一塊磁盤塊中的指針指向新的磁盤塊,然后修改新的磁盤塊為最后的磁盤塊。

我們來思考一個(gè)問題, 采用隱式鏈接如何將實(shí)現(xiàn)邏輯塊號(hào)轉(zhuǎn)換為物理塊號(hào)呢?

用戶給出需要訪問的邏輯塊號(hào)i,操作系統(tǒng)需要找到所需訪問文件的目錄項(xiàng)FCB.從目錄項(xiàng)中可以知道文件的起始?jí)K號(hào),然后將邏輯塊號(hào)0的數(shù)據(jù)讀入內(nèi)存,由此知道1號(hào)邏輯塊的物理塊號(hào),然后再讀入1號(hào)邏輯塊的數(shù)據(jù)進(jìn)內(nèi)存,此次類推,最終可以找到用戶所需訪問的邏輯塊號(hào)i。訪問邏輯塊號(hào)i,總共需要i+ 1次磁盤1/0操作。

得出結(jié)論: 隱式鏈接分配只能順序訪問,不支持隨機(jī)訪問,查找效率低 。

我們來思考另外一個(gè)問題,采用隱式鏈接是否方便文件拓展?

我們知道目錄項(xiàng)中存有結(jié)束塊號(hào)的物理地址,所以我們?nèi)绻卣刮募?,只需要將新分配的磁盤塊掛載到結(jié)束塊號(hào)的后面即可,修改結(jié)束塊號(hào)的指針指向新分配的磁盤塊,然后修改目錄項(xiàng)。

得出結(jié)論: 隱式鏈接分配很方便文件拓展。所有空閑磁盤塊都可以被利用到,無碎片問題,存儲(chǔ)利用率高。

顯示鏈接是把用于鏈接各個(gè)物理塊的指針顯式地存放在一張表中,該表稱為文件分配表(FAT, File Allocation Table)。

由于查找記錄的過程是在內(nèi)存中進(jìn)行的,因而不僅顯著地 提高了檢索速度 ,而且 大大減少了訪問磁盤的次數(shù) 。但也正是整個(gè)表都存放在內(nèi)存中的關(guān)系,它的主要的缺點(diǎn)是 不適 用于大磁盤 。

比如,對(duì)于200GB的磁盤和1KB大小的塊,這張表需要有2億項(xiàng),每一項(xiàng)對(duì)應(yīng)于這2億個(gè)磁盤塊中的一個(gè)塊,每項(xiàng)如果需要4個(gè)字節(jié),那這張表要占用800MB內(nèi)存,很顯然FAT方案對(duì)于大磁盤而言不太合適。

一直都在,加油?。?゜Д゜)σ凸←自爆按鈕

鏈表的方式解決了連續(xù)分配的磁盤碎片和文件動(dòng)態(tài)打展的問題,但是不能有效支持直接訪問(FAT除外) ,索引的方式可以解決這個(gè)問題。

索引的實(shí)現(xiàn)是為每個(gè)文件創(chuàng)建一個(gè) 索引數(shù)據(jù)塊 ,里面存放的 是指向文件數(shù)據(jù)塊的指針列表 ,說白了就像書的目錄一樣,要找哪個(gè)章節(jié)的內(nèi)容,看目錄查就可以。

另外, 文件頭需要包含指向索引數(shù)據(jù)塊的指針 ,這樣就可以通過文件頭知道索引數(shù)據(jù)塊的位置,再通過索弓|數(shù)據(jù)塊里的索引信息找到對(duì)應(yīng)的數(shù)據(jù)塊。

創(chuàng)建文件時(shí),索引塊的所有指針都設(shè)為空。當(dāng)首次寫入第i塊時(shí),先從空閑空間中取得一個(gè)塊, 再將其地址寫到索引塊的第i個(gè)條目。

索引的方式優(yōu)點(diǎn)在于:

●文件的創(chuàng)建、增大、縮小很方便;

●不會(huì)有碎片的問題;

●支持順序讀寫和隨機(jī)讀寫;

由于索引數(shù)據(jù)也是存放在磁盤塊的,如果文件很小,明明只需一塊就可以存放的下,但還是需要額外分配一塊來存放索引數(shù)據(jù),所以缺陷之一就是存儲(chǔ)索引帶來的開銷。

如果文件很大,大到一個(gè)索引數(shù)據(jù)塊放不下索引信息,這時(shí)又要如何處理大文件的存放呢?我們可以通過組合的方式,來處理大文件的存儲(chǔ)。

先來看看 鏈表+索引 的組合,這種組合稱為 鏈?zhǔn)剿饕龎K ,它的實(shí)現(xiàn)方式是在 索引數(shù)據(jù)塊留出一個(gè)存放下一個(gè)索引數(shù)據(jù)塊的指針 ,于是當(dāng)一個(gè)索引數(shù)據(jù)塊的索引信息用完了,就可以通過指針的方式,找到下一個(gè)索引數(shù)據(jù)塊的信息。那這種方式也會(huì)出現(xiàn)前面提到的鏈表方式的問題,萬一某個(gè)指針損壞了,后面的數(shù)據(jù)也就會(huì)無法讀取了。

還有另外一種組合方式是 索引+索引 的方式,這種組合稱為多級(jí)索引塊,實(shí)現(xiàn)方式是通過一個(gè)索引塊來存放多個(gè)索引數(shù)據(jù)塊,一層套一層索引, 像極了俄羅斯套娃是吧?乛?乛?

前面說到的文件的存儲(chǔ)是針對(duì)已經(jīng)被占用的數(shù)據(jù)塊組織和管理,接下來的問題是,如果我要保存一個(gè)數(shù)據(jù)塊, 我應(yīng)該放在硬盤上的哪個(gè)位置呢?難道需要將所有的塊掃描一遍,找個(gè)空的地方隨便放嗎?

那這種方式效率就太低了,所以針對(duì)磁盤的空閑空間也是要引入管理的機(jī)制,接下來介紹幾種常見的方法:

●空閑表法

●空閑鏈表法

●位圖法

空閑表法

空閑表法就是為所有空閑空間建立一張表,表內(nèi)容包括空閑區(qū)的之一個(gè)塊號(hào)和該空閑區(qū)的塊個(gè)數(shù),注意,這個(gè)方式是連續(xù)分配的。如下圖:

當(dāng)請(qǐng)求分配磁盤空間時(shí),系統(tǒng)依次掃描空閑表里的內(nèi)容,直到找到一個(gè)合適的空閑區(qū)域?yàn)橹?。?dāng)用戶撤銷一個(gè)文件時(shí),系統(tǒng)回收文件空間。這時(shí),也需順序掃描空閑表,尋找一個(gè)空閑表?xiàng)l目并將釋放空間的之一個(gè)物理塊號(hào)及它占用的塊數(shù)填到這個(gè)條目中。

這種方法僅當(dāng)有少量的空閑區(qū)時(shí)才有較好的效果。因?yàn)?,如果存?chǔ)空間中有著大量的小的空閑區(qū),則空閑表變得很大,這樣查詢效率會(huì)很低。另外,這種分配技術(shù)適用于建立連續(xù)文件。

空閑鏈表法

我們也可以使用鏈表的方式來管理空閑空間,每一個(gè)空閑塊里有一個(gè)指針指向下一個(gè)空閑塊,這樣也能很方便的找到空閑塊并管理起來。如下圖:

當(dāng)創(chuàng)建文件需要一塊或幾塊時(shí),就從鏈頭上依次取下一塊或幾塊。反之,當(dāng)回收空間時(shí),把這些空閑塊依次接到鏈頭上。

這種技術(shù)只要在主存中保存一個(gè)指針, 令它指向之一個(gè)空閑塊。其特點(diǎn)是簡(jiǎn)單,但不能隨機(jī)訪問,工作效率低,因?yàn)槊慨?dāng)在鏈上增加或移動(dòng)空閑塊時(shí)需要做很多1/0操作,同時(shí)數(shù)據(jù)塊的指針消耗了一定的存儲(chǔ)空間。

空閑表法和空閑鏈表法都不適合用于大型文件系統(tǒng),因?yàn)檫@會(huì)使空閑表或空閑鏈表太大。

位圖法

位圖是利用二進(jìn)制的一位來表示磁盤中一個(gè)盤塊的使用情況,磁盤上所有的盤塊都有一個(gè)二進(jìn)制位與之對(duì)應(yīng)。

當(dāng)值為0時(shí),表示對(duì)應(yīng)的盤塊空閑,值為1時(shí),表示對(duì)應(yīng)的盤塊已分配。它形式如下:

在Linux文件系統(tǒng)就采用了位圖的方式來管理空閑空間,不僅用于數(shù)據(jù)空閑塊的管理,還用于inode空閑塊的管理,因?yàn)閕node也是存儲(chǔ)在磁盤的,自然也要有對(duì)其管理。

前面提到Linux是用位圖的方式管理空閑空間,用戶在創(chuàng)建一個(gè)新文件時(shí), Linux 內(nèi)核會(huì)通過inode的位圖找到空閑可用的inode,并進(jìn)行分配。要存儲(chǔ)數(shù)據(jù)時(shí),會(huì)通過塊的位圖找到空閑的塊,并分配,但仔細(xì)計(jì)算一下還是有問題的。

數(shù)據(jù)塊的位圖是放在磁盤塊里的,假設(shè)是放在一個(gè)塊里,一個(gè)塊4K,每位表示一個(gè)數(shù)據(jù)塊,共可以表示4 * 1024 * 8 = 2^15個(gè)空閑塊,由于1個(gè)數(shù)據(jù)塊是4K大小,那么更大可以表示的空間為2^15 * 4 * 1024 = 2^27個(gè)byte,也就是128M。

也就是說按照上面的結(jié)構(gòu),如果采用(一個(gè)塊的位圖+ 一系列的塊),外加一(個(gè)塊的inode的位圖+一系列的inode)的結(jié)構(gòu)能表示的更大空間也就128M,

這太少了,現(xiàn)在很多文件都比這個(gè)大。

在Linux文件系統(tǒng),把這個(gè)結(jié)構(gòu)稱為一個(gè) 塊組 ,那么有N多的塊組,就能夠表示N大的文件。

最終,整個(gè)文件系統(tǒng)格式就是下面這個(gè)樣子。

最前面的之一個(gè)塊是引導(dǎo)塊,在系統(tǒng)啟動(dòng)時(shí)用于啟用引導(dǎo),接著后面就是一個(gè)一個(gè)連續(xù)的塊組了,塊組的內(nèi)容如下:

● 超級(jí)塊 ,包含的是文件系統(tǒng)的重要信息,比如inode總個(gè)數(shù)、塊總個(gè)數(shù)、每個(gè)塊組的inode個(gè)數(shù)、每個(gè)塊組的塊個(gè)數(shù)等等。

● 塊組描述符 ,包含文件系統(tǒng)中各個(gè)塊組的狀態(tài),比如塊組中空閑塊和inode的數(shù)目等,每個(gè)塊組都包含了文件系統(tǒng)中「所有塊組的組描述符信息」。

● 數(shù)據(jù)位圖和inode位圖 ,用于表示對(duì)應(yīng)的數(shù)據(jù)塊或inode是空閑的,還是被使用中。

● inode 列表 ,包含了塊組中所有的inode, inode 用于保存文件系統(tǒng)中與各個(gè)文件和目錄相關(guān)的所有元數(shù)據(jù)。

● 數(shù)據(jù)塊 ,包含文件的有用數(shù)據(jù)。

你可以會(huì)發(fā)現(xiàn)每個(gè)塊組里有很多重復(fù)的信息,比如 超級(jí)塊和塊組描述符表,這兩個(gè)都是全局信息,而且非常的重要 ,這么做是有兩個(gè)原因:

●如果系統(tǒng)崩潰破壞了超級(jí)塊或塊組描述符,有關(guān)文件系統(tǒng)結(jié)構(gòu)和內(nèi)容的所有信息都會(huì)丟失。如果有冗余的副本,該信息是可能恢復(fù)的。

●通過使文件和管理數(shù)據(jù)盡可能接近,減少了磁頭尋道和旋轉(zhuǎn),這可以提高文件系統(tǒng)的性能。

不過,Ext2 的后續(xù)版本采用了稀疏技術(shù)。該做法是,超級(jí)塊和塊組描述符表不再存儲(chǔ)到文件系統(tǒng)的每個(gè)塊組中,而是只寫入到塊組0、塊組1和其他ID可以表示為3、5、7的冪的塊組中。

在前面,我們知道了一個(gè)普通文件是如何存儲(chǔ)的,但還有一個(gè)特殊的文件,經(jīng)常用到的目錄,它是如何保存的呢?

基于Linux 一切切皆文件的設(shè)計(jì)思想,目錄其實(shí)也是個(gè)文件,你甚至可以通過vim打開它,它也有inode, inode 里面也是指向一些塊。

和普通文件不同的是, 普通文件的塊里面保存的是文件數(shù)據(jù),而目錄文件的塊里面保存的是目錄里面一項(xiàng)一項(xiàng)的文件信息 。

在目錄文件的塊中,最簡(jiǎn)單的保存格式就是 列表 ,就是一項(xiàng)一項(xiàng)地將目錄下的文件信息(如文件名、文件inode.文件類型等)列在表里。

列表中每一項(xiàng)就代表該目錄下的文件的文件名和對(duì)應(yīng)的inode,通過這個(gè)inode,就可以找到真正的文件。

通常,之一項(xiàng)是「則」,表示當(dāng)前目錄,第二項(xiàng)是.,表示上一級(jí)目錄, 接下來就是一項(xiàng)一項(xiàng)的文件名和inode。

如果一個(gè)目錄有超級(jí)多的文件,我們要想在這個(gè)目錄下找文件,按照列表一項(xiàng)一項(xiàng)的找,效率就不高了。

于是,保存目錄的格式改成 哈希表 ,對(duì)文件名進(jìn)行哈希計(jì)算,把哈希值保存起來,如果我們要查找一個(gè)目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個(gè)文件的信息在相應(yīng)的塊里面。

Linux系統(tǒng)的ext文件系統(tǒng)就是采用了哈希表,來保存目錄的內(nèi)容,這種方法的優(yōu)點(diǎn)是查找非常迅速,插入和刪除也較簡(jiǎn)單,不過需要一些預(yù)備措施來避免哈希沖突。

目錄查詢是通過在磁盤上反復(fù)搜索完成,需要不斷地進(jìn)行/0操作,開銷較大。所以,為了減少/0操作,把當(dāng)前使用的文件目錄緩存在內(nèi)存,以后要使用該文件時(shí)只要在內(nèi)存中操作,從而降低了磁盤操作次數(shù),提高了文件系統(tǒng)的訪問速度。

感謝您的閱讀,希望您能攝取到知識(shí)!加油!沖沖沖?。òl(fā)現(xiàn)光,追隨光,成為光,散發(fā)光!)我是程序員耶耶!有緣再見。

關(guān)于linux文件系統(tǒng)實(shí)驗(yàn)原理的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開發(fā)和營(yíng)銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!


文章名稱:深入了解Linux文件系統(tǒng)實(shí)驗(yàn)原理(linux文件系統(tǒng)實(shí)驗(yàn)原理)
鏈接分享:http://www.dlmjj.cn/article/dpdgeje.html