Java内存映射原理与实现

  • 01. 虚拟内存与内存映射文件
    • 1.1. 概念
    • 1.2 区别
  • 02. 内存映射文件的原理
  • 03. 内存映射文件的效率

01. 虚拟内存与内存映射文件

1.1. 概念

  • 虚拟内存
    虚拟内存属于硬盘的一部分,是计算机RAM与硬盘的数据交换分区

    由于实际的物理内存远小于进程的地址空间,这就需要把内存中暂时不用到的数据放到硬盘上一个特殊的地方,当请求的数据不在内存中时,系统产生却页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。

  • 内存映射文件
    内存映射文件是由一个文件到一块内存的映射。

    应用程序可以通过内存指针对磁盘上的文件进行访问,就如同访问加载了文件的内存,因此内存文件映射非常适合于用来管理大文件。

1.2 区别

  • 磁盘文件
    虚拟内存使用的硬盘只能是页面文件
    内存映射使用的磁盘可以是任何磁盘文件。
  • 架构
  1. 虚拟内存是架构在物理内存之上。

    引入原因:实际的物理内存运行程序所需的空间。即使现在计算机中的物理内存越来越大,程序的尺寸也在增长,将所有运行着的程序全部加载到内存中不经济也非常不现实。

  2. 内存映射文件架构在程序的地址空间之上

    32位机地址空间只有4G,而某些大文件的尺寸可要要远超出这个值,因此,用地址空间中的某段应用文件中的一部分可解决处理大文件的问题,在32中,使用内存映射文件可以处理2的64次(64EB)大小的文件.原因内存映射文件,除了处理大文件,还可用作进程间通信。

02. 内存映射文件的原理

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

上面说到建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终通过内存操作访问到硬盘上的文件呢?

  1. 调用mmap(),相当于要给内存映射文件分配了虚拟内存,它会返回一个指针ptr,这个ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过MMU(Memory Management Unit,即内存管理单元)将逻辑地址转换成物理地址,如图1中过程2所示。
  2. 建立内存映射并没有实际拷贝数据,这时MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap(也就是交换分区)中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。
  3. 如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。

03. 内存映射文件的效率

了解过内存映射文件都知道,它比传统的IO读写数据快很多,那么,它为什么会这么快,从代码层面上来看,从硬盘上将文件读入内存,都是要经过数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一 样的。其实,原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图2中过程1,然后再将这些数据拷贝到用户空间,如图2中过程2,在这个过程中,实际上完成 了两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。

Java内存映射原理与实现相关推荐

  1. mmap内存映射原理

    mmap概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系.  特点:实现这样的映射关系后,进程就可以 ...

  2. 深入Java核心 Java内存分配原理精讲

    深入Java核心 Java内存分配原理精讲 Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详 ...

  3. 【Linux内核】内存映射原理

    [Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...

  4. 一文搞懂内存映射原理及使用方法

    a. 内存映射原理 内存映射即在进程的虚拟地址空间中创建一个映射,分为两种: 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件. 匿名映射:没有文件支持 ...

  5. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  6. mongodb内存映射原理

    内存映射 mongodb非常吃内存,为啥这么吃内存呢,mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或 ...

  7. java内存映射缓存,java – 用于数据库实现的内存映射的MappedByteBuffer或直接ByteBuffer?...

    这看起来像一个长期的问题,因为所有的上下文.下面的小说里有两个问题.感谢您抽出时间阅读并提供帮助. 情况 我正在开展可扩展的数据存储实现,可以支持在32位或64位系统上处理数据文件,从几KB到TB或更 ...

  8. java内存映射读取管道文件

    1.java中的常见的文件读写 使用byte,按照字节读取   使用character,按照字符读取 使用reader,按照行读取 使用buffer,缓存读取 使用channel,通道读取 使用内存映 ...

  9. linux内存映射原理,Linux内存管理实践-使用fault()实现内存映射

    内核态与用户态进行数据交互通常是这样一种模型:内核利用自身的特权通过特定的服务程序采集.接收和处理数据:接着,用户态程序和内核服务程序进行数据交互,或接收内核态的数据,或向内核态写入数据.通过传统的那 ...

  10. Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)

    Linux mmap分析 内核版本:linux-5.16 1. 虚拟内存概要及相关内容简介 内存映射是学习过操作系统的大家都耳熟能详的词,理解起来也很简单.所谓"映射"就是为一种事 ...

最新文章

  1. 搭建服务器环境 安装jdk、mysql、Tomcat 以及配置https 记录
  2. 如何在 Linux 上用 Markdown 编写电影剧本
  3. 禁用software reporter tool.exe 解决CPU高占用率的问题
  4. 不用图片的DIV圆角(兼容各浏览器)
  5. HDOJ - 4474 简单分析后,BFS
  6. android 过滤cmcc,Android 无法通过cmcc wap2.0 test解决
  7. [转载]ZIGBEE:Coordinator中的邻居表(Neighbour Table)问题
  8. html 怎么设置cooki,怎么设置浏览器接受cookie
  9. shell脚本启动kafka集群的多台节点
  10. 易语言mysql验证_易语言MySql注册登录
  11. 玩数据必备Python库:Numpy使用详解
  12. 浅论企业文化对企业发展的影响
  13. PoA共识引擎算法实现分析(2)
  14. Python全栈开发——subprocess struct
  15. DIV+CSS常见问题的14条原因分享
  16. Linux SHELL 命令入门题目(一)
  17. 毕设题目:Matlab元胞自动机病毒仿真
  18. 弹性系数和线径的计算公式_弹簧计算公式
  19. NetApp存储术语介绍
  20. 判断两个单词是否互为变位词,如“book”,“koob”,代码如下

热门文章

  1. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  2. SAS基础-日期时间本质
  3. JS遍历map集合以及map对象
  4. python爬取网易云音乐_手把手教你用Python网络爬虫获取网易云音乐歌曲
  5. iphone一键转移_换iPhone数据转移太麻烦?用腾讯电脑管家iPhone助手一键搞定
  6. C++链式队列实现简易银行叫号系统
  7. 搭建Hadoop环境(超详细)
  8. matlab对一个数组进行补零,matlab 输出 整数 补0
  9. #【软件stm32cubeIDE下配置STM32F407uart1调试SBUS模块-学习笔记-基础样例-遥控小车与四轴模板】
  10. ros学习-中国大学MOOC---《机器人操作系统入门》课程讲义