彻底理解mmap()

原创 Holy_666 最后发布于2019-01-17 22:51:27 阅读数 5056 收藏
发布于2019-01-17 22:51:27
分类专栏: 服务器
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Holy_666/article/details/86532671

展开

彻底理解mmap()


最近起的标题总是这么标题党!

什么是 mmap()

mmap, 从函数名就可以看出来这是memory map, 即地址的映射, 是一种内存映射文件的方法, (其他的还有mmap()系统调用,Posix共享内存,以及系统V共享内存,这些我们有机会在后续的文章讨论,今天的男主角是mmap),将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。

注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。


为什么使用 mmap()

Linux通过内存映像机制来提供用户程序对内存直接访问的能力。内存映像的意思是把内核中特定部分的内存空间映射到用户级程序的内存空间去。也就是说,用户空间和内核空间共享一块相同的内存。这样做的直观效果显而易见:内核在这块地址内存储变更的任何数据,用户可以立即发现和使用,根本无须数据拷贝。举个例子理解一下,使用mmap方式获取磁盘上的文件信息,只需要将磁盘上的数据拷贝至那块共享内存中去,用户进程可以直接获取到信息,而相对于传统的write/read IO系统调用, 必须先把数据从磁盘拷贝至到内核缓冲区中(页缓冲),然后再把数据拷贝至用户进程中。两者相比,mmap会少一次拷贝数据,这样带来的性能提升是巨大的。

使用内存访问来取代read()和write()系统调用能够简化一些应用程序的逻辑。
在一些情况下,它能够比使用传统的I/O系统调用执行文件I/O这种做法提供更好的性能。
原因是:

  1. 正常的read()或write()需要两次传输:一次是在文件和内核高速缓冲区之间,另一次是在高速缓冲区和用户空间缓冲区之间。使用mmap()就不需要第二次传输了。对于输入来讲,一旦内核将相应的文件块映射进内存之后,用户进程就能够使用这些数据了;对于输出来讲,用户进程仅仅需要修改内核中的内容,然后可以依靠内核内存管理器来自动更新底层的文件。
  2. 除了节省内核空间和用户空间之间的一次传输之外,mmap()还能够通过减少所需使用的内存来提升性能。当使用read()或write()时,数据将被保存在两个缓冲区中:一个位于用户空间,另个一位于内核空间。当使用mmap()时,内核空间和用户空间会共享同一个缓冲区。此外,如果多个进程正在同一个文件上执行I/O,那么它们通过使用mmap()就能够共享同一个内核缓冲区,从而又能够节省内存的消耗。

如何使用mmap()

 #include <sys/mman.h>


http://www.taodudu.cc/news/show-5077980.html

相关文章:

  • 计算机中的数制教学课程,计算机中的数制和码制教案.doc
  • 微型计算机周明德课后答案,微机原理与接口技术(第2版)
  • Intel software developer manual
  • “个人能力之外的资本为零”
  • 微型计算机第六版第四章答案,微机原理课后习题参考答案.doc
  • 微型计算机系统的框架,微型计算机系统原理及应用
  • 微型计算机周明德课后答案,周明德微机原理答案
  • 微型计算机 周明德,微机原理(周明德)课后题答案
  • 打倒周明德!
  • 7000常用字
  • MNIST with Keras for Beginners
  • Apache Tutorials for Beginners
  • TSGCTF 2021 beginners_pwn wp
  • ROS-Academy-for-Beginners依赖包 Ubuntu20.04
  • WebRTC Tutorial For Beginners
  • Unity3d for beginners
  • CSS Tutorial for Beginners
  • Docker for beginners
  • C++ notes for beginners
  • A* Pathfinding for Beginners
  • bitsctf-2017-beginners-luck
  • R for beginners
  • 组件分享之前端组件——初学者的web开发课程Web-Dev-For-Beginners
  • ROS-Academy-for-Beginners教学包学习
  • 安装ROS-Academy-for-Beginners教学包
  • Beginners Guide To The MQTT Protocol
  • ML Beginners
  • Ubuntu18.04安装ROS Academy for Beginners
  • python for beginners_《Python for Beginners》学习笔记(5)
  • 安装ROS-Academy-for-Beginners教学包时安装依赖的时候老是失败

彻底理解mmap()相关推荐

  1. 深入理解mmap函数

    函数简介 在Linux操作系统中,进程是资源分配的基本单位.所以说每个进程间有各自独立的存储空间,但是在某些情况下各进程要相互配合来完成特定任务,这样就使得进程间通信变得非常必要.进程间通信方式有多种 ...

  2. 这样理解mmap,挺有意思!

    大概雍正皇帝怎么也不会想到,自己在西历2022年的男生和女生眼里,会是截然不同的两种形象. 1 以我对身边同学朋友的观察,男生们大多爱看<雍正王朝>,他们眼中的雍正,大约是个推行了&quo ...

  3. Linux mmap原理

    Linux mmap原理 前言 Linux段页式内存管理 mmap mmap内存映射原理 文字概述 mmap函数参数介绍 源码解析 1. 文件映射 2. 缺页异常 mmap 和常规文件操作的区别 mm ...

  4. Linux编程之mmap示例

    一.问题背景 Linux下,针对文件读写操作,一般有三个步骤: 1)把文件内容读入到内存中:调用read(系统调用),从内核态读取文件内容到虚拟内存: 2)修改内存中的内容:在用户空间修改内存中的信息 ...

  5. Linux——进程间通信(共享内存【mmap实现+系统V】)

    共享内存 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,两个不同的进程A.B共享内存的意思就是:同一块物理内存被映射到进程A.B各自的进程地址空间,进程A可以同时看到进程B对共享内存中 ...

  6. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  7. length函数的头文件_Framebuffer 应用编程中涉及的 API 函数

    本节程序的目的是:打开 LCD 设备节点,获取分辨率等参数,映射 Framebuffer,最后实现描点函数. 5.2.1 open 函数 在 Ubuntu 中执行"man 2 open&qu ...

  8. Kafka的高性能原理

    本文来说下Kafka的高性能设计 文章目录 什么是高性能设计 Kafka高性能设计的全景图 生产消息的性能优化手段 批量发送消息 消息压缩 高效序列化 内存池复用 存储消息的性能优化手段 IO 多路复 ...

  9. 2021年四月中旬推荐文章

    <图解 Linux 文件系统> <Linux 内存管理之CMA>本站<Linux内存管理:CMA(连续内存分配)> <Memory Leak (and Gro ...

最新文章

  1. 五、springcloud之客户端负载均衡Ribbon
  2. JoVE微生物组专刊征稿,写方法拍视频教程发SCI
  3. 完成端口模式下的高性能网络服务器【转】
  4. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
  5. 移动端 H5图片裁剪插件,内置简单手势操作
  6. JS的浅拷贝和深拷贝
  7. Linux安装Nvidia显卡驱动
  8. 脑机直播 x 赛博驱魔!瑞云专访揭秘胶囊计划国风科幻神作《终极体验》制作幕后...
  9. 计算机考研复习资料推荐(转载)
  10. HTML基础知识概要面试必备
  11. Rstudio与R的绑定和更新
  12. Wex5 popOver组件的使用
  13. 大牛给计算机方向学生的 7 个建议
  14. 如何做好一名前端Leader
  15. 程序员上班打酱油的方法
  16. 分享10个ico图标搜索下载网站
  17. 远程控制手机时,解决隐私屏黑屏的问题
  18. 中国煤炭行业全面推进大数据的发展运用
  19. 京东TCL“合伙开店”,看无界零售如何赋能家电制造业
  20. NOIP2003年普及组 T1 乒乓球

热门文章

  1. jmeter并发测试教程_jmeter怎么进行并发测试
  2. 用计算机探索规律的思维导图,手绘思维导图与计算机的完美结合
  3. udig设置样式在Geoserver使用出现汉字乱码问题
  4. 企业网站建设常识及常见错误
  5. C语言编写修改版本号程序
  6. 什么是游戏开发的实体系统框架 What is an entity system framework for game development
  7. 波音、优步、软银、日产汽车、泰康保险、美团、伯克希尔、日本邮政等公司高管变动情况...
  8. 2022年电工(初级)考题及答案
  9. 知衣科技应用 TensorFlow 建立服装搜索系统
  10. 虾皮本土店怎么回款?成都星志远