1. 磁盘

磁盘是可以持久化存储的设备

  • 根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘。
    • 机械磁盘,硬盘驱动器(Hard Disk Driver)。机械磁 盘主要由盘片和读写磁头组成,数据就存储在盘片的环状磁道中。最小读写单位是扇区,一般大小为 512 字节。
    • 固态磁盘(Solid State Disk),由固态电子元器件组成。固态磁盘不需要磁道寻址,所以,不管是连续 I/O,还是随机 I/O 的性能,都比机械磁盘要好得多。最小读写单位是页,通常大小是4KB、8KB 等。
  • 按照接口来分类:
    • IDE(Integrated Drive Electronics)
    • SCSI(Small Computer System Interface)
    • SAS(Serial Attached SCSI)
    • SATA(Serial ATA)
    • FC(Fibre Channel)

2. 通用块层

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

第一个功能,跟虚拟文件系统的功能类似。向上,为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来 管理这些设备的驱动程序。 第二个功能,通用块层还会给文件系统和应用程序发来的 I/O 请求排队,并通过重新排 序、请求合并等方式,提高磁盘读写的效率。

Linux内核支持四种I/O调度算法:

  1. NONE:并不能算 I/O 调度算法。
  2. NOOP:是最简单的一种。它是一个先入先出的队列,只做一些最基本的请求合并,常用于SSD磁盘。
  3. CFQ:被称为完全公平调度器。维护一个I/O调度队列,并按照时间片均匀分布每个进程的I/O请求
  4. DeadLine:分别为读、写请求创建了不同的 I/O 队列,可以提高机械 磁盘的吞吐量,并确保达到最终期限(deadline)的请求被优先处理。

3. I/O栈

把 Linux 存储系统的 I/O 栈,由上到下分为三个层次,分别是文件系统层、通用块层和设备层。

  • 文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。
  • 通用块层,包括块设备 I/O 队列和 I/O 调度器。它会对文件系统的 I/O 请求进行排队,再通过重新排序和请求合并,然后才要发送给下一级的设备层。
  • 设备层,包括存储设备和相应的驱动程序,负责最终物理设备的 I/O 操作。