基礎定義:
檔案系統就是在儲存設備上組織檔案的方法。
而儲存設備就是常見的磁盤。也有基于NAND Flash的固态硬碟等。對于組織檔案的方法又分為命名檔案及放置檔案的邏輯存儲和恢複等。檔案管理系統則是作業系統中負責管理和存儲檔案資訊的軟體結構、簡稱檔案系統、系統由三部分組成:檔案系統的接口。對對象操縱和管理的軟體集合,對象及屬性。說的直白一些就是說檔案系統就是在實體磁盤上進行檔案的存儲以及改動保護等操作、一系列的流程能夠簡化為檔案的建立。存入,讀出,改動,以及一些權限的控制等操作。//比方windows下的NTFS或者FAT32系統,他們的檔案命名。以及檔案的
詳細的功能實作:
檔案的系統是作業系統用于明白磁盤或分區上的檔案的方法和資料結構;即在磁盤上組織檔案的方法。
也指用于存儲檔案的磁盤或分區,或檔案系統種類。
是以,能夠說"我有2個檔案系統"意思是他有2個分區,一個存檔案。或他用 "擴充檔案系統",意思是檔案系統的種類。
磁盤或分區和它所包含的檔案系統的不同是非常重要的。少數程式(包含最有理由的産生檔案系統的程式)直接對磁盤或分區的原始扇區進行操作;這可能破壞一個存在的檔案系統。大部分程式基于檔案系統進行操作。在不同種檔案系統上不能工作。
一個分區或磁盤在作為檔案系統使用前,須要初始化,并将記錄資料結構寫到磁盤上。
這個過程就叫建立檔案系統。
大部分UNIX檔案系統種類具有類似的通用結構,即使細節有些變化。
當中心概念是超級塊superblock,i節點inode,資料塊data block,檔案夾塊directory block。和間接塊indirection block。超級塊包含檔案系統的整體資訊,比方大小(其準确資訊依賴檔案系統)。i節點包含除了名字外的一個檔案的全部資訊,名字與i節點數目一起存在檔案夾中,檔案夾條目包含檔案名稱和檔案的i節點數目。i節點包含幾個資料塊的數目。用于存儲檔案的資料。
i節點中僅僅有少量資料塊數的空間,假設須要很多其它,會動态配置設定指向資料塊的指針空間。
這些動态配置設定的塊是間接塊;為了找到資料塊,這名字指出它必須先找到間接塊的号碼。
UNIX檔案系統通常同意在檔案裡産生孔,意思是檔案系統假裝檔案裡有一個特殊的位置僅僅有0位元組,但沒有為這檔案的這個位置保留實際的磁盤空間。這對小的二進制檔案常常發生,Linux共享庫、一些資料庫和其它一些特殊情況。
孔有一定的用處。在筆者的系統中。一個簡單的測量工具顯示在200MB使用的磁盤空間中,因為孔,節約了大約4MB。
在這個系統中,程式相對較少,沒有資料庫檔案。
檔案系統的功能包含:管理和排程檔案的存儲空間,提供檔案的邏輯結構、實體結構和存儲方法;實作檔案從辨別到實際位址的映射。實作檔案的控制操作和存取操作,實作檔案資訊的共享并提供可靠的檔案保密和保護措施,提供檔案的安全措施。
檔案的邏輯結構是按照檔案的内容的邏輯關系組織檔案結構。檔案的邏輯結構能夠分為流式檔案和記錄式檔案。
流式檔案:檔案裡的資料是一串字元流,沒有結構。
記錄檔案:由若幹邏輯記錄組成,每條記錄又由同樣的資料項組成,資料項的長度能夠是确定的,也能夠是不确定的。
主要缺陷:資料關聯差,資料不一緻,備援性
從代碼看原理:
既然是程式設計人員。代碼往往是幫助别人了解的最好方法。以下就給大家看看檔案系統的代碼,讓大家了解一下。
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<code>#include"blockinodesuperblock.h"</code>
<code>//-----------------------</code>
<code>intmain()</code>
<code>{</code>
<code>control.open(</code><code>"control.txt"</code><code>,ios::in|ios::out|ios::nocreate);</code>
<code>inti;</code>
<code>control>>i;</code>
<code>control.close();</code>
<code>if</code><code>(i!=0)</code><code>//不為0就初始化</code>
<code>initial();</code>
<code>}</code>
<code>control.seekp(0);</code>
<code>control<<0;</code><code>//預設是上次基礎上繼續下去不用再初始化</code>
<code>strcpy</code><code>(curname,</code><code>"root"</code><code>);</code><code>//目前檔案夾檔案名稱為root</code>
<code>road[0]=0;</code><code>//目前檔案夾路徑(存放從根檔案夾到這裡的結點号)</code>
<code>num=1;</code><code>//最後位road[num-1]為目前檔案夾檔案i結點号</code>
<code>cout<<</code><code>"請登陸系統\n"</code><code>;</code>
<code>while</code><code>(!login())</code><code>//登陸為止</code>
<code>cout<<</code><code>"wrong!!!\n"</code><code>;</code>
<code>cout<<</code><code>"loginsuccess"</code><code><<endl;</code>
<code>cout<<</code><code>"******Welcome"</code><code><<auser<<</code><code>"******"</code><code>;</code>
<code>readsuper();</code>
<code>getcommand();</code><code>//指令解析函數</code>
<code>writesuper();</code>
<code>return0;</code>
blockinodesuperblock.h
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<code>intialloc()</code><code>//申請一個i結點傳回結點号否則傳回-1</code>
<code>if</code><code>(superblock.fiptr>0)</code>
<code>inttemp=superblock.fistack[80-superblock.fiptr];</code><code>//目前可用 </code>
<code>superblock.fistack[80-superblock.fiptr]=-1;</code>
<code>superblock.fiptr--;</code>
<code>returntemp;</code>
<code>return</code><code>-1;</code>
<code>//----------------------</code>
<code>voidifree(intindex)</code><code>//指定一個結點号,回收一個i結點</code>
<code>disk.open(</code><code>"disk.txt"</code><code>,ios::in|ios::out|ios::nocreate);</code><code>//清空結點</code>
<code>disk.seekp(514+64*index+2*(index/8));</code>
<code>disk<<setw(64)<<</code><code>''</code><code>;</code>
<code>disk.close();</code>
<code>for</code><code>(inti=80-superblock.fiptr;i<80;i++)</code><code>//結點号找到合适位置插入空暇結點号棧</code>
<code>if</code><code>(superblock.fistack<index)</code><code>//小于它的前移一位</code>
<code>superblock.fistack[i-1]=superblock.fistack;</code>
<code>else</code><code>//放在第一個大于它的結點号前面</code>
<code>superblock.fistack[i-1]=index;</code>
<code>break</code><code>;</code>
<code>superblock.fiptr++;</code>
<code>/*成組連結法*/</code>
<code>intballoc()</code><code>//申請一個盤塊傳回盤塊号否則傳回-1</code>
<code>inttemp=superblock.fbstack[10-superblock.fbptr];</code>
<code>if</code><code>(superblock.fbptr==1)</code><code>//是棧底了==>;是記錄盤塊了</code>
<code>//是最後記錄盤塊最後号0(保留作棧底配置設定不成功)</code>
<code>if</code><code>(temp==0)</code>
<code>suprblock.fbstack[10-superblock.fbptr]=-1;</code>
<code>superblock.fbptr=0;</code>
<code>//盤塊内容讀入棧</code>
<code>for</code><code>(inti=0;i<10;i++)</code>
<code>intid,num=0;</code>
<code>disk.open(</code><code>"disk.txt"</code><code>,ios::in|ios::out|ios::nocreate);</code>
<code>//先計算盤塊内容個數num(最多10),最後盤塊可能不到10個</code>
<code>disk.seekg(514*temp);</code>
<code>disk>>id;</code>
<code>num++;</code>
<code>if</code><code>(id==0)</code><code>break</code><code>;</code>
<code>disk.seekg(514*temp);</code><code>//盤塊内容讀入棧</code>
<code>for</code><code>(intj=10-num;j<10;j++)</code>
<code>superblock.fbstack[j]=id;</code>
<code>superblock.fbptr=num;</code>
<code>disk.open(</code><code>"disk.txt"</code><code>,ios::in|ios::out|ios::nocreate);</code><code>//清空回收盤塊</code>
<code>disk.seekp(514*temp);</code>
<code>disk<<setw(512)<<</code><code>''</code><code>;</code>
<code>//盤塊使用掉</code>
<code>else</code><code>//不是記錄盤塊==>;盤塊使用掉</code>
<code>superblock.fbstack[10-superblock.fbptr]=-1;</code>
<code>superblock.fbptr--;</code>
<code></code>
常見的檔案系統簡單介紹
在Win 9X下。FAT16支援的分區最大為2GB。我們知道計算機将資訊儲存在硬碟上稱為“簇”的區域内。使用的簇越小,儲存資訊的效率就越高。在FAT16的情況下。分區越大簇就對應的要大。存儲效率就越低。勢必造成存儲空間的浪費。而且随着計算機硬體和應用的不斷提高,FAT16檔案系統已不能非常好地适應系統的要求。在這樣的情況下,推出了增強的檔案系統FAT32。同FAT16相比。FAT32主要具有下面特點:
同FAT16相比FAT32最大的長處是能夠支援的磁盤大小達到32GB。可是不能支援小于512MB的分區。
基于FAT32的Win 2000能夠支援分區最大為32GB。而基于 FAT16的Win 2000支援的分區最大為4GB。
因為採用了更小的簇。FAT32檔案系統能夠更有效率地儲存資訊。
如兩個分區大小都為2GB。一個分區採用了FAT16檔案系統,還有一個分區採用了FAT32檔案系統。採用FAT16的分區的簇大小為32KB,而FAT32分區的簇僅僅有4KB的大小。
這樣FAT32就比FAT16的存儲效率要高非常多,通常情況下能夠提高15%。
FAT32檔案系統能夠又一次定位根檔案夾和使用FAT的備份副本。另外FAT32分區的啟動記錄被包括在一個含有重要資料的結構中,降低了計算機系統崩潰的可能性
NTFS檔案系統是一個基于安全性的檔案系統,是Windows NT所採用的獨特的檔案系統結構,它是建立在保護檔案和檔案夾資料基礎上。同一時候照應節省存儲資源、降低磁盤占用量的一種先進的檔案系統。使用很廣泛的Windows NT 4.0採用的就是NTFS 4.0檔案系統,相信它所帶來的強大的系統安全性一定給廣大使用者留下了深刻的印象。
Win
2000採用了更新版本号的NTFS檔案系統NTFS 5.0,它的推出使得使用者不但能夠像Win 9X那樣友善快捷地操作和管理計算機,同一時候也可享受到NTFS所帶來的系統安全性。
NTFS 5.0的特點主要體如今下面幾個方面:
NTFS能夠支援的分區(假設採用動态磁盤則稱為卷)大小能夠達到2TB。
而Win 2000中的FAT32支援分區的大小最大為32GB。
NTFS是一個可恢複的檔案系統。
在NTFS檔案系統上使用者非常少須要執行磁盤修複程式。NTFS通過使用标準的事物處理日志和恢複技術來保證分區的一緻性。發生系統失敗事件時。NTFS使用日志檔案和檢查點資訊自己主動恢複檔案系統的一緻性。
NTFS支援對分區、目錄和檔案的壓縮。不論什麼基于Windows的應用程式對NTFS檔案系統上的壓縮檔案進行讀寫時不須要事先由其它程式進行解壓縮,當對檔案進行讀取時,檔案将自己主動進行解壓縮;檔案關閉或儲存時會自己主動對檔案進行壓縮。
NTFS採用了更小的簇,能夠更有效率地管理磁盤空間。在Win 2000的FAT32檔案系統的情況下,分區大小在2GB~8GB時簇的大小為4KB;分區大小在8GB~16GB時簇的大小為8KB。分區大小在16GB~32GB時,簇的大小則達到了16KB。而Win 2000的NTFS檔案系統。當分區的大小在2GB下面時,簇的大小都比對應的FAT32簇小;當分區的大小在2GB以上時(2GB~2TB)。簇的大小都為4KB。相比之下。NTFS能夠比FAT32更有效地管理磁盤空間,最大限度地避免了磁盤空間的浪費。
在NTFS檔案系統上,能夠為共享資源、目錄以及檔案設定訪問許可權限。許可的設定包含雙方面的内容:一是同意哪些組或使用者對目錄、檔案和共享資源進行訪問。二是獲得訪問許可的組或使用者能夠進行什麼級别的訪問。
訪問許可權限的設定不但适用于本地計算機的使用者。相同也應用于通過網絡的共享目錄對檔案進行訪問的網絡使用者。
與FAT32檔案系統下對目錄或檔案進行訪問相比,安全性要高得多。另外,在採用NTFS格式的Win
2000中,應用稽核政策能夠對檔案夾、檔案以及活動檔案夾對象進行稽核。稽核結果記錄在安全日志中。通過安全日志就能夠檢視哪些組或使用者對檔案夾、檔案或活動檔案夾對象進行了什麼級别的操作。進而發現系統可能面臨的非法訪問。通過採取對應的措施,将這樣的安全隐患減到最低。這些在FAT32檔案系統下。是不能實作的。
在Win 2000的NTFS檔案系統下能夠進行磁盤配額管理。磁盤配額就是管理者能夠為使用者所能使用的磁盤空間進行配額限制。每一使用者僅僅能使用最大配額範圍内的磁盤空間。
設定磁盤配額後,能夠對每個使用者的磁盤使用情況進行跟蹤和控制,通過監測能夠辨別出超過配額報警門檻值和配額限制的使用者。進而採取對應的措施。磁盤配額管理功能的提供。使得管理者能夠友善合理地為使用者配置設定存儲資源,避免因為磁盤空間使用的失控可能造成的系統崩潰。提高了系統的安全性。
NTFS使用一個“變更”日志來跟蹤記錄檔案所發生的變更。
Ext是 GNU/Linux 系統中标準的檔案系統,其特點為存取檔案的性能極好,對于中小型的檔案更顯示出優勢,這主要得利于其簇快取層的優良設計。
其單一檔案大小與檔案系統本身的容量上限與檔案系統本身的簇大小有關,在一般常見的 x86電腦系統中。簇最大為 4KB。則單一檔案大小上限為 2048GB,而檔案系統的容量上限為 16384GB。
但因為眼下核心 2.4 所能使用的單一切割區最大僅僅有 2048GB,實際上能使用的檔案系統容量最多也僅僅有 2048GB。
至于Ext3檔案系統,它屬于一種日志檔案系統。是對ext2系統的擴充。
它相容ext2,而且從ext2轉換成ext3并不複雜。
Ext3是一種日志式檔案系統。是對ext2系統的擴充,它相容ext2。
日志式檔案系統的優越性在于:因為檔案系統都有快取層參與運作。如不使用時必須将檔案系統卸下。以便将快取層的資料寫回磁盤中。
是以每當系統要關機時。必須将其所有的檔案系統所有shutdown後才幹進行關機。
假設在檔案系統尚未shutdown前就關機 (如停電) 時,下次重開機後會造成檔案系統的資料不一緻。故這時必須做檔案系統的重整工作,将不一緻與錯誤的地方修複。然而,此一重整的工作是相當耗時的,特别是容量大的檔案系統。并且也不能百分之百保證全部的資料都不會流失。
為了克服此問題。使用所謂‘日志式檔案系統(Journal File System) ’。此類檔案系統最大的特色是,它會将整個磁盤的寫入動作完整記錄在磁盤的某個區域上,以便有須要時能夠回溯追蹤。
因為資料的寫入動作包括很多的細節。像是改變檔案标頭資料、搜尋磁盤可寫入空間、一個個寫入資料區段等等。每個細節進行到一半若被中斷,就會造成檔案系統的不一緻。因而須要重整。
然而,在日志式檔案系統中。因為具體紀錄了每一個細節。故當在某個過程中被中斷時,系統能夠依據這些記錄直接回溯并重整被中斷的部分,而不必花時間去檢查其它的部分,故重整的工作速度相當快,差點兒不須要花時間。
Linux kernel 自 2.6.28 開始正式支援新的檔案系統 Ext4。Ext4 是 Ext3 的改進版,改動了 Ext3 中部分重要的資料結構。而不隻像 Ext3 對 Ext2 那樣,不過添加了一個日志功能而已。
Ext4 能夠提供更佳的性能和可靠性。還有更為豐富的功能:
與 Ext3 相容。運作若幹條指令,就能從 Ext3 線上遷移到Ext4。而無須又一次格式化磁盤或又一次安裝系統。原有 Ext3資料結構照樣保留,Ext4作用于新資料,當然,整個檔案系統是以也就獲得了
Ext4 所支援的更大容量。
更大的檔案系統和更大的檔案。
較之 Ext3 眼下所支援的最大 16TB 檔案系統和最大 2TB 檔案,Ext4分别支援 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的檔案系統,以及 16TB 的檔案。
無限數量的子檔案夾。Ext3 眼下僅僅支援 32,000 個子檔案夾。而Ext4支援無限數量的子檔案夾。
Extents。Ext3 採用間接塊映射,當操作大檔案時,效率極其低下。比方一個 100MB 大小的檔案,在 Ext3 中要建立 25,600 個資料塊(每一個資料塊大小為 4KB)的映射表。而Ext4引入了現代檔案系統中流行的
extents 概念,每一個 extent 為一組連續的資料塊,上述檔案則表示為“該檔案資料儲存在接下來的 25,600 個資料塊中”,提高了不少效率。
多塊配置設定。當寫入資料到 Ext3 檔案系統中時。Ext3 的資料塊配置設定器每次僅僅能配置設定一個 4KB 的塊,寫一個 100MB 檔案就要調用 25,600 次資料塊配置設定器,而Ext4的多塊配置設定器“multiblock allocator”(mballoc) 支援一次調用配置設定多個資料塊。
延遲配置設定。Ext3 的資料塊配置設定政策是盡快配置設定,而Ext4和其他現代檔案作業系統的政策是盡可能地延遲配置設定。直到檔案在 cache 中寫完才開始配置設定資料塊并寫入磁盤。這樣就能優化整個檔案的資料塊配置設定,與前兩種特性搭配起來能夠顯著提升性能。
高速 fsck。曾經運作 fsck 第一步就會非常慢,由于它要檢查全部的 inode,如今Ext4給每一個組的 inode 表中都加入了一份未使用 inode 的清單。今後 fsck Ext4 檔案系統就能夠跳過它們而僅僅去檢查那些在用的 inode 了。
日志校驗。日志是最經常使用的部分,也極易導緻磁盤硬體故障,而從損壞的日志中恢複資料會導緻很多其它的資料損壞。Ext4的日志校驗功能能夠非常友善地推斷日志資料是否損壞,并且它将 Ext3 的兩階段日志機制合并成一個階段。在添加安全性的同一時候提高了性能。
“無日志”(No Journaling)模式。日志總歸有一些開銷,Ext4同意關閉日志,以便某些有特殊需求的使用者能夠借此提升性能。
線上碎片整理。
雖然延遲配置設定、多塊配置設定和 extents 能有效降低檔案系統碎片,但碎片還是不可避免會産生。
Ext4支援線上碎片整理,并将提供 e4defrag 工具進行個别檔案或整個檔案系統的碎片整理。
inode 相關特性。
Ext4支援更大的 inode,較之 Ext3 預設的 inode 大小 128 位元組,Ext4 為了在 inode 中容納很多其它的擴充屬性(如納秒時間戳或
inode 版本号),預設 inode 大小為 256 位元組。Ext4還支援高速擴充屬性(fast extended attributes)和 inode 保留(inodes reservation)。
持久預配置設定(Persistent preallocation)。
P2P 軟體為了保證下載下傳檔案有足夠的空間存放,經常會預先建立一個與所下載下傳檔案大小同樣的空檔案,以免未來的數小時或數天之内磁盤空間不足導緻下載下傳失敗。
Ext4在檔案系統層面實作了持久預配置設定并提供對應的 API(libc 中的 posix_fallocate()),比應用軟體自己實作更有效率。
預設啟用 barrier。磁盤上配有内部緩存。以便又一次調整批量資料的寫操作順序。優化寫入性能,是以檔案系統必須在日志資料寫入磁盤之後才幹寫 commit 記錄,若 commit 記錄寫入在先。而日志有可能損壞。那麼就會影響資料完整性。Ext4預設啟用
barrier。僅僅有當 barrier 之前的資料所有寫入磁盤,才幹寫 barrier 之後的資料。
(可通過 "mount -o barrier=0" 指令禁用該特性。
)
1 HFS檔案系統概念
分層檔案系統(Hierarchical File System,HFS)是一種由蘋果電腦開發。并使用在Mac OS上的檔案系統。最初被設計用于軟碟和硬碟。同一時候也能夠在在僅僅讀媒體如CD-ROM上見到。
2 HFS檔案系統開發過程
HFS首次出如今1985年9月17日,作為Macintosh電腦上新的檔案系統。它代替僅僅用于早期Mac型号所使用的平面檔案系統Macintosh File System(MFS)。
由于Macintosh電腦所産生的資料,比其他通常的檔案系統,如DOS使用的FAT或原始Unix檔案系統所同意存儲的資料很多其他。
蘋果電腦開發了一種新式更适用的檔案系統,而不是採用現有的規格。比如,HFS同意檔案名稱最多有31個字元的長度,支援metadata和雙分支(每一個檔案的資料和資源支分開存儲)檔案。
雖然HFS象其他大多數檔案系統一樣被視為專有的格式,由于僅僅有它為大多數最新的作業系統提供了非常好的通用解決方法以存取HFS格式磁盤。
3 構成方式
分層檔案系統把一個卷分為很多512位元組的“邏輯塊”。
這些邏輯塊被編組為“配置設定塊”,這些配置設定塊能夠依據卷的尺寸包括一個或多個邏輯塊。HFS對位址配置設定塊使用16位數值。配置設定塊的最高限制數量是65536。
組成一個HFS卷須要以下的五個結構:
卷的邏輯塊0和1是啟動塊。它包括了系統啟動資訊。比如,啟動時加載的系統名稱和殼(一般是Finder)檔案。
邏輯塊2包括主檔案夾塊(Master Directory Block,簡稱MDB)。
邏輯塊3是卷位圖(Volume Bitmap)的啟動塊,它追蹤配置設定塊使用狀态。
總檔案夾檔案(Catalog File)是一個包括全部檔案的記錄和儲存在卷中檔案夾的B*-tree。
擴充溢出檔案(Extent Overflow File)是當最初總檔案夾檔案裡三個擴充占用後。另外一個包括額外擴充記錄的配置設定塊相應資訊的B*-tree。
編輯
在1998年,蘋果電腦公布了HFS+,其改善了HFS對磁盤空間的位址定位效率低下,并增加了其他的改進。
HFS+檔案系統相對于HFS檔案系統的特點
(1)採用32bit 記錄配置設定塊數量
HFS 和HFS+檔案系統對磁盤卷採用分塊進行配置設定,将一個卷分成等大的配置設定塊。HFS檔案系統採用16bit 來記錄配置設定塊的數量。最多僅僅能描寫叙述216個配置設定塊。而對于HFS+檔案系統,採用32bit 來記錄配置設定塊的數量,最多能描寫叙述232 個配置設定塊。對于Mac 系統上的非空資料。都必須占用整數個配置設定塊,也就是說。即使一個資料僅僅有一個位元組。也要占用一個配置設定塊。
而HFS+檔案系統增大了每一個卷配置設定塊的數量,能夠使配置設定塊的機關空間更小,進而達到降低存儲空間浪費的目的。
(2)檔案夾樹節點大小添加到4KB
HFS 檔案系統的檔案夾樹節點大小為512 位元組,因為HFS+檔案系統檔案夾樹索引節點須要存儲附加指針和節點描寫叙述符兩個關鍵值,HFS+檔案系統的檔案夾樹節點大小添加到4KB。
(3)單一檔案大小得到提升
HFS 檔案系統的單一檔案大小上限為2^31bit。而HFS+檔案系統的單一檔案大小最大可達到2^63bit。
(4)支援長檔案名稱
HFS 檔案系統對檔案名稱最長支援到31個字元。而HFS+檔案系統對檔案名稱採用Unicode編碼,最長達到255個字元。
以上文章的内容是我了解後借閱資料整合出來的希望對你有所幫助。