作者:pany young
链接:http://www.lofter.com/lpost/1fea4630_12e51440b
来源:LOFTER
最近在开发某个功能的时候考虑到要把数据持久化到硬盘上.在综合考虑各方面的因素后,在技术选择上选择了 -- 《文件内存映射》。所以接下来想用几部分来介绍这个技术。
一.它是一种文件操作的方式,由操作系统支持
有人可能会觉得上一句的后半部分有点废话,但我觉得却是必须的,因为每个操作系统都有不同的文件操作方式,例如Win32 API和MFC提供多种函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。不一定操作系统就支持内存映射,所以前提是所用的操作系统支持这功能。无论是C++还是Java,亦然如此。
然后这个技术优点是当需要操作一些大文件的时候,它的效率比其他的文件操作方式更高,能很高效的处理大文件。
二.它与虚拟内存的区别
二者的联系
虚拟内存和内存映射文件都是将一部分内容加载到,另一部分放在磁盘上的一种机制,二者都是应用程序动态性的基础,由于二者的虚拟性,对于用户都是透明的.
虚拟内存其实就是硬盘的一部分,是计算机RAM与硬盘的数据交换区,因为实际的物理内存可能远小于进程的地址空间,这就需要把内存中暂时不用到的数据放到硬盘上一个特殊的地方,当请求的数据不在内存中时,系统产生却页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。
内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。
二者的区别
1.虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件.
2.二者的架构不同,或者是说应用的场景不同,虚拟内存是架构在物理内存之上,其引入是因为实际的物理内存运行程序所需的空间,即使现在计算机中的物理内存越来越大,程序的尺寸也在增长。将所有运行着的程序全部加载到内存中不经济也非常不现实。内存映射文件架构在程序的地址空间之上,32位机地址空间只有4G,而某些大文件的尺寸可要要远超出这个值,因此,用地址空间中的某段应用文件中的一部分可解决处理大文件的问题,在32中,使用内存映射文件可以处理2的64次(64EB)大小的文件.原因内存映射文件,除了处理大文件,还可用作进程间通信。

三.原理
“映射”就是建立一种对应关系,在这里主要是指硬盘上文件的位置与进程逻辑地址空间中一块相同区域之间一一对应,这种关系纯属是逻辑上的概念,物理上是不存在的,原因是进程的逻辑地址空间本身就是不存在的,在内存映射过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上放入了内存,具体到代码,就是建立并初始化了相关的数据结构,这个过程有系统调用mmap()实现,所以映射的效率很高.

               内存映射原理
上面说到建立内存映射没有进行实际的数据拷贝,那么进行进程又怎么能最终通过内存操作访问到硬盘上的文件呢?
看上图:
1.调用mmap(),相当于要给进行内存映射的文件分配了虚拟内存,它会返回一个指针ptr,这个ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过MMU将逻辑地址转换成物理地址,如图1中过程2所示。
2.建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺 页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬 盘上将文件读取到物理内存中,如图1中过程3所示。
3.如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。
四.它的其他功能:
例如进程之间的通信。

参考:
https://blog.csdn.net/zzq060143/article/details/54619571
https://blog.csdn.net/whoamiyang/article/details/53365385
https://blog.csdn.net/mengxingyuanlove/article/details/50986092

文件内存映射(一):它是什么相关推荐

  1. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...

  2. 学习笔记之ByteBuffer使用和实现以及文件内存映射

    转载自  学习笔记之ByteBuffer使用和实现以及文件内存映射 ByteBuffer和CharBuffer等其它Buffer的直接子类一样,顾名思义,就是存取字节的Buffer.很多数据最终在和底 ...

  3. java流与文件——内存映射文件

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--内存映射文件 的相关知识: 0.2)内存映射文件的目的是: 提高访问速度, 缓冲区Bu ...

  4. mmap映射大于4g的文件_iOS文件内存映射——MMAP

    前言 最近一段项目上总是出现一些因为文件没有及时保存而产生的问题,因此小编就在网上寻找到了这个文件存储方法mmap,这里为大家进行下简单的介绍. 简介 首先我们需要对iOS中各App的运行环境进行了解 ...

  5. 文件内存映射mmap解决大文件快速读写问题和进程间共享内存

    mmap函数主要用途有三个: 1.将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能: 2.将特殊文件进行匿名内存映射,可以为关联进程提供共 ...

  6. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射...

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码. file ...

  7. 快速读取内存文件-内存映射文件的方法

    1.前言     Windows提供了3种进行内存管理的方法: • 虚拟内存,最适合用来管理大型对象或结构数组. • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个 ...

  8. c语言 内存映射文件,内存映射文件

    内存映射文件 03/30/2017 本文内容 内存映射文件包含虚拟内存中文件的内容. 借助文件和内存空间之间的这种映射,应用(包括多个进程)可以直接对内存执行读取和写入操作,从而修改文件. 可以使用托 ...

  9. iOS之深入解析文件内存映射MMAP

    一.常规文件操作 常规文件操作(read/write)有以下重要步骤: 进程发起读文件请求: 内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode: inode ...

  10. linux文件 内存映射 锁,linux – mmap:将映射文件立即加载到内存中吗?

    不,是的,也许吧.这取决于. 调用mmap通常只意味着对应用程序而言,映射文件的内容将映射到其地址空间,就像文件已加载到那里一样.或者,好像该文件确实存在于内存中,就好像它们是同一个(包括更改被写回磁 ...

最新文章

  1. Nature Plants:根系微生物可以远程提高植物应对地上部环境胁迫的能力
  2. PCL 点云 欧式聚类疑问
  3. aio 爬虫,去重,入库
  4. Dubbo注册中心宕机
  5. 一个Excel导出类的实现过程(二):显示定制
  6. C# —— 深入理解委托类型
  7. GDB调试教程:1小时玩转Linux gdb命令
  8. 实验 5 编写、调试具有多个段的
  9. Spring官网改版后下载
  10. 时间序列的归一化方法
  11. TreeMap按照key排序
  12. Two Sum(Leetcode001)
  13. 遍历map集合常用的4种方式
  14. 虚拟化识别共享USB加密狗|银行U盾等解决方案
  15. html5中框架怎么写,html框架布局模板
  16. (完全解决)argparse中dest是什么意思
  17. [附源码]java毕业设计st音乐网站论文
  18. 直板android智能手机,小巧又精悍 3大系统直板全键盘手机搜罗
  19. python进行简单的文本相似度分析
  20. android版本60支持云闪付,云闪付app下载-云闪付 安卓版v8.0.5-PC6安卓网

热门文章

  1. H5前端框架说明文档
  2. 数据包络(DEA)分析法python实现
  3. 数据包络分析-超效率模型
  4. JRE和JDK的区别
  5. python爬图mzitu_小白学 Python 爬虫(16):urllib 实战之爬取妹子图
  6. Gradle 入门教程(一):Gradle是什么
  7. linux下oracle登陆建表,Oracle建表过程初学
  8. 6.1 统计学基本原理
  9. 模型预测控制的缺点_一个模型预测控制(MPC)的简单实现
  10. 健身管理系统一站式智能化健身管理体验