文件系统

文件系统

​ 生磁盘(raw disk)中盘块是磁盘访问的基本单位,将盘块划分成更高层次的抽象就是文件。Linux中用文件头来代表一个文件,也叫Inode,其指向了磁盘上数据块的位置。

  • 文件的存储方式

    • 连续空间存放方式:数据都是紧密相连,读写效率很高,文件头里需要指定「起始块的位置」和「长度」。但有「磁盘空间碎片」和「文件长度不易扩展」的缺陷。
    • 链表方式:文件头要包含「第一块」和「最后一块」的位置,并且每个数据块里面留出一个指针空间,用来存放下一个数据块的位置,写速度快,缺点是随机访问性能差。
    • 索引方式:为每个文件创建一个「索引数据块」,里面存放的是指向文件数据块的指针列表,因此读写速度都快。
      • 链表 + 索引:在「索引数据块」留出一个存放下一个索引数据块的指针,形成链表,原先数据索引块不足时方便扩充。
      • 索引 + 索引:也称为「多级索引块」,通过一个索引块来存放多个索引数据块。
  • 空闲空间管理

    • 空闲表法。空闲表法就是为所有空闲空间建立一张表,当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。
    • 空闲链表法。指向下一个空闲块的方式变成了一个指针。
    • 位图法。Linux 文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于 inode 空闲块的管理
  • 文件系统的结构

    ​ Linux 文件系统,把这个结构称为一个块组,文件系统中最开始的块组叫引导块,后面有N个块组。每个块组包含:

    • 超级块,包含的是文件系统的重要信息,比如 inode 总个数、块总个数、每个块组的 inode 个数、每个块组的块个数等等。
    • 块组描述符,包含文件系统中各个块组的状态,比如块组中空闲块和 inode 的数目等,每个块组都包含了文件系统中「所有块组的组描述符信息」。
    • 数据位图和 inode 位图, 用于表示对应的数据块或 inode 是空闲的,还是被使用中。
    • inode 列表,包含了块组中所有的 inode,inode 用于保存文件系统中与各个文件和目录相关的所有元数据。
    • 数据块,包含文件的有用数据。
  • 目录的存储

    ​ Linux中万物皆文件,目录也是个文件,普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息(如文件名、文件 inode、文件类型等)。

  • 软链接和硬链接

    • 硬链接:硬链接是多个目录项中的「索引节点」指向一个文件,也就是指向同一个 inode,但是 inode 是不可能跨越文件系统的。只有删除文件的所有硬链接以及源文件时,系统才会彻底删除该文件。
    • 软链接:相当于新的文件, 有独立的inode,文件的内容是另外一个文件的路径,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以软链接是可以跨文件系统的,甚至目标文件被删除了,链接文件还是在的,只不过指向的文件找不到了而已。
  • 文件 I/O

    • 缓冲与非缓冲 I/O。「是否利用标准库缓冲」来区分。
    • 直接与非直接 I/O。直接IO不会经过内核缓存。
    • 阻塞与非阻塞 I/O、同步与异步 I/O。
posted @ 2021-04-20 20:21  i%2  阅读(102)  评论(0)    收藏  举报