通用块层是 linux 中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响。它位于文件系统和磁盘驱动之间,类似于 JAVA 中的适配器模式,让我们无需关注底层实现,只需提供固定接口即可。
通用块层的设计目的是为了提高磁盘读写的效率和可靠性。它通过对 I/O 请求进行排队和调度,以最大化磁盘的吞吐量和响应时间。通用块层可以管理多个块设备,并将它们抽象为一个统一的接口,使得文件系统和应用程序可以无差别地访问这些设备。
在 Linux 内核中,有五种主要的 I/O 调度算法可供选择,它们分别是没有调度算法、先入先出调度算法、完全公平调度算法、优先级调度算法和最终期限调度算法。这些算法适用于不同的场景和需求。
第一种,没有调度算法,就是没有任何特殊的处理,直接将文件系统和应用程序的 I/O 请求发送给块设备。这种算法常用在虚拟机中,因为磁盘 I/O 调度交由物理机系统负责。
第二种,先入先出调度算法,就是按照 I/O 请求的到达顺序进行调度,先进入 I/O 调度队列的请求会先被处理。
第三种,完全公平调度算法,是大部分系统默认使用的调度算法。它为每个进程维护一个 I/O 调度队列,并根据时间片来均匀分配每个进程的 I/O 请求。
第四种,优先级调度算法,根据请求的优先级进行调度,优先级高的请求先被处理。这种算法适用于运行大量进程的系统,比如桌面环境或多媒体应用。
第五种,最终期限调度算法,为读写请求创建了不同的 I/O 队列,以提高机械磁盘的吞吐量,并确保达到最终期限的请求优先处理。这种算法适用于 I/O 压力较大的场景,比如数据库等。
另外多说一句优先级调度算法,它适合桌面环境或多媒体应用的原因主要有以下几点:
响应性:桌面环境或多媒体应用通常需要实时的响应,对于用户的操作或多媒体数据的播放,延迟较小的 I/O 响应是非常重要的。通过使用优先级调度算法,可以确保高优先级的 I/O 请求被优先处理,从而提高系统的响应性能。
性能优化:桌面环境或多媒体应用通常需要处理大量的数据,如图像、音频或视频等。通过使用优先级调度算法,可以将这些需要优先处理的数据请求置于较高的优先级,确保它们能够及时得到处理,从而提高整体的性能和流畅度。
平衡资源:桌面环境或多媒体应用通常需要同时运行多个任务或进程,这些任务可能会涉及到不同的资源需求。通过使用优先级调度算法,可以在资源有限的情况下,合理地分配和管理这些任务的 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’后,是如何显示到屏幕上的吗?