美文网首页行业俱乐部基础Android
操作系统:图文详解 内存映射

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

作者: Carson带你学安卓 | 来源:发表于2018-03-01 17:44 被阅读2914次

前言

  • 内存映射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的开发笔记


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

相关文章阅读
Android开发:最全面、最易懂的Android屏幕适配解决方案
Android事件分发机制详解:史上最全面、最易懂
Android开发:史上最全的Android消息推送解决方案
Android开发:最全面、最易懂的Webview详解

Android开发:JSON简介及最全面解析方法!
Android四大组件:Service服务史上最全面解析
Android四大组件:BroadcastReceiver史上最全面解析


欢迎关注Carson_Ho的简书!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

相关文章

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

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

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

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

  • 内存映射MMAP

    什么是内存映射 所谓内存映射,就是将文件的磁盘扇区映射到进程的虚拟内存空间的过程。 操作系统中的进程 进程就是一个...

  • 操作系统——内存映射

    定义 虚拟内存的目标存储器是磁盘,所以虚拟内存区域是和磁盘中的文件对应的。初始化虚拟内存的内容时,会把虚拟内存区域...

  • I/O映射之I/O端口

    对于外设,操作系统会采用端口映射和内存映射两种方式来对其进行控制,其中端口映射就是操作系统规定好一段地址给指定换上...

  • kernel 内存 I/O

    内存 I/O# 内存管理单元## MMU辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和...

  • 图文详解: 操作系统之内存管理 ( 内存模型,虚拟内存,MMU,

    关键词: 内存模型,虚拟内存,MMU, TLB,页面置换算法,分段. 计算机模型 分层存储体系 内存抽象 为了更好...

  • iOS内存映射mmap详解

    进程和线程? 因为后面的知识涉及到进程,所以我们先来简单了解一下进程和线程。下面的内容摘自iOS-线程&&进程的深...

  • 监控内存(一):Linux 内存怎么工作

    内存映射 同 CPU 管理一样,内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、...

  • 25用户态内存映射

    mmap 将虚拟地址空间映射到物理内存 匿名映射,即虚拟内存和物理内存直接映射文件映射,将文件映射到虚拟内存ima...

网友评论

  • 30035123f1bc:之前了解的是 进程是保护的 不能和内核空间之外的东西进行通信 但按您文章所言 两个进程是通过一个中间区域(非内核空间进行通信) 这似乎有些矛盾
    创建一块共享的内存缓存区 为什么 进程可以和他通信呢
    30035123f1bc:又或者说 为什么这个内存区域可以是共享的呢 两个进程是怎么来实现内存共享呢
  • 小鹿啊小鹿:想问一下你的画图工具是哪个,求推荐
  • 浪浪的程序猿:看了您几篇博客,佩服,学习了
  • chandarlee:mmap映射后文件读写这块,个人感觉是不是有点问题!你说一次拷贝发生在内核空间复制到用户空间!个人理解,这一次拷贝应该是指的从磁盘调度到主内存发生的,因为直接映射到用户空间的,用户直接访问的是用户空间虚拟地址,应该不会发生内核空间到用户空间的拷贝!
    lcandoallthings:我也这么觉得,统一通过共享的内存块来对真实数据进行操作,而不是用户进程。

本文标题:操作系统:图文详解 内存映射

本文链接:https://www.haomeiwen.com/subject/ipcbxftx.html