了解一些经常使用的文件系统和一些基础定义
基础定义:
文件系统就是在存储设备上组织文件的方法。
而存储设备就是常见的磁盘。也有基于NAND Flash的固态硬盘等。对于组织文件的方法又分为命名文件及放置文件的逻辑存储和恢复等。文件管理系统则是操作系统中负责管理和存储文件信息的软件结构、简称文件系统、系统由三部分组成:文件系统的接口。对对象操纵和管理的软件集合,对象及属性。说的直白一些就是说文件系统就是在物理磁盘上进行文件的存储以及改动保护等操作、一系列的流程能够简化为文件的建立。存入,读出,改动,以及一些权限的控制等操作。//比方windows下的NTFS或者FAT32系统,他们的文件命名。以及文件的
详细的功能实现:
文件的系统是操作系统用于明白磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。
也指用于存储文件的磁盘或分区,或文件系统种类。
因此,能够说"我有2个文件系统"意思是他有2个分区,一个存文件。或他用 "扩展文件系统",意思是文件系统的种类。
这个过程就叫建立文件系统。
当中心概念是超级块superblock,i节点inode,数据块data block,文件夹块directory block。和间接块indirection block。超级块包含文件系统的整体信息,比方大小(其准确信息依赖文件系统)。i节点包含除了名字外的一个文件的全部信息,名字与i节点数目一起存在文件夹中,文件夹条目包含文件名称和文件的i节点数目。i节点包含几个数据块的数目。用于存储文件的数据。
i节点中仅仅有少量数据块数的空间,假设须要很多其它,会动态分配指向数据块的指针空间。
这些动态分配的块是间接块;为了找到数据块,这名字指出它必须先找到间接块的号码。
在这个系统中,程序相对较少,没有数据库文件。
从代码看原理:
既然是编程人员。代码往往是帮助别人理解的最好方法。以下就给大家看看文件系统的代码,让大家理解一下。
-
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
|
#include"blockinodesuperblock.h" //----------------------- intmain() { control.open( "control.txt" ,ios::in|ios::out|ios::nocreate); inti; control>>i; control.close(); if (i!=0) //不为0就初始化 { initial(); } control.open( "control.txt" ,ios::in|ios::out|ios::nocreate); control.seekp(0); control<<0; //默认是上次基础上继续下去不用再初始化 control.close(); strcpy (curname, "root" ); //当前文件夹文件名称为root road[0]=0; //当前文件夹路径(存放从根文件夹到这里的结点号) num=1; //最后位road[num-1]为当前文件夹文件i结点号 cout<< "请登陆系统
" ; while (!login()) //登陆为止 cout<< "wrong!!!
" ; cout<< "loginsuccess" <<endl; cout<< "******Welcome" <<auser<< "******" ; readsuper(); getcommand(); //命令解析函数 writesuper(); return0; } |
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
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
|
intialloc() //申请一个i结点返回结点号否则返回-1 { if (superblock.fiptr>0) { inttemp=superblock.fistack[80-superblock.fiptr]; //当前可用
superblock.fistack[80-superblock.fiptr]=-1; superblock.fiptr--; returntemp; } return -1; } //---------------------- voidifree(intindex) //指定一个结点号,回收一个i结点 { disk.open( "disk.txt" ,ios::in|ios::out|ios::nocreate); //清空结点 disk.seekp(514+64*index+2*(index/8)); disk<<setw(64)<< '' ; disk.close(); for (inti=80-superblock.fiptr;i<80;i++) //结点号找到合适位置插入空暇结点号栈 { if (superblock.fistack<index) //小于它的前移一位 { superblock.fistack[i-1]=superblock.fistack; } else //放在第一个大于它的结点号前面 { superblock.fistack[i-1]=index; break ; } } superblock.fiptr++; } //---------------------- /*成组链接法*/ intballoc() //申请一个盘块返回盘块号否则返回-1 { inttemp=superblock.fbstack[10-superblock.fbptr]; if (superblock.fbptr==1) //是栈底了==>;是记录盘块了 { //是最后记录盘块最后号0(保留作栈底分配不成功) if (temp==0) { return -1; } suprblock.fbstack[10-superblock.fbptr]=-1; superblock.fbptr=0; //盘块内容读入栈 for (inti=0;i<10;i++) { intid,num=0; disk.open( "disk.txt" ,ios::in|ios::out|ios::nocreate); //先计算盘块内容个数num(最多10),最后盘块可能不到10个 disk.seekg(514*temp); for (inti=0;i<10;i++) { disk>>id; num++; if (id==0) break ; } disk.seekg(514*temp); //盘块内容读入栈 for (intj=10-num;j<10;j++) { disk>>id; superblock.fbstack[j]=id; } superblock.fbptr=num; disk.close(); } disk.open( "disk.txt" ,ios::in|ios::out|ios::nocreate); //清空回收盘块 disk.seekp(514*temp); disk<<setw(512)<< '' ; disk.close(); //盘块使用掉 returntemp; } else //不是记录盘块==>;盘块使用掉 { superblock.fbstack[10-superblock.fbptr]=-1; superblock.fbptr--; returntemp; }
|
常见的文件系统简单介绍
FAT
在Win 9X下。FAT16支持的分区最大为2GB。我们知道计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下。分区越大簇就对应的要大。存储效率就越低。势必造成存储空间的浪费。而且随着计算机硬件和应用的不断提高,FAT16文件系统已不能非常好地适应系统的要求。在这样的情况下,推出了增强的文件系统FAT32。同FAT16相比。FAT32主要具有下面特点:-
同FAT16相比FAT32最大的长处是能够支持的磁盘大小达到32GB。可是不能支持小于512MB的分区。
-
因为採用了更小的簇。FAT32文件系统能够更有效率地保存信息。
如两个分区大小都为2GB。一个分区採用了FAT16文件系统,还有一个分区採用了FAT32文件系统。採用FAT16的分区的簇大小为32KB,而FAT32分区的簇仅仅有4KB的大小。
这样FAT32就比FAT16的存储效率要高非常多,通常情况下能够提高15%。
NTFS
Win 2000採用了更新版本号的NTFS文件系统NTFS 5.0,它的推出使得用户不但能够像Win 9X那样方便快捷地操作和管理计算机,同一时候也可享受到NTFS所带来的系统安全性。
-
NTFS能够支持的分区(假设採用动态磁盘则称为卷)大小能够达到2TB。
而Win 2000中的FAT32支持分区的大小最大为32GB。
-
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文件系统下。是不能实现的。
-
NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。
EXT系列
Ext2
Ext3
日志式文件系统的优越性在于:因为文件系统都有快取层參与运作。如不使用时必须将文件系统卸下。以便将快取层的资料写回磁盘中。
因此每当系统要关机时。必须将其所有的文件系统所有shutdown后才干进行关机。
Ext4
Ext4 能够提供更佳的性能和可靠性。还有更为丰富的功能:
-
更大的文件系统和更大的文件。
较之 Ext3 眼下所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
-
无限数量的子文件夹。Ext3 眼下仅仅支持 32,000 个子文件夹。而Ext4支持无限数量的子文件夹。
-
多块分配。当写入数据到 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 工具进行个别文件或整个文件系统的碎片整理。
-
持久预分配(Persistent preallocation)。
P2P 软件为了保证下载文件有足够的空间存放,经常会预先创建一个与所下载文件大小同样的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。
Ext4在文件系统层面实现了持久预分配并提供对应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。
HFS
1 HFS文件系统概念由于Macintosh电脑所产生的数据,比其他通常的文件系统,如DOS使用的FAT或原始Unix文件系统所同意存储的数据很多其他。
苹果电脑开发了一种新式更适用的文件系统,而不是採用现有的规格。比如,HFS同意文件名称最多有31个字符的长度,支持metadata和双分支(每一个文件的数据和资源支分开存储)文件。
这些逻辑块被编组为“分配块”,这些分配块能够依据卷的尺寸包括一个或多个逻辑块。HFS对地址分配块使用16位数值。分配块的最高限制数量是65536。
-
卷的逻辑块0和1是启动块。它包括了系统启动信息。比如,启动时加载的系统名称和壳(一般是Finder)文件。
-
逻辑块2包括主文件夹块(Master Directory Block,简称MDB)。
-
逻辑块3是卷位图(Volume Bitmap)的启动块,它追踪分配块使用状态。
-
总文件夹文件(Catalog File)是一个包括全部文件的记录和储存在卷中文件夹的B*-tree。
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个字符。
以上文章的内容是我理解后借阅资料整合出来的希望对你有所帮助。