块设备 I/O 请求送达到外部设备

对于 ext4 文件系统,最后调用的是 ext4_file_write_iter,它将 I/O 的调用分成两种情况:

第一是直接 I/O。最终我们调用的是 generic_file_direct_write,这里调用的是 mapping->a_ops->direct_IO,实际调用的是 ext4_direct_IO,往设备层写入数据。

第二种是缓存 I/O。最终我们会将数据从应用拷贝到内存缓存中,但是这个时候,并不执行真正的 I/O 操作。它们只将整个页或其中部分标记为脏。写操作由一个 timer 触发,那个时候,才调用 wb_workfn 往硬盘写入页面。

接下来的调用链为:wb_workfn->wb_do_writeback->wb_writeback->writeback_sb_inodes->__writeback_single_inode->do_writepages。在 do_writepages 中,我们要调用 mapping->a_ops->writepages,但实际调用的是 ext4_writepages,往设备层写入数据。

do_direct_IO 里面有两层循环,第一层循环是依次处理这次要写入的所有块。对于每一块,取出对应的内存中的页 page,在这一块中,有写入的起始地址 from 和终止地址 to,所以,第二层循环就是依次处理 from 到 to 的数据,调用 submit_page_section,提交到块设备层进行写入。

电梯算法有很多种类型,定义为 elevator_type。

  • struct elevator_type elevator_noopNoop 调度算法是最简单的 IO 调度算法,它将 IO 请求放入到一个 FIFO 队列中,然后逐个执行这些 IO 请求。

Noop 调度算法是最简单的 IO 调度算法,它将 IO 请求放入到一个 FIFO 队列中,然后逐个执行这些 IO 请求。

  • struct elevator_type iosched_deadline

Deadline 算法要保证每个 IO 请求在一定的时间内一定要被服务到,以此来避免某个请求饥饿。为了完成这个目标,算法中引入了两类队列,一类队列用来对请求按起始扇区序号进行排序,通过红黑树来组织,我们称为 sort_list,按照此队列传输性能会比较高;另一类队列对请求按它们的生成时间进行排序,由链表来组织,称为 fifo_list,并且每一个请求都有一个期限值。

  • struct elevator_type iosched_cfq

又看到了熟悉的 CFQ 完全公平调度算法。所有的请求会在多个队列中排序。同一个进程的请求,总是在同一队列中处理。时间片会分配到每个队列,通过轮询算法,我们保证了 I/O 带宽,以公平的方式,在不同队列之间进行共享。

elevator_init 中会根据名称来指定电梯算法,如果没有选择,那就默认使用 iosched_cfq。

我们用两块硬盘组成 RAID,两个 RAID 盘组成 LVM,然后我们就可以在 LVM 上创建一个块设备给用户用,我们称接近用户的块设备为高层次的块设备,接近底层的块设备为低层次(lower)的块设备。这样,generic_make_request 把 I/O 请求发送给高层次的块设备的时候,会调用高层块设备的 make_request_fn,高层块设备又要调用 generic_make_request,将请求发送给低层次的块设备。虽然块设备的层次不会太多,但是对于代码 generic_make_request 来讲,这可是递归的调用,一不小心,就会递归过深,无法正常退出,而且内核栈的大小又非常有限,所以要比较小心。

对于块设备的 I/O 操作分为两种,一种是直接 I/O,另一种是缓存 I/O。无论是哪种 I/O,最终都会调用 submit_bio 提交块设备 I/O 请求。

对于每一种块设备,都有一个 gendisk 表示这个设备,它有一个请求队列,这个队列是一系列的 request 对象。每个 request 对象里面包含多个 BIO 对象,指向 page cache。所谓的写入块设备,I/O 就是将 page cache 里面的数据写入硬盘。

对于请求队列来讲,还有两个函数,一个函数叫 make_request_fn 函数,用于将请求放入队列。submit_bio 会调用 generic_make_request,然后调用这个函数。

另一个函数往往在设备驱动程序里实现,我们叫 request_fn 函数,它用于从队列里面取出请求来,写入外部设备。

此文章为11月Day15学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/151293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLO目标检测——烟叶病害检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:烟叶病虫害防治数据集说明:烟叶病害检测数据集,真实场景的高质量图片数据,数据场景丰富,类别分为:轻度病虫、中度病虫、高度病虫标签说明:使用lableimg标注软件标注,标…

11-15 周三 softmax 回归学习

11-15 周三 softmax 回归学习 时间版本修改人描述2023年11月15日11:17:27V0.1宋全恒新建文档 简介 softmax分享可以参考什么是softmax 回归估计一个连续值,分类预测一个离散类别。 恶意软件的判断 回归和分类 分类可以认为从回归的单输出变成多输出 B站学习 softm…

Spring cloud负载均衡@LoadBalanced LoadBalancerClient

LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…

童装CPC认证检测哪些内容?童装上架亚马逊美国站CPC认证办理

童装是指适合儿童穿着的服装。按年龄分,包括婴儿服装、儿童服装、童装、中年童装、大童服装。CPC认证即儿童产品证书(CPC),主要针对12岁以下的儿童,如玩具、摇篮、童装等。跨境卖家作为“进口商”,想要将中…

差分信号的末端并联电容到底有什么作用?

差分信号的末端并联电容到底有什么作用? 在现代电子系统中,差分信号是一种常见的信号形式,它们通过两根互补的信号线传输信号,具有较低的噪声和更高的抗干扰能力。然而,当差分信号线长度较长或者遇到复杂的电路环境时&…

服务器监控及其监控工具

随着互联网技术的不断发展,服务器成为现代企业中不可或缺的一环。对于很多企业来说,服务器故障会给公司的日常工作和财务带来不小的影响。这时,服务器监控成为了保障服务器高效安全运行的一项重要工作。有许多监控工具可以帮助我们更好地监控…

cleer的耳机怎么样?南卡和cleer哪个好?两款开放式耳机深度横评对比

随着开放式耳机的发展,成为许多用户的首选。开放式耳机因其更自然的音质表现和佩戴更舒适体验而备受欢迎。然而,市面上开放式耳机品牌和型号繁多,如何选择一款适合自己的耳机成为了许多用户的难题。 本期文章将为大家推荐两款市面上优秀的开…

VS2022配置wxWidgets 3.0.5

Downloads - wxWidgets下载Windows ZIP 解压进入E:\SoftWare\wxWidgets-3.0.5\build\msw,用VS2022打开wx_vc12.sln,选择生成——批生成,最终生成一些文件 打开VS2022,新建属性表,在属性表里设置: c——常规…

OpenCV的应用——快递二维码识别

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可用于实现图像识别、目标检测、图像分割等功能。在现代物流行业中,快递二维码识别是一项非常重要的任…

STM32F103C8T6硬件spi读取ADS1118

硬件SPI读取ADS1118 文章目录 硬件SPI读取ADS1118前言一、ADS1118技术手册二、SPI的配置1.spi.c和.h的配置2.ads1118.c3.ads1118.h 总结 前言 现在要用到SPI去读取数据,读取的芯片是ADX的一款,但是和ADS1118是一模一样的 分享一下读取的过程 一、ADS11…

基于纵横交叉算法优化概率神经网络PNN的分类预测 - 附代码

基于纵横交叉算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于纵横交叉算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于纵横交叉优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

Freeswitch中CHANNEL_UNHOLD取回事件

1. CHANNEL_UNHOLD取回事件 2023-11-15T09:18:45.3740800 INFO c.e.c.v.s.c.i.FsServerEventHandler - eventReceived:CHANNEL_UNHOLD 2023-11-15T09:18:45.3740800 INFO c.e.c.v.s.c.i.FsServerEventHandler - EventBody********:{variable_effective_caller_id_number1000,…

【开源】基于微信小程序、Vue和SpringBoot的智慧家政系统

项目编号: S 063 ,文末获取源码。 \color{red}{项目编号:S063,文末获取源码。} 项目编号:S063,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服…

上海亚商投顾:沪指震荡反弹 汽车产业链多股涨停

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 指数早间高开后震荡回落,三大股指最终均小幅上涨。汽车产业链持续活跃,华为汽车方向领…

场景图形管理 - (1)

本章主要介绍在场景图形中如何管理场景数据及交互过程,这在实际开发中非常重要。 视图与相机 什么是视图?在《OpenGL编程指南》中有下面的比喻,从笔者开始学习图形学就影响深刻,相信对读者学习场景管理也会非常有帮助。 产生目标场景视图的变…

【JUC】七、读写锁

文章目录 1、读写锁2、读写锁的体验3、读写锁的特点4、锁的演变5、读写锁的降级6、复习:悲观锁和乐观锁 1、读写锁 JUC下的锁包的ReadWriteLock接口,以及其实现类ReentrantReadWriteLock ReadWriteLock 维护了一对相关的锁,即读锁和写锁&…

TikTok对文化艺术的影响:传统与现代的碰撞

在这个数字时代,社交媒体平台不仅改变了我们的社交方式,也对文化和艺术产生了深远的影响。其中,TikTok是一个备受欢迎的应用,已成为传统与现代文化艺术交汇的独特平台。本文将深入探讨TikTok对文化艺术的影响,以及传统…

Freeswitch中CHANNEL_HOLD保持事件

1.CHANNEL_HOLD保持事件 2023-11-15T09:18:42.6920800 INFO c.e.c.v.s.c.i.FsServerEventHandler - eventReceived:CHANNEL_HOLD 2023-11-15T09:18:42.6920800 INFO c.e.c.v.s.c.i.FsServerEventHandler - EventBody********:{variable_effective_caller_id_number1000, , va…

OpenCV必知必会基础3(包括色彩空间的变换、ROI、OpenCV中最重要的结构体Mat以及获取图像的属性)

文章目录 OpenCV的色彩空间——RGB与BGROpenCV的色彩空间——HSV与HSLHSV主要用于OpenCV中HSL OpenCV色彩空间转换YUV主要用于视频中题目 图像操作的基石Numpy【基础操作】np.arraynp.zerosnp.onesnp.fullnp.identitynp.eye Numpy基本操作之矩阵的检索与赋值Numpy基本操作三——…

Kylin-Server-V10-SP3+Gbase+宝兰德信创环境搭建

目录 一、Kylin-Server-V10-SP3 安装1.官网下载安装包2.创建 VMware ESXi 虚拟机3.加载镜像,安装系统 二、Gbase 安装1.下载 Gbase 安装包2.创建组和用户、设置密码3.创建目录4.解压包5.安装6.创建实例7.登录8.常见问题 三、宝兰德安装1.获取安装包2.解压安装3.启动…