zoukankan      html  css  js  c++  java
  • 了解一些经常使用的文件系统和一些基础定义

                                                         了解一些经常使用的文件系统和一些基础定义       

    基础定义:

               文件系统就是在存储设备上组织文件的方法。

    而存储设备就是常见的磁盘。也有基于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。

    在这个系统中,程序相对较少,没有数据库文件

    文件系统的功能包含:管理和调度文件的存储空间,提供文件的逻辑结构、物理结构和存储方法;实现文件从标识到实际地址的映射。实现文件的控制操作和存取操作,实现文件信息的共享并提供可靠的文件保密和保护措施,提供文件的安全措施。

    文件的逻辑结构是按照文件的内容的逻辑关系组织文件结构。文件的逻辑结构能够分为流式文件和记录式文件。
    流式文件:文件里的数据是一串字符流,没有结构。

    记录文件:由若干逻辑记录组成,每条记录又由同样的数据项组成,数据项的长度能够是确定的,也能够是不确定的。

    主要缺陷:数据关联差,数据不一致,冗余性

    从代码看原理:

           既然是编程人员。代码往往是帮助别人理解的最好方法。以下就给大家看看文件系统的代码,让大家理解一下。

    1. 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;
    }
    blockinodesuperblock.h
    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主要具有下面特点:
    1. 同FAT16相比FAT32最大的长处是能够支持的磁盘大小达到32GB。可是不能支持小于512MB的分区。
    基于FAT32的Win 2000能够支持分区最大为32GB。而基于 FAT16的Win 2000支持的分区最大为4GB。

    1. 因为採用了更小的簇。FAT32文件系统能够更有效率地保存信息。

      如两个分区大小都为2GB。一个分区採用了FAT16文件系统,还有一个分区採用了FAT32文件系统。採用FAT16的分区的簇大小为32KB,而FAT32分区的簇仅仅有4KB的大小。

      这样FAT32就比FAT16的存储效率要高非常多,通常情况下能够提高15%。

    2. FAT32文件系统能够又一次定位根文件夹和使用FAT的备份副本。另外FAT32分区的启动记录被包括在一个含有重要数据的结构中,降低了计算机系统崩溃的可能性

    NTFS

    NTFS文件系统是一个基于安全性的文件系统,是Windows NT所採用的独特的文件系统结构,它是建立在保护文件和文件夹数据基础上。同一时候照应节省存储资源、降低磁盘占用量的一种先进的文件系统。使用很广泛的Windows NT 4.0採用的就是NTFS 4.0文件系统,相信它所带来的强大的系统安全性一定给广大用户留下了深刻的印象。

    Win 2000採用了更新版本号的NTFS文件系统NTFS 5.0,它的推出使得用户不但能够像Win 9X那样方便快捷地操作和管理计算机,同一时候也可享受到NTFS所带来的系统安全性。

    NTFS 5.0的特点主要体如今下面几个方面:
    1. NTFS能够支持的分区(假设採用动态磁盘则称为卷)大小能够达到2TB。

      而Win 2000中的FAT32支持分区的大小最大为32GB。

    2. NTFS是一个可恢复的文件系统。

      NTFS分区上用户非常少须要执行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时。NTFS使用日志文件和检查点信息自己主动恢复文件系统的一致性。

    3. NTFS支持对分区、目录和文件的压缩。不论什么基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不须要事先由其它程序进行解压缩,当对文件进行读取时,文件将自己主动进行解压缩;文件关闭或保存时会自己主动对文件进行压缩。
    4. NTFS採用了更小的簇,能够更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB。分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统。当分区的大小在2GB下面时,簇的大小都比对应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB)。簇的大小都为4KB。相比之下。NTFS能够比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。

    5. 在NTFS分区上,能够为共享资源、目录以及文件设置訪问许可权限。许可的设置包含双方面的内容:一是同意哪些组或用户对目录、文件和共享资源进行訪问。二是获得訪问许可的组或用户能够进行什么级别的訪问。

      訪问许可权限的设置不但适用于本地计算机的用户。相同也应用于通过网络的共享目录对文件进行訪问的网络用户。

      与FAT32文件系统下对目录或文件进行訪问相比,安全性要高得多。另外,在採用NTFS格式的Win 2000中,应用审核策略能够对文件夹、文件以及活动文件夹对象进行审核。审核结果记录在安全日志中。通过安全日志就能够查看哪些组或用户对文件夹、文件或活动文件夹对象进行了什么级别的操作。从而发现系统可能面临的非法訪问。通过採取对应的措施,将这样的安全隐患减到最低。这些在FAT32文件系统下。是不能实现的。

    6. 在Win 2000的NTFS文件系统下能够进行磁盘配额管理。磁盘配额就是管理员能够为用户所能使用的磁盘空间进行配额限制。每一用户仅仅能使用最大配额范围内的磁盘空间。

      设置磁盘配额后,能够对每个用户的磁盘使用情况进行跟踪和控制,通过监測能够标识出超过配额报警阈值和配额限制的用户。从而採取对应的措施。磁盘配额管理功能的提供。使得管理员能够方便合理地为用户分配存储资源,避免因为磁盘空间使用的失控可能造成的系统崩溃。提高了系统的安全性。

    7. NTFS使用一个“变更”日志来跟踪记录文件所发生的变更。

    EXT系列

    Ext2

    Ext是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。
    其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86电脑系统中。簇最大为 4KB。则单一文件大小上限为 2048GB,而文件系统的容量上限为 16384GB。
    但因为眼下核心 2.4 所能使用的单一切割区最大仅仅有 2048GB,实际上能使用的文件系统容量最多也仅仅有 2048GB。
    至于Ext3文件系统,它属于一种日志文件系统。是对ext2系统的扩展。

    它兼容ext2,而且从ext2转换成ext3并不复杂。

    Ext3

    Ext3是一种日志式文件系统。是对ext2系统的扩展,它兼容ext2

    日志式文件系统的优越性在于:因为文件系统都有快取层參与运作。如不使用时必须将文件系统卸下。以便将快取层的资料写回磁盘中。

    因此每当系统要关机时。必须将其所有的文件系统所有shutdown后才干进行关机。

    假设在文件系统尚未shutdown前就关机 (如停电) 时,下次重开机后会造成文件系统的资料不一致。故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,此一重整的工作是相当耗时的,特别是容量大的文件系统。并且也不能百分之百保证全部的资料都不会流失。
    为了克服此问题。使用所谓‘日志式文件系统(Journal File System) ’。此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有须要时能够回溯追踪。

    因为资料的写入动作包括很多的细节。像是改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等。每个细节进行到一半若被中断,就会造成文件系统的不一致。因而须要重整。
    然而,在日志式文件系统中。因为具体纪录了每一个细节。故当在某个过程中被中断时,系统能够依据这些记录直接回溯并重整被中断的部分,而不必花时间去检查其它的部分,故重整的工作速度相当快,差点儿不须要花时间。

    Ext4

    Linux kernel 自 2.6.28 開始正式支持新的文件系统 Ext4。Ext4 是 Ext3 的改进版,改动了 Ext3 中部分重要的数据结构。而不只像 Ext3 对 Ext2 那样,不过添加了一个日志功能而已。

    Ext4 能够提供更佳的性能和可靠性。还有更为丰富的功能:

    1. 与 Ext3 兼容。运行若干条命令,就能从 Ext3 在线迁移到Ext4。而无须又一次格式化磁盘或又一次安装系统。原有 Ext3数据结构照样保留,Ext4作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。

    2. 更大的文件系统和更大的文件。

      较之 Ext3 眼下所支持的最大 16TB 文件系统和最大 2TB 文件,Ext4分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。

    3. 无限数量的子文件夹。Ext3 眼下仅仅支持 32,000 个子文件夹。而Ext4支持无限数量的子文件夹。

    4. Extents。Ext3 採用间接块映射,当操作大文件时,效率极其低下。比方一个 100MB 大小的文件,在 Ext3 中要建立 25,600 个数据块(每一个数据块大小为 4KB)的映射表。而Ext4引入了现代文件系统中流行的 extents 概念,每一个 extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600 个数据块中”,提高了不少效率。

    5. 多块分配。当写入数据到 Ext3 文件系统中时。Ext3 的数据块分配器每次仅仅能分配一个 4KB 的块,写一个 100MB 文件就要调用 25,600 次数据块分配器,而Ext4的多块分配器“multiblock allocator”(mballoc) 支持一次调用分配多个数据块。
    6. 延迟分配。Ext3 的数据块分配策略是尽快分配,而Ext4和其他现代文件操作系统的策略是尽可能地延迟分配。直到文件在 cache 中写完才開始分配数据块并写入磁盘。这样就能优化整个文件的数据块分配,与前两种特性搭配起来能够显著提升性能。
    7. 高速 fsck。曾经运行 fsck 第一步就会非常慢,由于它要检查全部的 inode,如今Ext4给每一个组的 inode 表中都加入了一份未使用 inode 的列表。今后 fsck Ext4 文件系统就能够跳过它们而仅仅去检查那些在用的 inode 了。
    8. 日志校验。日志是最经常使用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致很多其它的数据损坏。Ext4的日志校验功能能够非常方便地推断日志数据是否损坏,并且它将 Ext3 的两阶段日志机制合并成一个阶段。在添加安全性的同一时候提高了性能。
    9. “无日志”(No Journaling)模式。日志总归有一些开销,Ext4同意关闭日志,以便某些有特殊需求的用户能够借此提升性能。
    10. 在线碎片整理。

      虽然延迟分配、多块分配和 extents 能有效降低文件系统碎片,但碎片还是不可避免会产生。

      Ext4支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。

    11. inode 相关特性。

      Ext4支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳很多其它的扩展属性(如纳秒时间戳或 inode 版本号),默认 inode 大小为 256 字节。Ext4还支持高速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。

    12. 持久预分配(Persistent preallocation)。

      P2P 软件为了保证下载文件有足够的空间存放,经常会预先创建一个与所下载文件大小同样的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。

      Ext4在文件系统层面实现了持久预分配并提供对应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。

    13. 默认启用 barrier。磁盘上配有内部缓存。以便又一次调整批量数据的写操作顺序。优化写入性能,因此文件系统必须在日志数据写入磁盘之后才干写 commit 记录,若 commit 记录写入在先。而日志有可能损坏。那么就会影响数据完整性Ext4默认启用 barrier。仅仅有当 barrier 之前的数据所有写入磁盘,才干写 barrier 之后的数据。

      (可通过 "mount -o barrier=0" 命令禁用该特性。


    HFS

    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卷须要以下的五个结构:
    1. 卷的逻辑块0和1是启动块。它包括了系统启动信息。比如,启动时加载的系统名称和壳(一般是Finder)文件。
    2. 逻辑块2包括主文件夹块(Master Directory Block,简称MDB)。

    3. 逻辑块3是卷位图(Volume Bitmap)的启动块,它追踪分配块使用状态。
    4. 总文件夹文件(Catalog File)是一个包括全部文件的记录和储存在卷中文件夹的B*-tree。
    5. 扩展溢出文件(Extent Overflow File)是当最初总文件夹文件里三个扩展占用后。另外一个包括额外扩展记录的分配块相应信息的B*-tree。

    HFS+

    编辑
    在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个字符。


           以上文章的内容是我理解后借阅资料整合出来的希望对你有所帮助。

  • 相关阅读:
    数据压缩API
    Dll劫持
    傀儡进程
    自定义网页右键菜单总结
    自定义checkbox, radio样式总结
    有趣的鼠标悬浮模糊效果总结
    听指令的小方块(二)总结
    听指令的小方块(一)总结
    表单(三)联动总结
    表单(二)多个表单项的动态校验总结
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7205268.html
Copyright © 2011-2022 走看看