预备知识

理解mmap,首先要理解什么是用户态和内核态,其次要了解虚拟内存。

简单的说,用户态内核态指的就是cpu指令集的权限程度,我们用户程序并没有操作硬件的权限,于是很多操作都需要转为内核态才能被执行。我们的物理内存也是分为用户空间和内核空间的,比如32位处理器的寻址范围为4G,那么低地址的3G就是用户空间,高地址的1G是内核空间。

其次是虚拟内存,虚拟内存是一种感受,我们作为os的使用者,能加载的程序大小其实可以超过物理内存,这是因为内存空间不足时,访问一个不存在于内存的数据,会触发缺页中断,进而会将内存中不常用的页置换到磁盘,将磁盘中要访问的数据置换到内存,如此我们作为使用者感觉内存似乎非常大。

除此之外,我们运行的程序都有属于自己的内存空间,这些程序也是被os欺骗了的,这些地址空间在程序看来是连续的,但实际存储在物理内存上是不连续的,cpu可以通过mmu将虚拟地址转为实际物理地址。(我们用户态太卑微了hhh~)

mmap和标准IO

一般我们读写文件调用的都是系统标准IO,比如系统调用函数read,write等等。标准IO在读写数据时都涉及到用户态和内核态的转换,比如read文件,就需要到内核空间的页缓存(page cache)中查找是否有该页,如果没有,那么就需要从磁盘中调取该页进入内核页缓存中,然后再将该页中的数据传输到用户空间(read函数的buf数组)。当write文件时,也是查找内核空间,将数据传入内核空间的页缓存,内核再将数据延迟刷入磁盘。

而mmap使得进程中的某一段地址和磁盘上文件的某一段地址形成映射,准确的说,应该是和页缓存中的页地址形成了映射,这样直接对进程中的那段地址做操作,虚拟内存会直接将该地址映射到页缓存上,进而直接操作了页缓存(page cache是被用户态和内核态共享的区域)。那么就无需页缓存再拷贝数据到用户空间了~

减少了一次页缓存到用户空间的数据拷贝,mmap自然比标准IO快了。

关于mmap的具体使用和参数含义,可以查看参考链接中的介绍。

参考:
https://segmentfault.com/a/1190000039774784
一文读懂 mmap 原理 - 掘金
磁盘I/O的三种方式对比:标准I/O、直接 I/O、mmap - 龙行天下,畅通无阻 - 博客园
认真分析mmap:是什么 为什么 怎么用 - 胡潇 - 博客园

mmap 通过地址映射读写文件相关推荐

  1. linux下c通过虚拟地址映射读写文件

    #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #i ...

  2. 使用mmap映射来读写文件

    一 mmap函数介绍 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman ...

  3. Go 学习笔记(49)— Go 标准库之 io/ioutil(读写文件、获取目录下的文件和子目录、创建临时目录和文件)

    1. 简要概述 import "io/ioutil" 包 io/ioutil 实现一些 I/O 实用程序函数. 2. 相关函数 2.1 func ReadAll func Read ...

  4. c语言格式化写入文件大小,利用C语言格式化读写文件

    "在C语言中进行格式化读写文件"按照字面意思通常大家都会理解为将读写文件进行格式化的操作,那么到底我们是不是真的将读写文件进行格式化的操作呢?下面课课家笔者就为大家简单介绍C语言中 ...

  5. python生成试卷制卷系统_Python 读写文件 小应用:生成随机的测验试卷文件

    去年学习了python的读写文件部分,了解了python读写的常用模块os.shelve,今天准备把课后作业试着自己做一下 目标:1)生成35份试卷.每个试卷有50道选择题 2)为了防止有学生作弊,需 ...

  6. java.io几种读写文件的方式

    一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作 ...

  7. C#读写文件:编码和转换(string和byte[]转换为例)

    读写配置文件不单单将内容write或read,有时也会进行内容编码转换等操作. 例 string和byte[]转换 这里是我曾经碰到过的问题,当时的情况是配置文件是一个移动设备提供的,主要是由移动设备 ...

  8. C# 读写文件方法总结

    使用FileStream读写文件   文件头:   using System; using System.Collections.Generic; using System.Text; using S ...

  9. python以读写方式打开文件_python读写文件操作详细介绍【传智播客】

    Python文件的打开或创建可以使用函数open().该函数可以指定处理模式,设置打开的文件为只读.只写或可读写状态.open()的声明如下所示. open(file, mode='r', buffe ...

  10. php中并发读写文件冲突的解决方案(文件锁应用示例)

    php中并发读写文件冲突的解决方案(文件锁应用示例) 参考文章: (1)php中并发读写文件冲突的解决方案(文件锁应用示例) (2)https://www.cnblogs.com/wellsoho/p ...

最新文章

  1. Nature综述:真菌的多样性:真菌的高通量测序及鉴定
  2. Go 语言编程 — 并发 — Channel 通道
  3. Python入门100题 | 第008题
  4. SecureCRT远程连接Linux服务器及相关配置
  5. EA强大的画图工具---设计数据库表格
  6. Bootstrap 两端对齐的导航
  7. 定义一个空切片_全面解读Python高级特性切片
  8. IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)
  9. 零基础学前端,自学还是培训机构?
  10. 实验1 查看cpu和内存,用机器指令和汇编指令编程
  11. 在Linux SSH全称,linux – 按名称获取打开的ssh连接列表
  12. SLAM会议笔记(五)LLOAM
  13. 进程与线程的区别(网络摘抄)
  14. [20170203]克隆schema.txt
  15. 极客大学架构师训练营 微服务网关 领域驱动设计 DDD OAuth 2.0 中台架构 第20课 听课总结
  16. uniapp中引入colorUI
  17. 通过硅靶摄像管采集图像的电子显微镜
  18. JS代码转换d.ts语法
  19. F. Equalize the Array(思维+前缀和)
  20. 传统企业借力商派助推转型

热门文章

  1. 最详细的ECLIPSE Android SDK下载安装及配置教程
  2. html 高德地图坐标,HDHCMS收集高德地图坐标拾取
  3. 2022年最新《谷粒学院开发教程》:12 - 项目完结篇
  4. 安卓TV开发(前言)— AndroidTV模拟器初识与搭建
  5. 软件项目管理第4版课后习题[附解析]第七章
  6. 神马js都是浮云-----限时秒杀
  7. 初学平面设计者应该掌握的软件是AI
  8. 数据清洗----缺失值处理
  9. 信息安全工程师教程学习笔记汇总(思维导图及考试要点)
  10. 信号和通信系统第三版(PDF)