mongodb内存映射原理
内存映射
mongodb非常吃内存,为啥这么吃内存呢,mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,把磁盘IO操作转换成内存操作。 mapped:映射到内存的数据大小, vsize:虚拟内存,是mapped的2倍 这里虚拟内存是mapped的两倍,是因为我们开启了Journal日志,需要在内存中多映射一次,大概就是它的两倍了。如果关闭Journal日志,虚拟内存大小将和mapped大小相当。
原理
内存映射,是把文件中数据全部映射到内存中的吗?还是只是映射一部分内容,那么这部门内容又是如何确定呢?看这张图
映射了就不需要读磁盘吗,没有磁盘IO吗? 没有内存映射会怎么样 进程调用read,write的系统调用函数,内核进程把磁盘的数据读到内核空间,然后在copy到用户进程空间。没错,就是两次复制。
而有了内存映射之后,用户进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。说白了,mmap的关键点是实现了用户空间和内核空间的数据直接交互而省去了空间不同数据不通的繁琐过程。因此mmap效率更高。
两步走
内存映射
在内存映射的过程中,并没有实际的数据拷贝,文件没有被载入内存,只是逻辑上被放入了内存,这个过程由系统调用mmap()实现,所以建立内存映射的效率很高。
缺页中断
既然建立内存映射没有进行实际的数据拷贝,那么进程又怎么能最终直接通过内存操作访问到硬盘上的文件呢?那就要看内存映射之后的几个相关的过程了。
mmap()会返回一个指针ptr,它指向进程逻辑地址空间中的一个地址,这样以后,进程无需再调用read或write对文件进行读写,而只需要通过ptr就能够操作文件。但是ptr所指向的是一个逻辑地址,要操作其中的数据,必须通过内存管理单元MMU将逻辑地址转换成物理地址,如图1中过程2所示。这个过程与内存映射无关。
前面讲过,建立内存映射并没有实际拷贝数据,这时,MMU在地址映射表中是无法找到与ptr相对应的物理地址的,也就是MMU失败,将产生一个缺页中断,缺页中断的中断响应函数会在swap中寻找相对应的页面,如果找不到(也就是该文件从来没有被读入内存的情况),则会通过mmap()建立的映射关系,从硬盘上将文件读取到物理内存中,如图1中过程3所示。这个过程与内存映射无关。
如果在拷贝数据时,发现物理内存不够用,则会通过虚拟内存机制(swap)将暂时不用的物理页面交换到硬盘上,如图1中过程4所示。这个过程也与内存映射无关。
所以当mongodb读取数据库文件的时候,首先做内存映射,读取文件变成了读取内存操作,所以mongodb的查询效率相当高,当然,如果你的内存不够大,经常发生缺页中断,那么效率会大打折扣了
Mongodb学习整理之内存映射机制
认真分析mmap:是什么 为什么 怎么用
从内核文件系统看文件读写过程
---------------------
作者:嗨嗨人生
来源:CSDN
原文:https://blog.csdn.net/maso88/article/details/94736577
版权声明:本文为博主原创文章,转载请附上博文链接!
mongodb内存映射原理相关推荐
- 【Linux内核】内存映射原理
[Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...
- mmap内存映射原理
mmap概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系. 特点:实现这样的映射关系后,进程就可以 ...
- 一文搞懂内存映射原理及使用方法
a. 内存映射原理 内存映射即在进程的虚拟地址空间中创建一个映射,分为两种: 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件. 匿名映射:没有文件支持 ...
- MongoDB内存映射文件
2019独角兽企业重金招聘Python工程师标准>>> Mongodb源码分析--内存文件映射(MMAP) 内存映射文件原理探索 Linux 内存映射函数 mmap()函数详解 Li ...
- linux内存映射原理,Linux内存管理实践-使用fault()实现内存映射
内核态与用户态进行数据交互通常是这样一种模型:内核利用自身的特权通过特定的服务程序采集.接收和处理数据:接着,用户态程序和内核服务程序进行数据交互,或接收内核态的数据,或向内核态写入数据.通过传统的那 ...
- Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)
Linux mmap分析 内核版本:linux-5.16 1. 虚拟内存概要及相关内容简介 内存映射是学习过操作系统的大家都耳熟能详的词,理解起来也很简单.所谓"映射"就是为一种事 ...
- igs无法分配驱动器映射表_Linux的mmap内存映射原理到底是怎样的?
在Unix/Linux系统下读写文件,一般有两种方式. 一种是open一个文件,然后使用read系统调用读取文件的一部分或全部.这个read过程是这样的:内核将文件中的数据从磁盘区域读取到内核页高速缓 ...
- 【Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )
文章目录 一.物理地址空间 二.外围设备寄存器 三.外围设备寄存器物理地址 映射到 虚拟地址空间 一.物理地址空间 " 物理地址空间 " 是 CPU 处理器 在 " 总线 ...
- Linux内存映射mmap原理分析
来自:Joe James 链接:https://blog.csdn.net/joejames/article/details/37958017 一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有 ...
最新文章
- python中if elif else流程图_python中的if、elif、else语法
- Apache Thrift - java开发详解
- Linux 6.8 root密码丢失找回
- Oracle数据库的impdp导入操作以及dba_directories使用方法
- 【Kubernetes】离线业务:Job与CronJob
- 2014年去哪儿网笔试题--一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色......
- c++ DLL-DEF-LIB
- python没有报错但是没结果_python爬取豆瓣top250的电影的信息,没有报错哦,但是没有结果...
- 洋葱头动态鼠标指针绿色版
- 车联网仿真测试解决方案
- IDEA 2018 破解
- element中table表格和已选数据联动
- linux怎么关闭超线程模式,Linux动态启用/禁用超线程技术的方法详解
- Android Studio 实现视频播放暂停功能
- 现代OpenGL入门教程
- xposed的总开关
- 实现JPanel切换
- 交换机的基础配置学习笔记
- 附件统一处理starter,含附件客户端和附件服务端
- Mac-Mac上如何制作GIF动图
热门文章
- php与tcp哪个快,PHP程序员如何理解TCP协议
- 监控摄像头卡顿_视频监控系统施工六大注意事项
- 20位数字转化成6位不重复码_人力资源管理浅析身份证数字号码编排常识甄别年龄、性别、籍贯…...
- MyEclipse9安装Checkstyle5.5插件(图解)
- 05_学生管理系统,xml读写,布局的综合应用
- SQLite Update 语句(http://www.w3cschool.cc/sqlite/sqlite-update.html)
- CXF客户端配置请求超时限制
- Kettle使用_30 作业里使用参数
- 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits中的“logits”到底是个什么意思?
- Faster R-CNN改进篇(一): ION ● HyperNet ● MS CNN