存储系统IO软件分层
大约 4 分钟
存储系统IO软件分层
提前总结
IO软件三个分层
前面说到了不少东西,设备、设备控制器、驱动程序、通用块层,现在再结合文件系统原理,我们来看看 Linux 存储系统的 I/O 软件分层。
可以把 Linux 存储系统的 I/O 由上到下可以分为三个层次:
内核
(1) 文件系统层
- 作用:包括虚拟文件系统和其他文件系统的具体实现,它向上为应用程序统一提供了标准的文件访问接口,向下会通过通用块层来存储和管理磁盘数据。
(2) 通用块层
- 作用:包括块设备的 I/O 队列和 I/O 调度器,它会对文件系统的 I/O 请求进行排队,再通过 I/O 调度器,选择一个 I/O 发给下一层的设备层。
物理硬件
- (3) 设备层
- 作用:包括硬件设备、设备控制器和驱动程序,负责最终物理设备的 I/O 操作。
- (3) 设备层
他们整个的层次关系如下 (下一节的架构图)
架构图
存储系统 - 线性分层
- 用户空间
- 用户程序
- 内核空间
- 文件系统接口
- 虚拟文件系统 (VFS)
- 作用:减少差异 (不同文件系统)
- 文件系统 (FS)
- 例如:ext4、nfs
- 页缓存
- 作用:“非直接I/O” 时的操作系统缓存
- 通用块层
- 作用:减少差异 (不同块设备)、统一管理块设备
- IO调度层 (块设备的)
- 作用:IO调度
- 驱动程序 (块设备的)
- 作用:减少差异 (不同设备控制器)
- 物理硬件
- 中断控制器 (块设备的)
- 设备控制器 (块设备的)
- 作用:减少差异 (不同设备)
- 磁盘设备
(在这个文件系统分层里面,我们前面和这章也依次学习过了:VFS FS 页缓存、设备 设备控制器 中断控制器、驱动程序 IO调度 通用块层。 然后把他们串连起来理解,融会贯通一下)
存储系统 / 网络系统 / 字符系统 - Linux内核系统调用接口
一些翻译:
- IO子系统
- (字符相关, 灰)
- 终端
- line discipline (不会翻译)
- 字符设备驱动程序
- (网络相关, 绿)
- 套接字
- 网络过滤器 / Nftables (后面词那个没搜到翻译)
- 网络协议栈
- Linux内核包调度器
- 网络设备驱动程序
- (文件存储相关, 青)
- 文件系统
- 通用块层
- Linux内核IO调度器
- 块设备驱动程序
- (字符相关, 灰)
- 内存管理子系统
- 虚拟内存
- 分页页替换 ???
- 页缓存
- 程序管理子系统
- 信号处理
- 程序/进程创建与终止
- Linux内核程序调度器
- (IRQs 中断请求,Dispatcher 调度器)
存储系统 - 堆栈图
一些翻译:
- 应用程序
- LIO
- 虚拟文件系统 VFS
- 基于块文件系统:ext2、ext3、ext4、xfs、btrfs、ifs、iso9660、gfs、ocfs、……
- 网络文件系统:NFS、coda、smbfs、ceph、……
- 假文件系统?:proc、sysfs、pipefs、futexfs、usbfs、……
- 特别目的文件系统?:tmpfs、ramfs、devtmpfs
- 页缓存
- 通用块层
- IO调度器:nooq、cfq、deadline
- blkmq
- SCSI 中间层
- SCSI 低层次驱动
- 物理驱动
- HDD、SDD、DVD驱动
- LSI Raid、LSI Raid、Adaptec Raid
- Qlongic HBA、Emulex HBA、LSI 12Gbs SAS HBA
- para-virtualized SCSI、VMware's para-virtualized SCSI
- virtio_pci、Micron PCIe Card、nvme device、stec device
设备的读写和操作
读写操作
相关函数:
read
、write
同读写文件。Linux一切皆文件,包括设备
有了文件系统接口之后,不但可以通过文件系统的命令行操作设备,也可以通过应用程序,调用 read、write 函数。 就像读写文件一样操作设备,所以说设备在 Linux 下,也只是一个特殊的文件。
非读写操作
相关函数:
ioctl
除了读写操作,还需要有检查特定于设备的功能和属性。使用 ioctl 接口,它表示输入输出控制接口,是用于配置和修改特定设备属性的通用接口。
提高效率的机制
另外,存储系统的 I/O 是整个系统最慢的一个环节,所以 Linux 提供了不少缓存机制来提高 I/O 的效率。
- 为了提高文件访问的效率:会使用 页缓存、索引节点缓存、目录项缓存 等多种缓存机制,目的是为了减少对块设备的直接调用。
- 为了提高块设备的访问效率:会使用 缓冲区,来缓存块设备的数据。
链接到当前文件 0
没有文件链接到当前文件