前言

  • 内存映射Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作
  • 今天,我将详细讲解操作系统中核心概念:内存映射

目录


1. 定义

关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系

  1. 上述的映射过程 = 初始化该虚拟内存区域
  2. 虚拟内存区域被初始化后,就会在交换空间中换你来还去
  3. 被映射的对象称为:共享对象(普通文件 / 匿名文件)

2. 作用

若存在上述映射关系,则具备以下特征

  • 在多个进程的虚拟内存区域 已和同1个共享对象 建立映射关系的前提下
  • 若 其中1个进程对该虚拟区域进行写操作
  • 那么,对于 也把该共享对象映射到其自身虚拟内存区域的进程 也是可见的

示意图如下

  1. 假设进程1、2的虚拟内存区域同时映射到同1个共享对象;
  2. 当进程1对其虚拟内存区域进行写操作时,也会映射到进程2中的虚拟内存区域


3. 实现过程

  • 内存映射的实现过程主要是通过Linux系统下的系统调用函数:mmap()
  • 该函数的作用 = 创建虚拟内存区域 + 与共享对象建立映射关系
  • 其函数原型、具体使用 & 内部流程 如下
/*** 函数原型*/
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);/*** 具体使用(用户进程调用mmap())* 下述代码即常见了一片大小 = MAP_SIZE的接收缓存区 & 关联到共享对象中(即建立映射)*/mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);/*** 内部原理* 步骤1:创建虚拟内存区域* 步骤2:实现地址映射关系,即:进程的虚拟地址空间 ->> 共享对象* 注: *    a. 此时,该虚拟地址并没有任何数据关联到文件中,仅仅只是建立映射关系*    b. 当其中1个进程对虚拟内存写入数据时,则真正实现了数据的可见*/

4. 特点

  • 提高数据的读、写 & 传输的时间性能

    1. 减少了数据拷贝次数
    2. 用户空间 & 内核空间的高效交互(通过映射的区域 直接交互)
    3. 用内存读写 代替 I/O读写
  • 提高内存利用率:通过虚拟内存 & 共享对象

5. 应用场景

Linux系统下,根据内存映射的本质原理 & 特点,其应用场景在于:

  1. 实现内存共享:如 跨进程通信
  2. 提高数据读 / 写效率 :如 文件读 / 写操作

6. 实例讲解

下面,我将详细讲解 内存映射应用在跨进程通信 & 文件操作的实例

6.1 文件读 / 写操作

  • 传统的Linux系统文件操作流程如下

  • 使用了内存映射的 文件读 / 写 操作

从上面可看出:使用了内存映射的文件读/写 操作方式效率更加高、性能最好!

6.2 跨进程通信

  • 传统的跨进程通信

  • 使用了内存映射的 跨进程通信

从上面可看出:使用了内存映射的跨进程通信 效率最高、性能最好!


7. 总结

  • 本文全面讲解了 Linux操作系统中的内存映射

  • 下面我将继续讲解 编程开发的基础知识,感兴趣的同学可以继续关注carson_ho的微信公众号


请点赞 / 评论点赞!因为你的鼓励是我写作的最大动力!

操作系统:图文详解神秘的”内存映射“相关推荐

  1. Dell计算机装Win8,戴尔笔记本用U盘重装原版win8操作系统图文详解

    戴尔笔记本用U盘重装原版win8操作系统图文详解.戴尔商务台式.商务笔记本为超大型及中小企业提供专业产品及技术支持笔记本电脑是方便的便携式计算机,广受经常出差.喜欢在咖啡店学习的人群的欢迎,而重视节约 ...

  2. Win7 + VirtualBox安装Mac OS X雪豹操作系统图文详解

    由于工作需要,我需要同时使用Windows和Mac OS X操作系统,虽然公司可以配置两台机器,但是出于发热量,空间占用,操作系统互通等原因,我还是更倾向于在虚拟机环境里工作.由于在大部分工作还是在W ...

  3. ubuntu 10.10 + VirtualBox 4 安装Mac OS X 10.6 雪豹操作系统图文详解

    参考http://blog.zhaojie.me/2010/09/how-to-install-mac-os-x-snow-leopard-on-virtualbox.html 只不过系统换成了 ub ...

  4. 图文详解神秘的梯度下降算法原理(附Python代码)

    目录 1 引例 2 数值解法 3 梯度下降算法 4 代码实战:Logistic回归 1 引例 给定如图所示的某个函数,如何通过计算机算法编程求f(x)minf(x)_{min}f(x)min​? 2 ...

  5. 操作系统:图文详解 内存映射

    操作系统:图文详解 内存映射 前言 内存映射 在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 今天,我将详细讲解操作系统中核心概念:内存映射 目录 示意图 1. ...

  6. xp系统本地服务器环境配置,Windows XP安装Apache环境图文详解Windows服务器操作系统 -电脑资料...

    本文章来简单的介绍Windows XP安装Apache环境图文方法,有需要了解的朋友可参考参考, 双击 apache_2.2.8-win32-x86-no_ssl.msi 文件,开始安装 Apache ...

  7. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  8. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了

    大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. ...

  9. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

最新文章

  1. SPOJ220 Relevant Phrases of Annihilation(后缀数组)
  2. iOS开发网络篇—NSURLConnection基本使用(一)
  3. 返回用户指定页面的web服务器
  4. 动物麻醉剂量和途径相关要点
  5. 单例模式的5种实现方法及优缺点
  6. .NET Core开发实战(第30课:领域事件:提升业务内聚,实现模块解耦)--学习笔记...
  7. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】
  8. Java 反射调用方法实例,动态动用方法实例
  9. mysql df_DF学Mysql(一)——数据库基本操作
  10. 使用C# impersonation进行windows帐号的校验
  11. T-SQL的进阶:超越基本级别3:构建相关子查询——701小组
  12. Golang开发环境配置
  13. centos7中安装matlab,centOS7安装matlab2014a
  14. android 编辑 word文档,word编辑文档工具
  15. 用 pyecharts 制作数据可视化大屏之数据地图
  16. 体绘制加速技术之数据异步传输
  17. C/C++实现刮刮乐-刮奖区,刮出一套房
  18. (P44)面向对象版表达式计算器:符号表SymbolTable的实现
  19. 完美解码播放器(PotPlayer)关闭自动播放下一首的方法(找了好久)
  20. 深入理解Java虚拟机——Parallel Old收集器

热门文章

  1. 基于Mozilla平台的扩展开发(续)----XPCOM组件篇
  2. 舞动18周年 搭建企业互联网转型的蹁跹舞台
  3. [LeetCode]Buy and Sell Stocks 买卖股票问题
  4. Office VBA开发经典-基础入门卷 配套资源下载
  5. IDEO用户体验创新模式01
  6. 目标检测算法汇集介绍
  7. egret--龙骨动画的导入和使用
  8. CMOS与CCD的区别是什么?
  9. 基于属性的访问控制(ABAC)定义与思考 ——企业ABAC的实施问题
  10. 东方花映塚体验版plus昨日例大祭发布!