首页 > 其他分享 >传统缓存 IO 和 Mmap的区别

传统缓存 IO 和 Mmap的区别

时间:2024-07-19 09:01:14浏览次数:11  
标签:缓存 映射 Mmap 内存 IO 数据

在现代计算系统中,IO操作是数据处理的关键环节。为了提升IO操作的效率,开发者通常采用不同的技术手段来优化数据读写。传统缓存IO和内存映射(Mmap)是两种常用的方法,它们在性能、实现方式和应用场景上各有不同。本文将详细解释传统缓存IO和Mmap的区别,并探讨它们在不同场景下的应用。

传统缓存IO

传统缓存IO是指通过操作系统的缓存机制来优化数据读写的一种方法。当应用程序读取或写入数据时,操作系统会将数据缓存在内存中,以减少磁盘IO操作的频率,从而提升系统的性能。

工作原理
  1. 读取操作

    • 应用程序发出读取请求。
    • 操作系统首先检查数据是否在缓存中(即Page Cache)。
    • 如果数据在缓存中,直接返回给应用程序。
    • 如果数据不在缓存中,从磁盘读取数据,并将其缓存到内存中,再返回给应用程序。
  2. 写入操作

    • 应用程序发出写入请求。
    • 操作系统将数据写入缓存,并标记为“脏页”(Dirty Page)。
    • 定期或在内存压力下,操作系统将脏页写回磁盘,以确保数据持久化。
优点
  • 性能提升:通过缓存机制,减少了实际磁盘IO操作的频率,提高了数据读写的速度。
  • 透明性:应用程序无需关心缓存的实现细节,操作系统自动管理缓存。
缺点
  • 延迟持久化:写入操作并不会立即持久化到磁盘,存在数据丢失的风险。
  • 缓存一致性:在分布式系统中,缓存一致性问题需要特别处理。
内存映射(Mmap)

内存映射(Memory-mapped IO,简称Mmap)是一种将文件或其他对象映射到进程的虚拟内存地址空间的技术,使得应用程序可以像操作内存一样访问文件内容。

工作原理
  1. 映射文件

    • 应用程序调用mmap系统调用,将文件映射到虚拟内存地址空间。
    • 操作系统将文件内容加载到内存中,建立内存和文件之间的映射关系。
  2. 访问数据

    • 应用程序通过指针访问映射区域,读取或写入数据。
    • 操作系统负责在需要时将数据从磁盘加载到内存,或将修改后的数据写回磁盘。
优点
  • 高效访问:由于数据直接映射到内存,读写操作不需要额外的系统调用,减少了上下文切换和内核态开销。
  • 文件共享:多个进程可以映射同一个文件,实现高效的数据共享和通信。
  • 自动同步:操作系统自动将修改后的数据同步到文件,减少了应用程序的复杂度。
缺点
  • 内存占用:大文件映射可能占用大量内存,导致内存压力增大。
  • 复杂性:需要处理页错误和内存管理,增加了编程复杂度。
  • 平台依赖:不同操作系统对Mmap的支持和实现细节可能存在差异。
传统缓存IO和Mmap的区别
实现方式
  • 传统缓存IO

    • 通过操作系统的Page Cache机制进行数据缓存。
    • 应用程序通过标准IO函数(如readwrite)进行数据读写。
  • Mmap

    • 通过mmap系统调用将文件映射到虚拟内存地址空间。
    • 应用程序直接通过指针访问映射区域进行数据操作。
性能
  • 传统缓存IO

    • 适用于频繁的小数据读写操作,通过缓存减少实际磁盘IO,提高性能。
    • 存在系统调用和上下文切换的开销。
  • Mmap

    • 适用于大文件和高频次访问,通过直接内存访问提高性能。
    • 减少了系统调用和上下文切换的开销。
数据一致性
  • 传统缓存IO

    • 数据写入后存在延迟持久化的风险,需考虑数据丢失问题。
    • 在分布式系统中处理缓存一致性问题较复杂。
  • Mmap

    • 操作系统自动同步数据,减少了应用程序的复杂度。
    • 需处理页错误和内存管理,增加了编程复杂度。
使用场景
  • 传统缓存IO

    • 适用于一般的数据读写操作,特别是频繁的小数据读写场景。
    • 适用于需要透明缓存管理的应用场景。
  • Mmap

    • 适用于大文件和高频次访问场景,如数据库、内存数据库和文件操作。
    • 适用于需要高效数据共享和通信的应用场景。
结论

传统缓存IO和Mmap是两种常用的优化数据读写的技术,各有优缺点。传统缓存IO通过操作系统的缓存机制提升性能,适用于频繁的小数据读写操作。Mmap则通过将文件映射到内存,实现高效的数据访问和共享,适用于大文件和高频次访问场景。

在实际应用中,选择哪种方式需要根据具体的业务需求和系统环境进行权衡。了解这两种技术的工作原理和特点,有助于开发者在设计和优化系统时做出更明智的选择,从而提升系统的整体性能和可靠性。

标签:缓存,映射,Mmap,内存,IO,数据
From: https://blog.csdn.net/My_wife_QBL/article/details/140457773

相关文章

  • 【RTT-Studio】详细使用教程四:PWM输出控制
    文章目录一、简介二、RTT时钟配置三、PWM初始化配置四、驱动代码编写五、测试验证一、简介本文将基于STM32F407VET6介绍,如何使用RT-ThreadStudio开发环境下使用输出PWM波形。主要是使用RTT自带的PWM设备进行编写的驱动函数,更加快捷便利。二、RTT时钟配置由于使......
  • 【译】使 Visual Studio 更加可视化
    任何Web、桌面或移动开发人员都经常使用图像。你可以从C#、HTML、XAML、CSS、C++、VB、TypeScript甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中,而其他图像可能仅以base64编码字符串的形式存在。我们在代码中以多种方式引用它们,但总是作为字符串......
  • 论文《AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning》
    在大模型微调的理论中,AdaLoRA方法是一个绕不开的部分。 这篇论文主要提出了一种新的自适应预算分配方法AdaLoRA,用于提高参数高效的微调性能。AdaLoRA方法有效地解决了现有参数高效微调方法在预算分配上的不足,提高了在资源有限情况下的模型性能,为NLP领域的实际应用提供了新的......
  • WordPress 下纯代码实现文章发布、更新后自动清理 CloudFlare 缓存
    最近明月一个参考【WordPress、Typecho站点如何让 CloudFlare 缓存加速】一文开启WordPress站点CloudFlare缓存的客户提出一个疑问,为啥新发布了文章或者修改了文章后网站首页会不能事实的同步更新?这个其实是因为客户在设置CloudFlare缓存时候边缘TTL缓存时间过长以及浏......
  • datagrip启动报错Exception Type:EXC_BAD_ACCESS (SIGABRT)
    本人电脑背景:mac10.15安装datagrip2024版本,根据官方描述,这个版本是不支持的,但是本着试试的态度安装,毕竟也想用新版本。结果遇到了问题。启动打不开,由于错误信息较多,大概整理出来描述如下:ExceptionType:EXC_BAD_ACCESS(SIGABRT)ExceptionCodes:KERN_INVALID_......
  • Educational Codeforces Round 139 (Rated for Div. 2)
    A.ExtremelyRound----------------------------------题解-------------------------------------因为数据范围只有1e6,我们只需要预处理出来1-1e6每个每个数包含多少个极圆整数就行了,然后t次查询就可以。这种预处理查询是面对多次询问时应该首先想到的。点击查看代码#incl......
  • 【笔记】【THM】Introduction to Cryptography(密码学简介)
    【THM】IntroductiontoCryptography(密码学简介)-学习本文相关的TryHackMe实验房间链接:https://tryhackme.com/r/room/cryptographyintro本文相关内容:了解AES、Diffie-Hellman密钥交换、哈希、PKI和TLS等加密算法。(大部分为机翻,若有错误请指出)介绍这个房间的目的是向......
  • 【Azure Function】发布 Python Function 到 Azure 成功,但是无法显示Function列表
    问题描述发布PythonFunction到AzureFunctionApp服务,发布成功后,在Overview页面却无法查看到这个Function,进入Kudu站点,查看FunctionLog,发现错误信息为:"module not found" error:"FailureException:ImportError:libpq.so.5:cannotopensharedobjectfile:Nosuchf......
  • iOS开发基础133-GCD相关
    先看一段代码,这是项目中图片上传的一部分代码。//开启线程组上传图片dispatch_group_tgroup=dispatch_group_create();[self.selectedPhotosenumerateObjectsUsingBlock:^(UIImage*_Nonnullobj,NSUIntegeridx,BOOL*_Nonnullstop){dispatch_gro......
  • python gradio 的输出展示组件
    HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:支持Markdown格式的文本展示。Plot:展示图表,如matplotlib生成的图表。Text:用于显示文本,适合较长的输出。......