【性能基石之IO~~~Page Cache缓存页&直接IO、缓存IO、内存映射mmap&文件一致性问题&Dirty概念&解决方案&Buffer IO在堆内,堆外IO详细过程与mmap映射过程】

Linux·直接I/O原理 Linux直接I/O原理 阅读详情

一.知识回顾

【0.IO在开发中有着举足轻重的地位,所以我们非常有必要学习。IO性能基石专栏都整理好了,可根据需要进行学习!】
【1.性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】

二.Page Cache 缓存页

【性能基石之IO~~~Linux操作系统相关知识体系补充&虚拟文件系统&文件描述符&PageCache内核缓存页】

下面这张图来自于网络,可以帮助我们大致理解整个文件系统中PageCache所处的关键作用:
在这里插入图片描述

三.直接IO、缓存IO、内存映射mmap

3.1 直接IO Direct IO

  1. 直接IO就是应用程序直接访问磁盘数据,而不经过内核缓冲区,也就是绕过内核缓冲区,需要自己管理IO缓存区,这样做的目的是减少一次内核缓冲区到用户程序缓存的数据复制(减少开销)。
  2. 引入内核缓冲区的目的在于提高磁盘文件的访问性能,因为当进程需要读取磁盘文件时,如果文件内容已经在内核缓冲区中,那么就不需要再次访问磁盘。而当进程需要向文件写入数据时,实际上只是写到了内核缓冲区便告诉进程已经写成功,而真正写入磁盘是通过一定的策略进行延时的。

拓展:​ 对于一些较复杂的应用,比如数据库服务器,他们为了充分提高性能。希望绕过内核缓冲区,由自己在用户态空间时间并管理IO缓冲区,包括缓存机制和写延迟机制等,以支持独特的查询机制,比如数据库可以根据加合理的策略来提高查询缓存命中率。另一方面,绕过内核缓冲区也可以减少系统内存的开销,因为内核缓冲区本身就在使用系统内存。

  1. 直接IO的缺点:如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘加载,这种直接加载会非常缓慢。通常直接IO与异步IO结合使用,会得到比较好的性能。(异步IO:当访问数据的线程发出请求之后,线程会接着去处理其他事,而不是阻塞等待)。
    在这里插入图片描述

3.2 缓存IO Buffered IO

  1. 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。
  2. 缓存I/O的优点:首先,在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;其次,可以减少读盘的次数,从而提高性能。
  3. 缓存I/O的缺点:在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样,数据在传输过程中需要在应用程序地址空间(用户空间)和缓存(内核空间)之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销是非常大的。
    在这里插入图片描述

3.3 Memory-Mapped IO mmap

  1. 内存映射是指将硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域一一对应,当要访问内存中一段数据时,转换为访问文件的某一段数据。这种方式的目的同样是减少数据在用户空间和内核空间之间的拷贝操作。当大量数据需要传输的时候,采用内存映射方式去访问文件会获得比较好的效率。
  2. 使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。
  3. 简而言之mmap用于把文件映射到内存空间中,简单说mmap就是把一个文件的内容在内存里面做一个映像。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间<---->用户空间两者之间需要大量数据传输等操作的话效率是非常高的。
    在这里插入图片描述

四.Buffer IO在堆内,堆外IO详细过程与mmap映射过程?

下面这张图来自于马士兵教育周老师,
在这里插入图片描述

五.文件一致性问题&Dirty概念&解决方案

5.1文件一致性问题?

Page Cache 是对磁盘上 page(页)的内存缓存,同时可以用于读/写操作。一切内存缓存都存在一致性问题:内存中的数据与磁盘中的数据不一致。

5.2 Dirty相关概念?

如果发生写操作并且对应的数据在 Page Cache 中,那么写操作就会直接作用于 Page Cache 中,此时如果数据还没刷新到磁盘,那么内存中的数据就领先于磁盘,此时对应 page 就被称为 Dirty page。

5.3 Linux中实现文件一致性的俩种方式&对应的三种系统调用

5.3.1 Linux中实现文件一致性的俩种方式

Write Through(写穿):向用户层提供特定接口,应用程序可主动调用接口来保证文件一致性;
Write back(写回):系统中存在定期任务(表现形式为内核线程),周期性地同步文件系统中文件脏数据块,这是默认的 Linux 一致性方案;

5.3.2 三种系统调用

上述两种方式最终都依赖于系统调用,主要分为如下三种系统调用:

方法含义
fsync(int fd)将fd代表的文件的脏数据和脏元数据全部刷新至磁盘中
fdatasync(int fd)将fd代表的文件的脏数据刷新至磁盘,同时对必要的元数据刷新至磁盘中
sync()将系统中所有的脏文件数据和脏元数据全部刷新到磁盘中

好了,到这里【性能基石之IO~~~Page Cache缓存页&直接IO、缓存IO、内存映射mmap&文件一致性问题&Dirty概念&解决方案&Buffer IO在堆内,堆外IO详细过程与mmap映射过程】就结束了,更多内容,不断学习,不断积累,不断创作中。

浅谈Linux中直接I/O的机制原理 上边的代码段主要是检查了文件指针的值,文件的大小以及所请求读取的字节数目等,之后,该函数调用 generic_file_direct_io(),并将操作类型 READ,描述符 iocb,描述符 iovec,当前文件指针的值以及在描述符 io_vec  中指定的用户地址空间缓冲区的个数等值作为参数传给它。在缓存I/O的机制中,以写操作为例,数据先从用户态拷贝到内核态中的页缓存中,然后又会从页缓存中写到磁盘中,这些拷贝操作带来的CPU以及内存的开销是非常大的。降低了CPU的开销,和内存带宽。 阅读详情

相关推荐

Linux I/O系列之直接内存(Direct IO)原理剖析和使用

在上一篇文章《Linux I/O操作fsync后数据就安全了么(fsync、fwrite、fflush、mmap、write barriers详解)》中咱们一起学习了在Linux中如何将数据安全的写入到磁盘。其中我们提到了直接IO。使用它能够在磁盘缓存空间和用户空间直接建立一个通道,这样咱们在用户空间就能够直接操作磁盘中的数据。本文咱们就一起深入学习直接IO。

跳小闹成长记 7195

linux文件直接/间接IO

话不多说直接上图 错了 错了 linux文件IO分为两种 一.直接IO(直接去访问磁盘) 这种方式(效率比较低,因为每次我们都是直接去访问磁盘,CPU和磁盘之间的读写速度差了几个数量级,降低了读取的效率,但是这种方式也并非一无是处,直接IO,不需要经过缓存区,如果在缓存还没有同步到物理磁盘的时候突然宕机【这个是有可能的】,那缓存中的数据就会丢失,既然你去看日志是写成功的,它这个成功仅仅是表示 你把数据从用户态写到内核态,写成功了,但并没有同步磁盘,宕机之后,内存清空,你写的东西就丢失了【所...

qq_44065088的博客 516

STM32----SPI+DMA高效读写外部Flash的配置与实战

本文详细介绍了STM32通过SPI+DMA高效读写外部Flash的配置与实战方法。针对大量数据传输场景,使用DMA技术可显著提升系统效率,释放CPU资源。文章包含完整的代码实现、常见问题调试技巧以及性能优化建议,帮助开发者快速掌握这一关键技术。

pea55的博客 1030

【Linux系统编程】——深度理解5种IO模型

磁盘IO是十分缓慢的,所以Linux为了减少磁盘IO,在系统调用后,会利用DMA技术先将磁盘中的数据拷贝到内核的缓冲区中,这个缓存就是页缓存,只有当缓存满足某些条件时,才会发起磁盘IO。

sjp11的博客 1673

海康SDK实战:如何从PS流中提取H264裸流并实现前端播放(附完整代码)

本文详细介绍了如何利用海康SDK从PS流中提取H264裸流,并构建无插件前端播放的完整链路。通过解析PS流结构、提取H264 ES流,结合WebSocket实时传输与WFS.js前端播放器,实现了低延迟、高可控性的视频流处理方案,为开发者提供了从数据源到前端渲染的实战代码与清晰指南。

weixin_29051811的博客 476

Altera下载器驱动配置:手把手教程(从零实现)

详解Altera USB-Blaster驱动安装全过程,从设备识别到软件配置一步一图,解决常见连接问题,确保开发下载器正常工作,适合初学者快速上手FPGA下载调试。

weixin_35751194的博客 988

测试linux下 fprintf fwrite write mmap 等写文件的速度

/**************************************************************** * 说明: 用不同的方法,测试写文件的速度,测试结果表明 *       改变COUNT的值,将改变写入文件的大小 *      测试CPU使用率方法: /usr/bin/time -f "CPU: %P" ./a.out 1 * *************

yaxf999的专栏 1万+

深入解析HAL_UART_Receive_IT:如何高效配置串口中断接收

本文深入解析了STM32 HAL库中`HAL_UART_Receive_IT`函数的工作原理与高效配置方法。该函数并非直接接收数据,而是作为中断接收的启动器和配置器,通过开启相关中断,由`UART_Receive_IT`在后台完成数据搬运。文章详细对比了中断与轮询模式的区别,并提供了不定长数据接收的完整实战流程、常见问题避坑指南及高级应用技巧,帮助开发者构建稳定高效的串口通信。

weixin_29162439的博客 632

mmap映射方式读写本地文件

mmap映射方式打开文件 注意:同一个资源文件,不能同时读和写,否则指向文件的指针会乱掉,导致程序异常奔溃。 需要的头文件: #include &lt;stdio.h&gt; #include &lt;sys/mman.h&gt; //mmap函数的必要头文件 #include &lt;sys/stat.h&gt; // struct stat 需要的头文件 #include &lt;unistd.h&gt; #include &lt;fcntl.h&gt; #include &lt;string.h&

ss49344的博客 8591

关于42步进电机驱动——基于STM32 HAL库实现

我找了好多资料,好多关于42步进电机的都是文档,这么文档都需要积分,需要积分就算了内容还非常差,浪费时间和电脑的内存。关于大部分是基于Arduino和51去驱动的 42步进电机驱动硬件如下: 首先你要了解步进电机的驱动原理,我也不啰嗦了,请看这边博客: 二相四线,四相五线,四相六线步进电机接线及驱动方法 , 看完这篇你就知道驱动和接线的原理了。 起初我也为如何接线烦恼,因为有些博客在讲述这些问题的时候没有讲的很透彻。 方法如下: ①用万用表调到欧姆档,用其中一个表笔搭在一个引脚上,依次测其它.

Jodan132的博客 1万+

1、网站可靠性工程(SRE):原理、实践与转型指南

本文深入探讨了网站可靠性工程(SRE)的核心原理、实践方法以及组织转型策略。从SRE的基本概念如服务水平指标(SLI)、服务水平目标(SLO)和错误预算入手,详细解析了如何通过SRE实现产品开发、运营和管理团队的高效协作。此外,还涵盖了SRE的实施步骤,包括现状评估、组织认同、基础设施建设、事件响应、错误预算政策制定以及组织结构设计等内容。最后,文章展望了SRE的未来发展,强调了服务目录、合规监管及SRE文化建设的重要性,为企业的现代化运营体系转型提供了全面指南。

xk7n92h3p5m的博客 145

从Page Cache的产生机理到标准I/O与存储映射I/O的对比

详细介绍了Linux操作系统中的page cache机制,对比了在page cache产生过程中标准I/O和存储映射I/O的区别

mrqiuwen的博客 1029

西门子SMART PLC增量式PID(完整梯形图FC)

西门子PLC自带的PID指令是基于位置型的PID,位置型PID的算法公式和详细介绍,大家可以参看《PID专栏》的其它文章,这里不再赘述。本篇博文直接给出代码部分的讲解,不设计太多公式和理论的推导。限于本人能力,文中难免出现错误和不足之处,诚恳欢迎大家的批评和指正。同时感谢大家的订阅和关注。SMART200 PLC系统自带的PID指令解析,可以参看下面这篇文章:SMART PLC PID算法基本解析(附公式)_RXXW_Dor的博客-优快云博客_plc的pid算法在态运行中,控制器调节输出值,使偏差 (e

RXXW_Dor的博客 8146

操作系统18:磁盘I/O速度、磁盘可靠性、数据一致性

一个事务在对一批数据执行修改操作时,要么全部完成,并用修改后的数据去代替原来的数据,要么一个也不修改。事务操作所具有的这种特性,即事务的原子性(Atomic)。作为单个程序单元执行的一系列操作,并不是都可以成为事务,也就是说,如果定义其为事务,则必须同时满足四个属性,即事务属性 ACID。除了上述的原子性外,事务还应具备的属性是:一致性(Consistent),即事务在完成时,必须使所有的数据都保持一致状态隔离性(Isolated)

swadian2008的博客 3111

SAE ARP 4761A内容详解

SAE ARP 4761A主要为民用航空系统及设备的安全评估提供指南,帮助制造商和设计者满足FAA的FAR 25.1309等适航标准的要求。该文档旨在为航空器和航空系统设计中涉及的安全评估流程提供一个结构化的框架,并结合一系列工具和方法,如故障树分析(FTA)、依赖图分析(DD)、马尔可夫分析(MA)等,来系统地评估潜在的安全隐患。这一标准不仅适用于大型航空器的设计和评估,还可以应用于各种类型的飞行系统,如无人驾驶飞行器(UAV)和新型的电动垂直起降飞机(eVTOL)。

qq_41854911的博客 3147

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

I/O缓存与内存映射

前言 一般来说我们的CPU速度是比较快然而磁盘速度明显是低于CPU的,所以引入了缓存来解决这种速度上的差异,计算中的缓存无处不在,如上图所示,缓存就是为了缓和两个模块之间速率的冲突,也就是说我们去读写磁盘的时候可以将磁盘上的数据先放到缓存中,我们CPU去读写硬盘数据的时候不会去直接读取硬盘的数据而去缓存中读写,在应用层也存在缓存,比如我们在接受串口数据的时候可以开辟一个环形缓冲区来缓存串口的数据,这是在嵌入式系统设备中常有的做法,其目的都是为了更高效的运行 页高速缓存 页缓存是操作系统层面的概念,其英文

qq_41936794的博客 768

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MMAP文件加速读写小技俩

进程读写数据时除了使用read和write,还可以使用mmap进行文件映射,区别如下图所示: 可以看到,磁盘文件加载到内存后,还需要...

机械猿的博客 1524

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mmap详解

一文详细了解mmap原理

weixin_44821965的博客 6513

linux---mmap虚拟地址映射

https://www.cnblogs.com/huxiao-tee/p/4660352.html mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调...

qq_42024067的博客 1575

mmap函数用法及示例程序

UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。头文件:    #include 函数:void *mmap(v

byrsongQQ的专栏 922

标准IO-直接IO-异步IO笔记

标准IO-直接IO-异步IO笔记 1 标准IO通过read,write实现read: 如果数据在内存中,那么直接从内存中读出数据并返回给应用程序。如果不在内存,那么数据会被从磁盘读到也告诉缓存,然后再从页缓存拷贝到用户地址空间。wirte:数据从用户态拷贝到缓存即刻返回,并不会等数据写到磁盘上。优点:1. 使用内核缓冲区,分离用户地址空间和实际物理设备2. 减少磁盘读写次数...

tanzhe2017的博客 1362

标准IO和直接IO

注意:直接I/0的缺点就是如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘进行加载,这种直接加载会非常缓慢。通常直接I/0跟异步I/0结合使用会得到较好的性能。=绕过内核缓冲区直接访问,有效避免CPU和内存多余时间的开销。O_DIRECT 不等于 O_SYNC。

m0_68678128的博客 235

直接io的优点和缺点,以及使用场景介绍

直接 I/O 是一种强大的 I/O 操作方式,适用于特定的应用场景,能够提高数据一致性并减少内存使用。然而,它也具有更复杂的对齐和管理要求,可能在某些情况下不如缓冲 I/O 稳定。因此,在选择是否使用直接 I/O 时,应根据具体应用场景和需求进行权衡。如果您还有其他问题或者需要更具体的介绍,请随时告诉我!

weixin_45705773的博客 772

随笔-缓存一致性的理解

缓存一致性的理解 缓存一致性问题是在多线程情况下发生的。现在的中央处理器大多是多核心的,即有多个CPU。从内存模型来说,CPU想要从内存读取数据进行运算,需要经过这么一个路径: 先从内存中把数据复制到CPU高速缓存(现在CPU都有多级缓存) CPU从高速缓存中读取数据到寄存器,执行运算 题外话:高速缓存比内存的IO速度快很多,高速缓存的大小可以算是CPU的一个指标 回归正题,当多个CPU同时对内存中的数据进行缓存,就会引发缓存一致性问题 如图,假设有一个变量a=0在内存中,此时CPU1和CPU2同时要对

eryou_979的博客 210

缓存IO与直接IO

顺便提一下,与O_DIRECT类似的一个选项是O_SYNC,后者只对写数据有效,它将写入内核缓冲区的数据立即写入磁盘,将机器故障时数据的丢失减少到最小,但是它仍然要经过内核缓冲区。在 Linux 的缓存 I/O 机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间(用户空间)。读操作:操作系统检查内核空间的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回,也就是将数据复制到应用程序的用户空间;在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;

记录成长的博客 1043

缓存和内存的区别

许多人认为,“缓存”是内存的一部分 许多技术文章都是这样教授的 但是还是有很多人不知道缓存在什么地方,缓存是做什么用的 其实,缓存是CPU的一部分,它存在于CPU中 CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:CPU主频1G),而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大 缓存是为了解决CPU速度和内存速度的

9100
上一篇: 【Java中23种面试常考的设计模式之组合模式(Composite)---结构型模式】
下一篇: 【Leetcode每日一题:481.神奇字符串~~~模拟构造字符串+双指针】
硕风和炜
硕风和炜 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄7年 2万+粉丝 1024原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值