磁盘与内存的映射就是文件映射,说这个问题之前我们先说下swap,因为

 
这个问题让我很容易想起swap,linux swap 是交换分区的意思,在内存不
 
够的情况下,操作系统先把内存与磁盘的swap区进行一个“映射”,然后把
 
这些内存解放出来放入内存中,为之后的进程的腾出一块内存空间,等到自
 
己的进程再次被唤醒时候,再把磁盘里面的内存换进来。这里有文件和内存之间
 
的映射奥,可是mmap与swap设计思想上是完全不同的,一个针对的物理内存
 
一个针对的是虚拟内存。
 
 
在说mmap之前我们先说一下普通的读写文件的原理,进程调用read或是write
 
后会陷入内核,因为这两个函数都是系统调用,进入系统调用后,内核开始读写
 
文件,假设内核在读取文件,内核首先把文件读入自己的内核空间,读完之后
 
进程在内核回归用户态,内核把读入内核内存的数据再copy进入进程的用户态内
 
存空间。实际上我们同一份文件内容相当于读了两次,先读入内核空间,再从内核
 
空间读入用户空间。
 
 
mmap是系统调用,mmap的作用是将进程的虚拟地址空间和文件在磁盘的位置做一一
 
映射,做映射之后,读写文件虽然同样是调用read和write但是触发的机制已经不一
 
样了(mmap是file_operations中的成员这么一说是不是了然了),实际上我们这么
 
说是不太合理的因为一一映射并不是mmap一开始就全部完成映射的。
 
 
mmap只会返回来一个指针,指向进程逻辑地址空间的一个位置。这个时候的过程是这
 
样的,首先read会改写为读内存操作,读内存的时候,系统发现该地址对应的物理内存
 
是空的,触发缺页机制,缺页机制先在swap寻找对应的页面,发现没有然后再去通过mmap
 
建立的映射关系,从硬盘上将文件读入物理内存。也就是说mmap把文件直接映射到了用户
 
空间,没有经历内核空间。
 
 
mmap可以映射文件进入用户的虚拟内存,实际上,他也可以把设备的内存映射入用户的
 
虚拟内存,因为我们一般都需要内核去读写设备,如果把设备的物理内存直接映射入空间
 
就跟上述一样,省去一次的内核copy。

文件映射mmap的更多相关文章

  1. Android mmap 文件映射到内存介绍

    本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...

  2. 内存映射MMAP和DMA【转】

    转自:http://blog.csdn.net/zhoudengqing/article/details/41654293 版权声明:本文为博主原创文章,未经博主允许不得转载. 这一章介绍Linux内 ...

  3. 内存映射mmap的几个api及其使用

    内存映射 mmap 内存映射mmap函数的作用是建立一段可以被两个或者多个程度读写的内存段,一个程序对他进行任何修改,对其它程序可见.同样,这个功能可以用在对文件的处理上,mmap函数创建一个指向一个 ...

  4. 深入理解内存映射mmap

    内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...

  5. [转载]linux内存映射mmap原理分析【转】

    转自:http://www.cnblogs.com/wanpengcoder/articles/5306688.html 转自:http://blog.csdn.net/yusiguyuan/arti ...

  6. (理论篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝

    为了快速构建项目,使用高性能框架是我的职责,但若不去深究底层的细节会让我失去对技术的热爱. 探究的过程是痛苦并激动的,痛苦在于完全理解甚至要十天半月甚至没有机会去应用,激动在于技术的相同性,新的框架不 ...

  7. 计算机底层知识拾遗(九)深入理解内存映射mmap

    内存映射mmap是Linux内核的一个重要机制,它和虚拟内存管理以及文件IO都有直接的关系,这篇细说一下mmap的一些要点. 修改(2015-11-12):Linux的虚拟内存管理是基于mmap来实现 ...

  8. 存储映射--mmap

    存储映射 使一个磁盘文件与存储空间中的一个缓冲区相映射. 当从缓冲区中取数据,就相当于读文件中的相应字节. 将数据存入缓冲区,则相应的字节就自动写入文件. 使用这种方法,首先应通知内核,将一个指定文件 ...

  9. 共享内存与存储映射(mmap)

    [前言]对这两个理解还是不够深刻,写一篇博客来记录一下. 首先关于共享内存的链接:共享内存.里面包含了创建共享内存区域的函数,以及两个进程怎么挂载共享内存通信,分离.释放共享内存. 共享内存的好处就是 ...

随机推荐

  1. Excel 生成sql语句

    CONCATENATE 拼接字符串 IF 不能跟 CONCATENATE 连用,所以可以通过建立新列去完成更高的需求 新建一列 cw=CONCATENATE("insert into biC ...

  2. linux下利用nginx部署python网站

    首先目标机器需要安装python nginx uwsgi,其次,需要给Nginx写配置文件,大体内容如下,具体内容可见 http://blog.cn2p.com/web-server/nginx-uw ...

  3. struts_19_对Action中所有方法、某一个方法进行输入校验(手工编写代码实现输入校验)

    对所有方法进行校验1.通过手工编写代码的形式实现 需求:用户名:不能为空手机号:不能为空,并且要符合手机号的格式1,3/5/8,后面是9个数字 第01步:导包 第02步:配置web.xml <? ...

  4. 1029 C语言文法

    program    -> external_declaration | program external_declaration <程序> ->  <外部声明> ...

  5. paper 73 :HDR(High Dynamic Range Imaging)在摄影中指高动态范围成像

    HDR(High Dynamic Range Imaging)在摄影中指高动态范围成像.国内的教程基本语焉不详,找到一篇比较详尽的国外教程翻译出来,希望对大家有帮助.^_^ 原文地址:http://p ...

  6. 关于C# winform 快速制作不规则边框的方法

    今天逛博客园突然发现一个帖子写的   快速建立不规则边框的方式 突然发现以前自己用API的方式好傻… 杀鸡焉用牛刀  下边是从网上不断转载的 原帖: 地址:http://www.cnblogs.com ...

  7. canvas基本画图

    <img src="img/lamp.gif" id="lamp"/> <img src="img/eg_tulip.jpg&quo ...

  8. 夺命雷公狗---微信开发54----微信js-sdk接口开发(1)之快速入门

    js-sdk基本介绍 除去服务号的九大接口外,微信提供了JS-SDK接口,所谓JS-SDK接口也就是在网页中使用javascript来更改网页设置, (比如隐藏右上角的菜单)获取用户状态(比如地理位置 ...

  9. Ado.net连接池 sp_reset_connection 概念

    什么是连接池? 正常情况下,每次访问数据库都会打开和关闭,中断物理连接后需要再次进行物理连接.这样操作会浪费资源 使用连接池,主要的区别在于,不需要中断物理连接,即每次中断请求时spid还是存在! 原 ...

  10. 自定义Writable、RawComparatorWritable、comparators(转)

    自定义Writable hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很多事情,但是如果你想构造一些更加复杂的结果,你可以自定义Writable来达到你的目的,我 ...