精华内容
下载资源
问答
  • 内存映射 在 Linux操作系统中非常重要,因为其涉及到高效的跨进程通信 & 文件操作 今天,我将详细讲解操作系统中核心概念:内存映射 目录 1. 定义 关联 进程中的1个虚拟内存区域 & 1个磁盘上的...

    前言

    • 内存映射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的微信公众号
      示意图
      示意图


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

    展开全文
  • Linux操作系统中的内存映射

    千次阅读 2018-05-11 17:29:44
    内存映射 在 Linux操作系统中与高效的跨进程通信 & 文件操作息息相关。 定义 关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系 被映射的对象称为:共享对象(普通文件 /...

    内存映射 在 Linux操作系统中与高效的跨进程通信 & 文件操作息息相关。

    定义

    关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系
    被映射的对象称为:共享对象(普通文件 / 匿名文件)

    作用

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

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

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

    如下所示:

    这里写图片描述

    实现过程

    内存映射的实现过程主要是通过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个进程对虚拟内存写入数据时,则真正实现了数据的可见
      */
    
    作者:Carson_Ho
    链接:https://www.jianshu.com/p/719fc4758813
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    特点

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

    应用场景

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

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

    实例讲解

    文件读 / 写操作

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

    这里写图片描述

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

    这里写图片描述

    跨进程通信

    传统的跨进程通信

    这里写图片描述

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

    这里写图片描述

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

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

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

     


    前言

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

    展开全文
  • 操作系统内存映射机制

    千次阅读 2012-12-02 12:43:59
    这个问题思考的是程序与内存映射问题? (请高手指教) 程序在编译以后,被分配到了一个4G的逻辑地址空间当中, 在这当中是以分区段的方式进行管理的(如有代码段,数据段,堆栈段等) 。 那么,如何将...

                这个问题思考的是程序与内存的映射问题? (请高手指教


    程序在编译以后,被分配到了一个4G的逻辑地址空间当中, 在这当中是以分区段的方式进行管理的(如有代码段,数据段,堆栈段等) 。


    那么,如何将这4G的地址映射到真实的内存空间中? 


    cpu当中,有内存控制单元(硬件),这通过两次地址映射(第一次是分段单元,第二次是分页单元)将程序中的逻辑地址映射到真实的内容地址中。


    那么,映射已经完成,如何找到自己所需的程序元器件运行程序呢?


    这时,用到了全局描述符表和局部描述符表, 这两个表中存有各种段描述符(如代码段描述符,数据段描述符,任务状态段描述符等)。cpu通过这两个描述符表


    能够找到所执行代码所在的内存位置和所需要的数据位置,从而进行运算和执行指令等操作。


    80286只有段式内存管理机制,80386完善了段式内存管理且实现了页式内存管理。但是段式内存管理灵活性和效率都差。较好的方法是页式内存管理。本来页式内存管理不需

    要建立在段式内存管理基础上。这是两种不同机制。但80386中,保护模式的实现是与段式存储密不可分的。所以,在利用已有资源,就不能绕过段式存储管理。因此,页式内

    存管理建立在段式内存管理基础之上。这样,页式内存管理的作用是在段式内存管理所映射而成的地址上在加上一层地址映射。80286段式映射而成的地址就是“物理地址”,

    80386段式映射以后的地址不再是“物理地址”,而是称为”线性地址“,线性地址再由页式内存管理映射成物理地址;或者不使用页式内存管理,就将线性地址世界用作物理地址


    80386把线性地址空间划分成4k字节的页面,每个页面可以被映射到物理存储空间中任意一块4k字节大小的区间(边界必须是与4k字节对齐)。。段式内存管理中,连续的逻

    辑地址映射后在线性地址空间还是连续的。但是,在页式内存管理中,连续的线性地址空间经过映射后在物理地址空间却不一定连续(其灵活性也正在于此)。一旦启用了页式

    内存管理,所有的线性地址都要经过页式内存管理映射,连GDTR和LDTR中给出的段描述表起始地址也不例外。

              cr3存放正在使用的页目录的物理地址,cr2存放缺页的线性地址,cr0最高位PG是页式映射机制的总开关,当被设置为1时,cpu开启页式内存管理的映射机制。





    展开全文
  • mmap库:Python内存映射文件操作

    千次阅读 2021-05-05 18:54:27
    内存映射通常可以提高I/O的性能,因为使用内存映射时,不需要对每个访问都建立一个单独的系统调用,也不需要在缓冲区之间复制数据,内核和用户都能很方便的直接访问内存。 本篇,将详细介绍Python内存映射库:mmap。...
  • 实现这样的映射关系后,进程就可以采用指针的方式来读写操作这一段内存,进而完成对文件的操作,而不必再调用 read/write 等系统调用函数了。 函数原型: void *mmap(void *adrr, size_t length, int prot, int
  • mmap内存映射操作

    千次阅读 2011-08-10 16:33:07
    1.对于mmap的内存映射,是将物理内存映射到进程的虚拟地址空间中去,那么进程对文件的访问就相当于直接对内存的访问,从而加快了读写操作的效率。在这里,remap_pfn_range函数是一次性的建立页表,而nopage函数是...
  • 操作系统内存地址映射

    千次阅读 2018-05-09 13:06:06
    内存管理的机制 这里主要是做个知识点的记录,方便以后查看 内存是现代计算机的运行的中心,内存是由很大的一组字或者是字节组成的,每个字或者...接着这个指令被解码,以及可能需要从内存中读取操作数,在指令...
  • 哈工大的操作系统实验四,今年老师要求制作PPT,于是良心制作,详细记录了系统调用的相关操作及实验结论,希望对有心人有用,大家共同进步
  • mmap内存映射

    千次阅读 2017-04-15 10:51:15
    我们都知道操作系统分为用户态和内核态,用户态是不能直接和物理设备打交道的,如果想把硬盘的一块区域读到用户态,则需要两次拷贝(硬盘->内核->用户),但是内存映射的设计只需要发生一次的拷贝,大大的提高了读取...
  • 编程实现段、页式内存管理上的内存共享,从而深入理解操作系统内存管理。 实验内容 本次实验的基本内容是先用Bochs调试工具跟踪Linux 0.11的地址翻译(地址映射)过程,然后在此基础上编程实现一个基于内存...
  • 内存映射文件的应用

    千次阅读 2019-06-08 11:31:35
    内存映射文件的应用一,操作系统加载EXE和DLL二,读写大文件三,进程间通信      内存映射文件是windows开发下常用的一种技术,既可以用来读写磁盘上的大文件,也可以用来实现进程间的...
  • 内存映射技术(共享内存)

    千次阅读 2019-11-02 17:42:42
    内存映射 : 内存映射文件不同于文件I/O操作,内存映射实际用到了Windows的...在用CreateFile()将文件映像在物理存储器的位置通告给操作系统后,只指定了映像文件的路径,映像的长度还没有指定。 为了指定文件映射对...
  • linux 内存映射 PCI内存映射 DMA映射

    千次阅读 2012-04-13 13:50:38
    内存映射, 就是指把外设的内存映射到用户空间访问。系统调用为:  #include  void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);  其中fd 可以为打开的普通文件或设备...
  • 本文完整阐述了内存映射的机理。对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。  进程的4GB...
  • MemMap内存映射

    千次阅读 2017-06-02 15:08:08
    内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对...
  • 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。内存映射通常可以提供I/O性能,因为使用内存映射是,不需要对每个访问都建立一个单独的系统调用,也不...
  • 使用windows内存-内存映射文件

    千次阅读 2016-01-03 19:19:56
    内存映射文件 和虚拟内存一样,内存映射文件可以用来保留一个进程地址区域;但是,与虚拟内存不同,它提交的...操作系统就是用它来加载exe和dll文件建立进程,运行exe。这样可以节省页文件和启动时间。 访问
  • 内存映射文件

    千次阅读 2013-08-11 16:48:36
    内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对...
  • 内存映射文件详解(Windows)

    千次阅读 2017-07-07 13:47:13
    内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对...
  • 内存映射

    千次阅读 2011-09-09 19:58:19
    内存映射分为文件映射和匿名映射。 文件映射是指代表这个映射的vma对应到一个文件中的某个区域。这种映射方式相对较少被用户态程序显式地使用,用户态程序一般习惯于open一个文件、然后read/write去读写文件。 而...
  • Java nio之内存映射

    2016-08-07 22:57:34
    Java nio之内存映射介绍内存映射文件非常特别,它允许Java程序直接从内存中读取文件内容,通过将整个或部分文件映射到内存,由操作系统来处理加载请求和写入文件,应用只需要和内存打交道,这使得IO操作非常快。...
  • 虚拟内存与内存映射文件是操作系统内存管理的重要部分,二者有相似也有不同的地方,本文是作者学习与应用中得到的一些体会,有错误的地方,请提点。 二者的联系:虚拟内存与内存映射文件都是将一部分内容加载的...
  • 内存映射与端口映射

    千次阅读 2015-12-14 08:42:30
    一、概念理解 ...CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped,也称“端口映射”),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构
  • 前面的《Windows内存体系(3) – 内存映射文件》文章,对内存映射文件技术的原理进行了介绍,本篇文章着重介绍该技术的使用场景。 一、内存映射文件技术介绍 常用的有Win32 API的CreateFile()、WriteFile()、...
  • 内存映射(mmap系统调用)

    千次阅读 2010-09-15 08:56:00
    映射虚拟内存-->物理内存/Swap/文件...进程所有的虚拟内存区 内存映射:创建一个虚拟内存区(VMA),映射文件    映射文件:外部程序调用VMA的(操作函数集中)操作函数访问映射文件的VMA   
  • mongodb内存映射原理

    千次阅读 2019-07-05 15:15:01
    mongodb使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP,MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,把磁盘IO操作转换成内存...
  • 内存映射文件技术 虚拟内存技术: 虚拟内存技术是根据系统页面文件(pagefile.sys)进行页面交换达到切换内存的目的。但是究其本质,我们会发现,虚拟内存技术本质上还是通过对页面文件的交换达到提高物理内

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 378,139
精华内容 151,255
关键字:

内存映射操作系统