美文网首页IT笔记与心得
操作系统文件系统小结

操作系统文件系统小结

作者: 会跳的八爪鱼 | 来源:发表于2021-02-23 21:02 被阅读0次
    1. 文件系统概念(针对linux系统)
      VFS称为虚拟文件系统,是linux一个内核软件层,在具体的文件系统之上抽象的一层,用来处理与文件系统相关的所有调用,表现为能够给各种文件系统提供一个通用的接口,使上层的应用程序能够使用通用的接口访问不同文件系统,同时也为不同文件系统的通信提供了媒介。


      vfs在内核中的层级关系
    • User是用户应用程序;
    • GLIBC是c的库函数,作为应用程序的运行时库;
    • SCI(system-call interface)是系统调用接口,例如read,write,这层抽象允许用户程序的I/O操作转换为内核的接口调用;
    • VFS提供了一个抽象层,将API接口与不同存储设备的具体接口实现进行了分离,使得底层的文件系统类型、设备类型对上层应用程序透明;
    • 具体的硬件操作系统,例如硬盘操作系统ext3等;
    • 设备驱动程序,也属于内核,操纵硬件设备进行io工作;

    文件系统工作流程示例:用户写入一个文件,使用标准c的write函数,接着会被操作系统接管(内核陷入),转而sys_write这个系统调用(属于SCI层)。然后VFS层接受到这个调用,通过自身抽象的模型,转换为对给定文件系统、给定设备的操作,这一关键性的步骤是VFS的核心,需要有统一的模型,使得对任意支持的文件系统都能实现系统的功能。最后底层的文件使用调用设备驱动程序完成任务。


    文件系统工作流程示例

    所以vfs的抽象模型则是文件系统的关键。它包括超级快(super block),索引块(inode),目录(denty)和文件(file)vfs文件系统详解

    文件系统的磁盘结构
    目录项与索引结点的关系
    • 索引结点:索引结点是存放文件或者目录的信息的结构体,包括文件的大小,权限,磁盘存放位置创建时间等。索引结点和文件(包括目录和文件)是一对一的关系。
    • 目录文件与普通文件:目录与文件的区别在于:目录文件中的数据存储的是文件名或者子目录名以及对应的索引结点指针。普通文件存放的是数据。
      • note:由于索引结点和文件是一对一的关系,但是目录中不同文件名可以对应相同的索引结点,这样就形成了一个文件可以有多个文件名,这就是硬链接。同样的也有软连接,软连接创建的链接文件中填写了连接文件的路径,这样访问软连接就会根据路径跳转到被链接文件。
    • 目录项: 目录项是在内核中生成的数据结构,是将已经访问过的目录项存放在内存中,供缓存使用,提高访问速度。目录项与目录文件中的子目录相同,还增加了./..指向自身和父级指针快速访问上级目录,而且为了查询子目录方便,通过建立文件名hash与inode的对应关系,这样通过文件名就可以快速访问到inode。
    • 页缓存是面向文件,面向内存的。通俗来说,它位于内存和文件之间缓冲区,进程IO操作默认只和page cache交互,不直接和磁盘交互。
    • 超级快(superblock):用来存储设备中文件系统的块大小以及文件系统的状态等,一个超级块对应一个文件系统。
      note:目录中的目录项存放在磁盘中,所以可以将文件系统的目录结构持久化。而将访问过的目录项缓存到内存中可以提高访问速度,而且访问过的索引结点也会缓存在内存中。
    • 挂载:挂载是linux文件系统中的重要概念,通过挂载可以实现访问外接的设备。挂载的步骤:在原有目录中新建一个空目录,然后使用挂载命令将外接设备挂载到空目录,这样就可以在新建目录中访问外接设备的文件系统了。挂载其实就是将新建目录中索引结点的指针重定位到了外接系统的根目录,磁盘的文件系统也是挂载到了根目录中。


      挂载外接设备后的重定位
      挂载的原理
    • 文件的读取:通过文件描述符遍历文件目录项,找到文件与对应的inode,通过inode定位到页缓存,如果页缓存没有则定位到文件在磁盘的位置。
    1. 文件的存储
    • 磁盘是文件存储数据的地方,扇区是磁盘io传输的最小单元为512b,但是操作系统为了减少io传输的次数,将数据块作为操作系统文件传输的基本单位通常为4k(多个连续的扇区)。与内存页框通常相同。
    • ext文件系统是ubuntu默认的文件系统:主要分为启动块(root block)和很多块组block group,每个块组中都有超级块的拷贝(备份),快组描述符,索引位图(Inode Bitmap),块位图( Block Bitmap),索引结点表( Inode Table),数据区(Data Blocks),快组描述符中有索引结点位图和块位图的地址等。每个块组中的块位图和索引结点位图都只能占用一个block。
    • 文件在磁盘的存储方式:
      • 顺序存储:需要连续的存储空间,需要预先知道文件大小然后分配文件块,不利于文件拓展,删除一部分内容后可能会形成碎片。
      • 链式存储:通过链表的方式访问连接文件块,有利于拓展,但是只能从头访问,不能做到随机访问。
      • 索引分配:在inode中建立一张文件块与位置的索引 的索引关系。如下图:
        • 索引分配的优点:可以进行拓展,不会产生文件碎片,可以进行顺序读写。


          索引存储示例
      • 但是如果文件的数据非常大,大到一个索引块无法存储时,这是可以使用两种方式:1.使用索引+链表的方式,将索引块以链的形式存储,但是顺序查询就会变慢。 索引+链表
      • 还有一种方式是索引+索引的方式,inode中的索引是一级索引,一级索引对应的是二级索引块的地址,但是需要预先知道文件的大小,然后才能设计出几级索引,索引采用下图的结构设计文件。


        11.jpg
      • linux采用的多级索引结构,1-10个地址指向数据块,第11个地址是二级索引,第12个地址是三级索引,第13个地址是四级索引,这样可存放的文件内容很大,支持顺序查询,而且小文件没有经过索引,查询速度快。
    1. 空闲块的管理

    需要为文件的数据分配空间时,需要寻找空闲的磁盘块,但是怎么管理空闲的磁盘块。

    • 空闲表法:建立一张空闲块的表,记录空闲区的开始和结束的地址以及空闲块的数量。这种方式当有大量小空闲区时,表内容将变的很大。
    • 空闲链接法:将空闲块以链表的形式存储下一个空闲块的地址,缺点:当需要很多空闲块时,需要读出前一个空闲块才知道下一个空闲块的地址,需要进行多次io。
    • 位图法:将空闲块以一位的方式标识,0为空闲,1为占用,01010...
    • 成组链接法:将空闲表法与空闲链接法结合,将空闲块按100分组,然后组与组之间链接。


      成组链接法
      • 空闲盘块号栈:用来存放当前可用的一组空闲盘块的盘块号(最多含100 个号),以及栈中尚有的空闲盘块号数N。
      • note:空闲块号组中的第一个盘块号中对应的盘块中存放的是下一组空闲盘块区中的每个盘块号和盘块数。例如上图盘块号300所对应的盘块中是有数据的,它里面存放的是下一组盘块号(图中301-400以及盘块数100),然后下一组盘块号400对应的盘块中存放的是下下一组盘块号及块数。分配的过程如下:
    • 首先看空闲盘块号栈,发现N=2,那么到达栈顶即S.free[2-1]=299,即把299号盘块分配出去了(299号盘块里面没有数据)
    • 然后分配第二个盘块,这时N=1,如果再分配就会变成空栈了,因为S.free[N-1]=S.free[0]!=0,所以需要使用300号盘块,当使用300号盘块时先读取里面的内容拷贝到空闲盘块号栈(300号盘块里面有数据,里面存放的是下一组盘块号和块数),再将300号盘块分配出去。

    参考:https://mp.weixin.qq.com/s/qJdoXTv_XS_4ts9YuzMNIw(文件系统)
    https://blog.51cto.com/alanwu/1105681(挂载)
    https://www.cnblogs.com/f-ck-need-u/p/7016077.html(ext文件系统)
    https://blog.csdn.net/smartab/article/details/81285353(成组链接法)
    内核子系统

    相关文章

      网友评论

        本文标题:操作系统文件系统小结

        本文链接:https://www.haomeiwen.com/subject/nhrrfltx.html