解密Linux中的通用块层:加速存储系统,提升系统性能
通用块层
通用块层是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请求,避免某些任务长时间等待,从而实现资源的平衡利用。
存储系统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’后,是如何显示到屏幕上的吗?

解密Linux中的通用块层:加速存储系统,提升系统性能的更多相关文章
- Linux文件IO与通用块层的请求合并
本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号“Linux阅码场” 请求合并就是将进程内或者进程间产生的在物理地址上连续的多个IO ...
- Linux中什么是块设备 及 lsblk命令的使用
Linux中I/O设备分为两类:字符设备和块设备.两种设备本身没有严格限制,但是,基于不同的功能进行了分类.(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取.相反,此类设备支 ...
- 微凉大大,教你一步一步在linux中正确的安装Xcache加速php。
首先,强烈吐槽,百度上的教程,都左复制右复制的,乱七八糟,缺东缺西的.借此微凉大大我提供我苦心整理好的教程.以便各位小菜能顺利的使用Xcache加速php,假设看完了,也操作了,还是失败了的话,请联系 ...
- .Net中EF通用数据层小结
增删改查: using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; u ...
- 教你一步一步在linux中正确的安装Xcache加速php
#第一步,下载Xcache wget http://xcache.lighttpd.net/pub/Releases/3.1.0/xcache-3.1.0.tar.gz #第一步非常简单,如果你下载不 ...
- 通用块层、IO调度层以及设备驱动层的数据结构
http://blog.chinaunix.net/uid-28897358-id-3775640.html
- Linux中IO监控命令的使用分析
一篇不错的有关linux io监控命令的介绍和使用. 1.系统级IO监控 iostat iostat -xdm 1 # 个人习惯 %util 代表磁盘繁忙程度.100% 表示磁盘 ...
- Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层【转】
转自:http://blog.csdn.net/droidphone/article/details/7497787 在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本 ...
- Linux SPI总线和设备驱动架构之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
- [转载]Linux驱动-SPI驱动 之二:SPI通用接口层
通过上一篇文章的介绍,我们知道,SPI通用接口层用于把具体SPI设备的协议驱动和SPI控制器驱动联接在一起,通用接口层除了为协议驱动和控制器驱动提供一系列的标准接口API,同时还为这些接口API定义了 ...
随机推荐
- SQL基础知识扫盲
@ 目录 SQL & 数据库基础知识扫盲 SQL是什么? 数据库是什么? 挺身入局,实践出真知 DBMS初体验 MySQL:初体验 Oracle:初体验 PostgreSQL:初体验 Demo ...
- sqlmap工具学习
tryhackme:sqlmap github:https://github.com/sqlmapproject/sqlmap kali集成 参数介绍 sqlmap -h ___ __H__ ___ ...
- Kotlin协程-那些理不清乱不明的关系
Kotlin的协程自推出以来,受到了越来越多Android开发者的追捧.另一方面由于它庞大的API,也将相当一部分开发者拒之门外.本篇试图从协程的几个重要概念入手,在复杂API中还原出它本来的面目,以 ...
- CentOs7安装部署Sonar环境(JDK1.8+MySql5.7+sonarqube7.8)
sonarqube安装前环境准备JDK1.8.MySql5.7. 一.JDK安装 1.下载jdk #打开下面的网址,选择 jdk-8u371-linux-x64.tar.gz 进行下载 (8u371版 ...
- 深入浅出MySQL事务
Photo by Lukas Hartmann from Pexels 辞职这段时间以来看见了很多工作之外的东西,我认为这是值得的.同时也有时间和机会来好好整理所学所想,准备开启下一段旅途. 事务的定 ...
- AGC019F Yes or No
题意 有 \(N+M\) 个问题,其中有 \(N\) 个问题的答案是 YES,\(M\) 个问题的答案是 NO.当你回答一个问题之后,会知道这个问题的答案,求最优策略下期望对多少.答案对 \(9982 ...
- 【python基础】文件-文件路径
1.文件路径 我们发现不管是写入还是写出操作,我们提供的都是文件名,其实这里准确说应该是文件路径.当我们简单把文件名传递给open函数时,Python将在当前执行程序的文件所在的目录中查找文件名所代表 ...
- 逍遥自在学C语言 | 指针陷阱-空指针与野指针
前言 在C语言中,指针是一种非常强大和灵活的工具,但同时也容易引发一些问题,其中包括空指针和野指针. 本文将带你了解这两个概念的含义.产生原因以及如何避免它们所导致的问题. 一.人物简介 第一位闪亮登 ...
- 多模态大语言模型 LlaVA 论文解读:Visual Instruction Tuning
代码:https://github.com/haotian-liu/LLaVA 总览 在这篇论文中,作者首次尝试使用纯语言 GPT-4 生成多模态语言图像指令遵循数据(insruction-follo ...
- C++面试八股文:技术勘误
不知不觉,<C++面试八股文>已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉. 为了不误导更多的小伙伴,以后会不定期的出勘误文章,请 ...