美文网首页
文件系统和磁盘工作原理

文件系统和磁盘工作原理

作者: wayyyy | 来源:发表于2020-12-27 18:41 被阅读0次

    文件系统

    • 磁盘为系统提供了最基本的持久化存储
    • 文件系统则在磁盘的基础上,提供了一个用于管理文件的树状结构。
    索引节点和目录项

    Linux 文件系统为每个文件都分配两个数据结构,索引节点和目录项。它们主要用来记录文件的元信息和目录结构。

    • 索引节点
      简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。

      # df -ih /
      Filesystem     Inodes IUsed IFree IUse% Mounted on
      /dev/vda1        3.2M   97K  3.1M    4% /
      
    • 目录项
      简称为 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的关联关系。多个关联的目录项,就构成了文件系统的目录结构。不过,不同于索引节点,目录项是由内核维护的一个内存数据结构,所以通常也被叫做目录项缓存。

    image.png
    虚拟文件系统

    目录项、索引节点、逻辑块以及超级块,构成了 Linux 文件系统的四大基本要素。
    不过,为了支持各种不同的文件系统,Linux 内核在用户进程和文件系统的中间,又引入了一个抽象层,也就是虚拟文件系统 VFS(Virtual File System)。

    image.png

    这些文件系统,要先挂载到 VFS 目录树中的某个子目录(称为挂载点),然后才能访问其中的文件。


    机械磁盘工作原理
    • 磁头
      读取磁盘表面磁方向和改变其方向,每个盘面有一个磁头,它极其贴近地悬浮在盘面上,但是绝对不与盘面接触,否则会损坏磁头和盘面;

    • 磁道
      磁道是单个盘面上的同心圆

    • 柱面
      在有多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面。

    • 扇区
      磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector)。扇区是读写磁盘最基本的单位。


      image.jpg
    • 寻道时间
      为了访问数据,第一步是:将磁头移动到目标的磁道之上。

    • 旋转延时
      一旦磁头到达了正确的磁道,就必须等待要访问的扇区转动到读写头下面,该等待时间称为旋转延时。
      平均时延通常是磁盘转档一周时间的一半。

    • 传输时间
      即传输一块数据所需要的时间。

    机械磁盘的最小读写单位是扇区,一般大小为 512 字节。如果每次都读写 512 字节这么小的单位的话,效率很低。所以,文件系统会把连续的扇区或页,组成逻辑块,然后以逻辑块作为最小单元来管理数据。常见的逻辑块的大小是 4KB。

    通用块层

    在 Linux 中,磁盘实际上是作为一个块设备来管理的。虚拟文件系统 VFS 类似,为了减小不同块设备的差异带来的影响,Linux 通过一个统一的通用块层,来管理各种不同的块设备。

    通用块层,其实是处在文件系统和磁盘驱动中间的一个块设备抽象层:

    • 第一个功能跟虚拟文件系统的功能类似。向上,为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来管理这些设备的驱动程序。

    • 第二个功能,通用块层还会给文件系统和应用程序发来的 I/O 请求排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率。

      对 I/O 请求排序的过程,也就是我们熟悉的 I/O 调度:

      • None
        它完全不使用任何 I/O 调度器,对文件系统和应用程序的 I/O 其实不做任何处理,常用在虚拟机中(此时磁盘 I/O 调度完全由物理机负责)。
      • NOOP
        是最简单的一种 I/O 调度算法。它实际上是一个先入先出的队列,只做一些最基本的请求合并,常用于 SSD 磁盘。
      • CFQ
        也被称为完全公平调度器,是现在很多发行版的默认 I/O 调度器,它为每个进程维护了一个 I/O 调度队列,并按照时间片来均匀分布每个进程的 I/O 请求。
      • DeadLine
        分别为读、写请求创建了不同的 I/O 队列,可以提高机械磁盘的吞吐量,并确保达到最终期限(deadline)的请求被优先处理。DeadLine 调度算法,多用在 I/O 压力比较重的场景,比如数据库等。

    I/O栈

    可以把 Linux 存储系统的 I/O 栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。这三个 I/O 层的关系如下图所示:


    image.png

    根据这张 I/O 栈的全景图,可以更清楚地理解,存储系统 I/O 的工作原理:

    • 文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。

    • 通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。

    • 设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。

    存储系统的 I/O ,通常是整个系统中最慢的一环;所以, Linux 通过多种缓存机制来优化 I/O 效率。比如说:
    为了优化文件访问的性能,会使用页缓存、索引节点缓存、目录项缓存等多种缓存机制,以减少对下层块设备的直接调用。
    同样,为了优化块设备的访问效率,会使用缓冲区,来缓存块设备的数据。

    相关文章

      网友评论

          本文标题:文件系统和磁盘工作原理

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