解密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定义了 ...
随机推荐
- Python基础 - 第一个python程序
Python程序是什么? Python源程序就是一个特殊格式的文本文件,可以使用任意文本编辑器软件做python的开发,python的文件扩展名为 .py 执行python程序的三种方式 直接调用解释 ...
- 人工智能导论——口罩佩戴检测详解(附带MTCNN论文精读)
人工智能导论--口罩佩戴检测详解(附带MTCNN论文精读) 一.问题重述 随着人类的科技不断进步,病毒也在随之更新迭代:在19年席卷全球的新冠肺炎疫情给人们的生活带来了极大的灾难,造成了无数的人因此失 ...
- Java革命性ORM框架之快速上手的Jimmer
Jimmer是一款革命性的ORM框架,它的目标是提供一个简单易用的API,帮助开发人员更加轻松地操作数据库.Jimmer使用了Java 8的新特性,如Lambda表达式和Stream API,使得代码 ...
- Mysql数据库体系化详细笔记(b站韩顺平)
Mysql数据库 一.数据库 使用命令行窗口连接MYSQL数据库 mysql服务启动,在cmd输入net start mysql 1.mysql -h主机名-Р端口-u用户名-p密码 2.登录前,保证 ...
- vulnhub-xxe靶场通关(xxe漏洞续)
vulnhub-xxe靶场通关(xxe漏洞续) 下面简单介绍一个关于xxe漏洞的一个靶场,靶场来源:https://www.vulnhub.com 这里面有很多的靶场. 靶场环境需要自己下载:http ...
- Hugging News #0626: 音频课程更新、在线体验 baichuan-7B 模型、ChatGLM2-6B 重磅发
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- Linux 上的 .NET 如何自主生成 Dump
一:背景 1. 讲故事 前几天微信上有位朋友找到我,说他程序的 线程数 会偶发性瞬时飙高,让我看下大概是什么原因,截图如下: 如果这种问题每天都会出现,比较好的做法就是用 dotnet-trace 捕 ...
- 基于百度AI平台的人脸识别评分小程序
face-recognition-scoring-applet 开放源代码,遵循Apache License 2.0 效果展示 可切换摄像头.拍照.从相册选择 效果预览 小程序账号注册及配置 地址:h ...
- TCP/IP协议发明人G-Cerf
如果你是一个IT人,你可以不知道Vinton G. Cerf博士,但你不可能不知道TCP/IP; 如果你不是一个IT人,你可以不知道TCP/IP,但你不可能不知道互联网; 如果从1973年起,Vint ...
- UI自动化 --- UI Automation 基础详解
引言 上一篇文章UI自动化 --- 微软UI Automation中,介绍了UI Automation能够做什么,且借助 Inspect.exe 工具完成了一个模拟点击操作的Demo,文章结尾也提出了 ...