当前位置: 首页 > news >正文

Linux内核学习(十)—— 块 I/O 层(基于Linux 2.6内核)

目录

一、剖析一个块设备

二、缓冲区和缓冲区头

三、bio 结构体

四、请求队列

五、I/O 调度程序


系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的硬件设备称作块设备,这些固定大小的数据片就称作。最常见的块设备为硬盘,其他的还有软盘驱动器、闪存等,它们都是以安装文件系统的方式使用的。

另一种基本的设备类型是字符设备。字符设备按照字符流的方式被有序访问,像串口和键盘就属于字符设备。

对于这两种类型的设备,它们的区别在于是否可以随机访问数据。内核对块设备的管理需要有一个专门提供服务的子系统,对字符设备的管理则不需要。

一、剖析一个块设备

块设备中最小的可寻址单位扇区。扇区大小一般是 2 的整数倍,最常见的是 512 字节。扇区的大小是设备的物理属性。

在软件层面上,最小逻辑可寻址单元为。块是文件系统的一种抽象,只能基于块来访问文件系统。虽然物理磁盘寻址是按照扇区进行的,但是内核执行的所有操作都是按照块进行的。所以块不能比扇区还小,只能倍数于扇区大小

总之,扇区是设备的最小寻址单元,也被称为 “硬扇区” 或 “设备块”;同样地,块是文件系统的最小寻址单元,也被称为 “文件块” 或 “I/O 块”。

二、缓冲区和缓冲区头

当一个块被调入内存时(在读入后或等待写出时),它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。一个页可以容纳一个或多个内存中的块。由于内核在处理数据时需要一些相关的控制信息(比如一个块属于哪个块设备,块对应于哪个缓冲区等),所以每一个缓冲区都有一个对应的描述符 buffer_head 结构体,称为缓冲区头,定义在 <linux/buffer_head.h>,它包含了内核操作缓冲区所需要的全部信息:

但是,将缓冲区头作为 I/O 操作单元带来了两个弊端:

  • 缓冲区头是一个很大且不容易控制的数据结构体,而且缓冲区头对数据的操作既不方便也不清晰。
  • 它仅能描述单个缓冲区,缓冲区头会促使内核八大块数据的 I/O 操作分解为多个 buffer_head 结构体进行操作。 

所以后面为块 I/O 操作引入了一种新型、灵活并轻量级的容器——bio 结构体。

三、bio 结构体

目前内核中块 I/O 操作的基本容器由 bio 结构体表示,定义在 <linux/bio.h>。该结构体代表了正在活动的以片段(segment)链表形式组织的块 I/O 操作。一个片段是一小块连续的内存缓冲区,而片段链表可以使一个缓冲区分散在内存的多个位置上,bio 结构体能对内核保证 I/O 操作的执行,像这样的向量 I/O 就是所谓的聚散 I/O。

bio 结构体定义于 <linux/bio.h> 中:

使用 bio 结构体的目的主要是代表正在现场执行的 I/O 操作,所以该结构体中的主要域都是用来管理相关信息的:

bi_io_vec 域指向一个 bio_vec 结构体数组,该结构体链表包含了一个特定 I/O 操作所需要使用到的所有片段。每个 bio_vec 结构都是一个形式为 <page, offset, len> 的向量,它描述的是一个特定的片段:片段所在的物理页、块在物理页中的偏移位置、块长度。

总之,每一个块 I/O 请求都通过一个 bio 结构体表示,每个请求包含一个或多个块,这些块存储在 bio_vec 结构体数组中,bio_vec 结构体描述了每个片段在物理页中的实际位置,并且像向量一样被组织在一起。

bio 结构体代表的是 I/O 操作,它包含内存中的一个或多个页;而 buffer_head 结构体代表的是一个缓冲区,它描述的仅仅是磁盘中的一个块。

四、请求队列

块设备将它们挂起的块 I/O 请求保存在请求队列中,该队列由 request_queue 结构体表示,定义在文件 <linux/blkdev.h> 中,包含一个双向请求链表以及相关控制信息。

队列中的请求由结构体 request 表示,一个请求可能要操作多个连续的磁盘块,所以每个请求可以由多个 bio 结构体组成。

五、I/O 调度程序

磁盘寻址是整个计算机中最慢的操作之一,为了缩短寻址时间,Linux 引入了 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 调度程序

相关文章:

Linux内核学习(十)—— 块 I/O 层(基于Linux 2.6内核)

目录 一、剖析一个块设备 二、缓冲区和缓冲区头 三、bio 结构体 四、请求队列 五、I/O 调度程序 系统中能够随机&#xff08;不需要按顺序&#xff09;访问固定大小数据片&#xff08;chunks&#xff09;的硬件设备称作块设备&#xff0c;这些固定大小的数据片就称作块。最…...

SpringMVC 写个 HelloWorld

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…...

ARM--day7(cortex_M4核LED实验流程、异常源、异常处理模式、异常向量表、异常处理流程、软中断编程、cortex_A7核中断实验)

软中断代码&#xff1a;&#xff08;keil软件&#xff09; .text .global _start _start:1.构建异常向量表b resetb undef_interruptb software_interruptb prefetch_dataabortb data_abortb .b irqb fiq reset:2.系统一上电&#xff0c;程序运行在SVC模式1>>初始化SVC模…...

Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。

LinkedList 是 Java 中的一个双向链表实现的类&#xff0c;它实现了 List 接口&#xff0c;同时也实现了 Deque 接口&#xff0c;因此可以用作列表、队列或双端队列。下面是关于 LinkedList 的基本介绍和细节讨论&#xff1a; 基本介绍&#xff1a; LinkedList 是一个双向链表…...

Proteus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Proteus软件是一款电路设计和仿真的综合性软件&#xff0c;由Labcenter公司开发。它提供了一个交互式的图形界面&#xff0c;用户可以在其中构建电路、仿真结果并实时观察仿真结果。 1、Proteus的历史和演变 Proteus软件最初于…...

“图为科技——什么是边缘计算“

边缘计算是一种新兴的计算模式&#xff0c;它将计算资源和服务推向离终端设备更近的地方。以往&#xff0c;计算任务大多集中在云端进行&#xff0c;但随着物联网和移动互联网的快速发展&#xff0c;边缘计算应运而生。 边缘计算的核心思想是将计算、存储和网络功能部署在离终端…...

SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

在上一篇文章讲述zuul的时候&#xff0c;已经提到过&#xff0c;使用配置服务来保存各个服务的配置文件。它就是Spring Cloud Config。 一、简介 在分布式系统中&#xff0c;由于服务数量巨多&#xff0c;为了方便服务配置文件统一管理&#xff0c;实时更新&#xff0c;所以需…...

mysql 错误码

一、 #22001 Caused by: java.sql.BatchUpdateException: Data truncation: #22001检查一下数据库表字段&#xff0c;特别是VARCHAR的长度是否够。 Caused by: java.sql.BatchUpdateException: #HY000检查是不是违反了非空约束&#xff0c;NOT NULL字段有没有没传的 二、...

HTML的form表单标签详解~

通过HTML提交表单数据有web中是非常常用的操作&#xff0c;所以有必要详细、仔细学习了解HTML的form表单。 目录 01-关键词 novalidate 是什么意思&#xff1f;02- action"" 是什么意思&#xff1f;03- enctype"multipart/form-data" 是什么意思&#xff1…...

Kafka 消费者“group_name”组正在永远重新平衡

目录 一、场景1.1、场景应用环境1.2、 问题重现二、问题分析三、解决方案一、场景 1.1、场景应用环境 卡夫卡:2.11-1.0.1。主题:并发度为 5 且分区为 5 。1.2、 问题重现 当应用程序重新启动并且在分区分配之前在主题上发布消息时,主题的 5 个消费者找到组协调器并向组协调…...

高并发编程-3. Amdahl(阿姆达尔)定律与Gustafson定律

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 前言 有关为什么要使用并行程序的问题前面已经进行了简单的探讨。总的来说&#xff0c;最重要的应该是处于两个目的。 第一&#xff0c;为了获得更…...

ffmpeg之常用的命令行参数

FFmpeg是一套可以用来转换数字音频、视频的开源代码工程&#xff0c;能够编译出SDK&#xff08;库&#xff09;和命令行工具。用户可以使用SDK开发程序实现音视频的操作&#xff0c;也可以使用命令行工具ffmpeg实现音视频的操作。 一、常用参数 -i inputfile 指定输入文件 -s…...

tomcat服务器

tomcat下载安装 1、认识tomcat服务器 tomcat用来管理web应用&#xff0c;叫应用服务器&#xff0c;tomcat本身也是java工程 为什么要使用tomcat 为了达到资源共享。 在静态web,俩种访问方式 一种是找到文件的磁盘路径&#xff0c;一种是直接点击右上角的浏览器图标 直接点击…...

【面试题】MVC、MVP与MVVM模式是什么?

MVC模式 MVC是应用最广泛的软件架构之一&#xff0c;一般MVC分为&#xff1a; Model&#xff08; 模型 &#xff09;、Controller&#xff08; 控制器 &#xff09;、View&#xff08; 视图 &#xff09;。 这主要是基于分层的目的&#xff0c;让彼此的职责分开。View 一般…...

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP&#xff1a;例&#xff1a;nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.113.1-200 扫描整个C段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.…...

vscode流程图插件使用

vscode流程图插件使用 1.在vscode中点击左下角设置然后选择扩展。 2.在扩展中搜索Draw.io Integration&#xff0c;安装上面第一个插件。 3.安装插件后在工程中创建一个后缀为drawio的文件并且双击打开即可绘制流程图...

mysql数据导入导出参数说明

一、使用into outfile和load data infile导入导出备份数据 这种方法的好处是导出的数据格式可以自己规定&#xff0c;并且导出的是纯数据&#xff0c;不含建表信息。 1.into outfile导出 SELECT * FROM metadatakeys INTO OUTFILE D:/outfile.txt FIELDS TERMINATED BY | E…...

Qt——QLineEdit控件常见的属性、方法和信号

QLineEdit控件常见的属性、方法和信号 一、QLineEdit控件常见属性和方法 二、QLineEdit控件常见信号 QLineEdit&#xff1a;单行文本输入框控件 一、QLineEdit控件常用属性和方法&#xff1a; 1. text&#xff1a; 描述&#xff1a;获取或设置文本框中的文本内容。 用法&…...

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解&#xff1a; 一维数组&#xff1a; 解析&#xff1a; 字符数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 字符串数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 一级指针&#xff1a; 解析&#xff1a; 解析&#xff1a; 二维数组&a…...

Conda命令整理-自用版

Conda用法整理-自用版 Conda介绍1、环境操作1.1 创建环境1.2 激活环境1.3 导出环境1.4 导入环境1.5 关闭环境1.6 删除环境 2、包操作2.1 安装软件包2.2 安装指定包的指定版本 参考资料 Conda介绍 Conda是一个开源的包管理系统和环境管理器&#xff0c;用于在不同的计算环境中安…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...