内存映射文件mmap原理分析
本文来说下内存映射文件 mmap 原理
文章目录
- mmap原理分析
mmap原理分析
假设我们要把一个磁盘文件映射到内存里来,然后把映射到内存中的数据通过socket发送出去。
零拷贝有两种实现方式,一种是mmap技术,另一种使用sendfile技术。
mmap技术,也就是内存映射,可以直接将磁盘文件映射到内核缓冲区。首先还是会发生一次内核态到用户态的切换,这个过程是基于DMA引擎拷贝的,磁盘文件拷贝到内核缓冲区。
接下来,从内核态切换回用户态,此时不会把内核缓冲区的数据拷贝到用户空间。用户缓冲区会跟内核缓冲区建立一个映射,共享一块内存数据,这就不需要从内核缓冲区拷贝到用户缓冲区了。
然后,要把数据通过socket发送出去,需要从用户态切换到内核态,在内核态直接把内核缓冲区的数据拷贝到socket缓冲区里去,然后基于DMA技术把socket缓冲区的数据拷贝到网卡,发送出去。
完成以上步骤之后,就会从内核态切换回用户态。
总结来说,需要4次用户态和内核态之间的切换,3次数据的拷贝,比普通的io操纵少了一次数据拷贝,但切换次数并不减少。
大名鼎鼎的rocketmq就使用了mmap技术,有兴趣的伙伴,可以去看看它的源码实现。
为了方便理解,笔者画了一张图,如下:
内存映射文件mmap原理分析相关推荐
- Binder跨进程通信原理(二):内存映射mmap原理分析
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了...下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内 ...
- Linux内存映射mmap原理分析
来自:Joe James 链接:https://blog.csdn.net/joejames/article/details/37958017 一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有 ...
- [转载]linux内存映射mmap原理分析
转自:http://blog.csdn.net/yusiguyuan/article/details/23388771 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对 ...
- mmap函数_Linux内存映射mmap原理分析
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了...下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内 ...
- Java基础:JavaNIO 之 内存映射文件原理
1. 前言 最近研究Java中内存映射I/O.Java类库中的NIO中的内存映射文件MappedByteBuffer,相对于Java I/O是一个新的功能.特把适合用于处理大文件,在对大文件处理的时候 ...
- MongoDB内存映射文件
2019独角兽企业重金招聘Python工程师标准>>> Mongodb源码分析--内存文件映射(MMAP) 内存映射文件原理探索 Linux 内存映射函数 mmap()函数详解 Li ...
- 重新认识 Java 中的内存映射(mmap)
mmap 基础概念 mmap 是一种内存映射文件的方法,即将一个文件映射到进程的地址空间,实现文件磁盘地址和一段进程虚拟地址的映射.实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而 ...
- 数据共享,内存映射文件和虚拟内存,共享内存
一.内存映射 内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器.内存映射文件的物理存储器来自磁盘已有的文件,而不是来自系统的页交换文件.一旦把文件映射到地址空间,就可以对它进行访问, ...
- java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...
进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...
最新文章
- saiku执行过程代码跟踪
- Android 程序启动界面Demo
- go方法的深入探究(7.21增补)
- React对标签属性进行限制(props)
- jdeps_JDeps入门–分析项目的依赖关系
- git commit提交代码时提示LF与CRLF转换问题 error
- 通过企业账号邀请开发者(不需要支付99刀,在真机上调试)
- EXCEL中制作省市区行政区地图
- 用Android自带的signapk.jar + .x509.pem + .pk8签名应用程序 - anfflee
- pmp中项目经理如何进行目标设定
- css 设置冻结表格头,固定/冻结行表头、列表头的做法
- java 替换 ppt内容_Java 替换PPT中的指定文本内容 详细始末
- 记一次搭建 nodebb 论坛
- AD9361参数设置总结
- Redis学习之publish命令
- android备份recovery,Recovery(Android手机备份功能)
- 服务器连接数据库mysql
- PostGIS 入门
- 多测师拱墅校区肖sir_高级金牌讲师_html讲解
- 我的一些杭电计算机考研资料