内核缓存区和write行为

2024-06-21 16:58
文章标签 行为 缓存 内核 write

本文主要是介绍内核缓存区和write行为,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  应用缓冲技术能很明显的提高系统效率。内核与外围设备的数据交换,内核与用户空间的数据交换都是比较费时的,使用缓冲区就是为了优化这些费时的操作。其实核心到用户空间的操作本身是不buffer的,是由I/O库用buffer来优化了这个操作。比如read本来从内核读取数据时是比较费时的,所以一次取出一块,以避免多次陷入内核。
      内核缓冲区的 主要思想就是一次读入大量的数据放在缓冲区,需要的时候从缓冲区取得数据
      管理员模式和用户模式之间的切换需要消耗时间,但相比之下,磁盘的I/O操作消耗的时间更多,为了提高效率,内核也使用缓冲区技术来提高对磁盘的访问速度磁盘是数据块的集合,内核会对磁盘上的数据块做缓冲。内核将磁盘上的数据块复制到内核缓冲区中,当一个用户空间中的进程要从磁盘上读数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程的缓冲区中。当进程所要求的数据块不在内核缓冲区时,内核会把相应的数据块加入到请求队列,然后把该进程挂起,接着为其他进程服务。一段时间之后(其实很短的时间),内核把相应的数据块从磁盘读到内核缓冲区,然后再把数据复制到进程的缓冲区中,最后唤醒被挂起的进程。
      注:理解内核缓冲区技术的原理有助于更好的掌握系统调用read&write,read把数据从内核缓冲区复制到进程缓冲区,write把数据从进程缓冲区复制到内核缓冲区,它们不等价于数据在内核缓冲区和磁盘之间的交换
      从理论上讲,内核可以在任何时候写磁盘,但并不是所有的write操作都会导致内核的写动作。内核会把要写的数据暂时存在缓冲区中,积累到一定数量后再一 次写入。有时会导致意外情况,比如断电,内核还来不及把内核缓冲区中的数据写道磁盘上,这些更新的数据就会丢失。
      应用内核缓冲技术导致的结果是:提高了磁盘的I/O效率;优化了磁盘的写操作;需要及时的将缓冲数据写到磁盘。

 

Write行为

从write()调用返回时,内核已经将缓冲区所提供的数据到内核的缓冲区,但是无法保证数据已经写出到其预定的目的地。的确,写入调用返回的速度实在太快了,可能没有时间完成该项目的工作。处理器和硬盘之间的性能差异使得此类令人头痛的行为显而易见。

 

事实上,如果用户空间应用程序发出write()系统调用,Linux内核会先进行若干检查,接着将数据复制进缓冲区。稍后,内核会在后台收集所有“脏”(有数据写入)缓冲区(内容跟相应磁盘块不同的所有缓冲区),将它们安排成最佳顺序,接着写进磁盘。这让写入调用的执行快如闪电,几乎立即返回,这也让内核可以将写入操作延后到较空闲的时段再进行,并且是多笔写入操作会整批一起进行。

 

延后进行的写入操作并不会改变POSIX的语义。举例来说,数据刚写入缓冲区而尚未写回磁盘,此时如果发出读取请求,此请求可从缓冲区得到满足,而且不会因此而读取到地盘上的旧数据。此行为会实际提高性能,因为读取请求可从内存中的缓冲区得到满足,而不必从磁盘。当读取和写入请求如预期般交替出现时,结果也和预期一样,也就是说,数据被写回磁盘之前系统不会崩溃!即使应用程序相信写入请求已经成功完成了,但事实上数据尚未写回磁盘。

 

延后写入的另一个问题是无法安排写入顺序,尽管应用程序可能会安排写入请求的顺序,好让他们能够按照特定的顺序写回磁盘,内核会以它认为合适的方式重新安排写入请求的顺序,主要是基于新能的考虑。除非系统崩溃,否则这通常不是一个问题,因为所有缓冲区最后都会写回磁盘,所以一切都很好。即使如此,绝大多数的应用程序实际上并不关心写入请求的顺序。

 

延迟写入必须探讨的最后一个问题是汇报I/O错误。写回磁盘期间可能会发生任何无法向发出写入请求的进程汇报的I/O错误,例如磁盘驱动器故障。的确,缓冲区与这些进程毫无关系。假如有多个进程“弄脏”(将数据写入)单一缓冲区,而这些进程可能在数据写入缓冲区之后并且在数据写回磁盘之前先借宿了。

 

内核会试图尽量降低延后写入的风险,为了确保数据可以被及时写出,内核未缓冲区设立了一个时间上限,而且会在时间超过上限之前写出所有“脏”缓冲区。用户可通过/proc/sys/vm/dirty_expire_centiseconds来设定此值,此值以厘秒(百分之一秒)为单位。

这篇关于内核缓存区和write行为的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081796

相关文章

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

使用Spring Cache时设置缓存键的注意事项详解

《使用SpringCache时设置缓存键的注意事项详解》在现代的Web应用中,缓存是提高系统性能和响应速度的重要手段之一,Spring框架提供了强大的缓存支持,通过​​@Cacheable​​、​​... 目录引言1. 缓存键的基本概念2. 默认缓存键生成器3. 自定义缓存键3.1 使用​​@Cacheab

Nacos客户端本地缓存和故障转移方式

《Nacos客户端本地缓存和故障转移方式》Nacos客户端在从Server获得服务时,若出现故障,会通过ServiceInfoHolder和FailoverReactor进行故障转移,ServiceI... 目录1. ServiceInfoHolder本地缓存目录2. FailoverReactorinit

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_