通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响。它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提供固定接口即可。
通用块层的设计目的是为了提高磁盘读写的效率和可靠性。它通过对I/O请求进行排队和调度,以最大化磁盘的吞吐量和响应时间。通用块层可以管理多个块设备,并将它们抽象为一个统一的接口,使得文件系统和应用程序可以无差别地访问这些设备。
在Linux内核中,有五种主要的I/O调度算法可供选择,它们分别是没有调度算法、先入先出调度算法、完全公平调度算法、优先级调度算法和最终期限调度算法。这些算法适用于不同的场景和需求。
另外多说一句优先级调度算法,它适合桌面环境或多媒体应用的原因主要有以下几点:
在前面的讨论中,我们提到了存储系统的各个组成部分,包括设备、设备控制器、驱动程序和通用块层。现在结合文件系统原理,我们来详细了解一下 Linux 存储系统的 I/O 软件分层。
Linux 存储系统的 I/O 软件分层可以分为三个层次,分别是文件系统层、通用块层和设备层。它们之间的关系如下图所示:
这三个层次的作用是相互协作,实现对存储系统的高效管理和操作。
文件系统层是用户与存储系统交互的接口,通过虚拟文件系统和具体的文件系统实现,为应用程序提供了标准的文件访问接口。它负责将用户的文件操作请求转化为对底层存储设备的读写操作,并管理文件的元数据和目录结构。
通用块层在文件系统层之下,负责对文件系统的I/O请求进行排队和调度,以提高磁盘的读写效率。它包括块设备的I/O队列和I/O调度器,通过合理的调度算法,选择最优的顺序和时间进行I/O操作。
设备层是位于存储系统的最底层,包括硬件设备、设备控制器和驱动程序。它负责实际执行物理设备的I/O操作,将数据读取到内存或将数据写入到磁盘。
为了提高I/O的效率,Linux提供了多种缓存机制。页缓存、索引节点缓存和目录项缓存等缓存机制用于减少对块设备的直接访问,提高对文件数据的读取和写入效率。此外,还有缓冲区用于缓存块设备的数据,以减少对磁盘的频繁访问。
为了满足特定设备的功能和属性的检查和配置需求,Linux提供了ioctl接口,它是一种通用的输入输出控制接口,用于对特定设备进行属性和功能的控制和修改。
总的来说,前面讨论了这么多知识点,你会发现从介绍操作系统开始到现在,所有操作都有一个中间层做‘适配’,其实目的很简单,中间层既相当于我们的拦截器一样,对上层的操作请求进行优化,又可以像适配器一样屏蔽掉底层设备的各个差异方便操作而已。
通用块层是Linux中的重要组件,位于文件系统和磁盘驱动之间,提供统一接口,优化磁盘读写效率和可靠性。它管理多个块设备,抽象为统一接口,使得文件系统和应用程序可以无差别访问。通用块层通过排队和调度I/O请求,最大化磁盘吞吐量和响应时间。Linux内核提供多种I/O调度算法适用于不同需求。当你学完这些知识点是否你自己可以大致想出敲完字母‘A’后,是如何显示到屏幕上的吗?