前言

前面几篇我们学习了用户空间的IO缓冲区,以及IO缓冲区的分散聚合IO技术.
为了减少系统调用的次数,提升系统性能,操作系统开发者门提出了这么多的缓存技术。
但是到这里这些技术同样有不足的地方:不论是读或者写文件,都需要将内容拷贝到IO缓冲区以及页高速缓冲区,这就增加了数据拷贝的次数,无形之中增加了CPU和内存的开销。

有没有一种办法既可以减少系统调用的次数同时又可以降低数据的拷贝次数呢?这里系统开发者推出了内存映射技术。


描述

将文件映射到内存:

  • 内存数据与文件数据一一对应
  • 通过内存代替read/write系统调用接口来访问文件
  • 减少数据拷贝,减少系统调用次数,提高了系统性能

    映射完成之后,用户对内存的读写即会转换为读文件的读写。

编程接口

  • 头文件 <sys/mman.h>
  • 函数使用 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • 函数功能:在用户虚地址空间创建一个和实际物理内存相映射的关系。
  • 函数参数:
    addr:进程要映射的虚拟内存的起始地址,一般为NULL。操作系统会自动分配一个合适的内存地址。
    length:要映射实际的内存区域大小
    prot:内存保护标志,PROT_EXEC,PROT_READ,PROT_WRITE
    flags: 映射的对象类型,MAP_FIXED,MAP_SHARED,MAP_PRIVATE
    fd:要映射的文件描述符
    offset:文件偏移地址
    mmap:以页单位操作,参数addroffset必须按页对齐(4K对齐)
  • 返回值:
    成功:指向映射后的实际内存的地址
    失败:MAP_FAILED

编程案例

map_write.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>int main(int argc,char *argv[]){int fd,i = 0;char *p_map;fd = open(argv[1],O_CREAT|O_RDWR,0666);if (-1 == fd) {printf("open failed \n");_exit(-1);}//初始化文件描述符,设置文件大小;此处也可以用ftruncate直接设置write(fd,"",14);//将fd文件映射到物理内存区域,使用MAP_SHARED标记,即映射的内存可以和其他进程共享p_map =(char *)mmap(NULL, 20, PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if (MAP_FAILED == p_map) {printf("mmap failed \n");_exit(-1);}close(fd);//使用内存拷贝函数,将指定字符串拷贝到映射的内存区域memcpy(p_map, "hello world\n",14);sleep(5);//解除映射if (munmap(p_map,20) == -1) {printf("ummap failed \n");_exit(-1);}return 0;
}

mmap_read.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>int main(int argc,char *argv[]){int fd,i = 0;char *p_map;fd = open(argv[1],O_CREAT|O_RDWR,0666);if (-1 == fd) {printf("open failed \n");_exit(-1);}p_map =(char *)mmap(NULL, 20, PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if (MAP_FAILED == p_map) {printf("mmap failed \n");_exit(-1);}close(fd);//映射到内存之后可以直接从映射的地址中读出写入内存的数据printf("mmap read %s\n",p_map);if (munmap(p_map,20) == -1) {printf("ummap failed \n");_exit(-1);}return 0;

输出如下:

zhang@ubuntu:~/Desktop/cpp_practice$ ./write map_write
zhang@ubuntu:~/Desktop/cpp_practice$ ./read map_write
mmap read hello world

linux 文件IO与内存映射:内存映射相关推荐

  1. 浅析 Linux 文件 IO 读写

    浅析 Linux 文件 IO 读写 Linux的文件IO子系统是Linux中最复杂的一个子系统(没有之一).读者可以参考以下这个图: https://www.thomas-krenn.com/de/w ...

  2. linux的每次IO大小控制,linux文件io缓冲

    linux文件io缓冲 出于速度和效率考虑,系统io调用(即内核)和标准 C语言库的io函数(即 stdin 函数)在操作磁盘文件时会对数据进行缓冲. read(),write()系统调用在操作磁盘文 ...

  3. Linux文件IO深入剖析

    文章目录 1 linux文件系统基本概念 1.1 文件系统基本概念 1.2 文件系统缓存 2 文件IO访问方式概述 2.1 标准文件IO 2.2 直接IO 2.3 缓存同步 1 linux文件系统基本 ...

  4. Linux 文件 IO

    参考:http://blog.csdn.net/wanxiao009/article/details/5648583 C 和 C++ 文件操作详解:http://blog.csdn.net/freek ...

  5. 漫谈linux文件io,Linux文件IO与通用块层的请求合并

    本文参考https://mp.weixin.qq.com/s/Imt4BW-zoHPpcOpcKZs_AQ, 公众号"Linux阅码场" 请求合并就是将进程内或者进程间产生的在物理 ...

  6. linux文件IO与内存映射:分散/聚集IO技术(scatter-gather)

    前言 根据上文我们学习到的用户空间的IO缓冲区,操作系统为了减少系统调用的次数,节省系统开销,提出了用户空间的IO缓冲区,即为用户空间的文件读写开辟一段可以利用setvbuf配置大小的内存空间来作为文 ...

  7. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  8. Linux文件IO(文件的读写)

    内容源于朱友鹏老师的课程笔记的学习整理,如有侵权,请告知删除. 一.linux中如何管理文件 (1)硬盘中的静态文件和iNode(i节点) 内容管理表 + 真正存储的内容: 内容管理表以文件为单位进行 ...

  9. 嵌入式 Linux 文件IO操作

    目录 Linux 文件操作 1 Linux 系统环境文件操作概念 2 缓冲 IO 文件操作 1 文件的创建,打开与关闭 fopen 函数函数 2 freopen 函数 3.fdopen函数 4.fcl ...

最新文章

  1. linux lnmp yum,yum安装LNMP
  2. user agent stylesheet对格式的影响
  3. PostgreSQL cheatSheet
  4. shell 调用 sqlplus 各种情况示例
  5. output怎么用_性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
  6. java面试常见面试问题_Java面试准备:15个Java面试问题
  7. 贵州大学 c语言,贵州大学C语言 试卷.doc
  8. Python数据类型转换详解(内附详细案例)
  9. 【杂题总结】洛谷-3959 宝藏
  10. ASP.NET AJAX Advance Tips Tricks (9) DropDownList在Firefox下的奇怪现象和解决方案——谁的BUG?...
  11. Arduino 各种模块篇 motor shield 电机扩展板(舵机、直流电机、步进电机party)
  12. 智能门锁主流品牌有哪些?选购门锁时要注重产品的哪些特性?
  13. 云服务器 ECS Linux 配置 vsftpd即FTP的搭建和使用
  14. android ios mp4格式转换,爱思助手怎么转换视频格式 爱思助手将普通视频格式转换为mp4格式方法...
  15. win7所有服务被禁用(应该是大多数被禁用)
  16. 开展软件测试的目标和目的究竟是什么?
  17. Mac终端神器iTerm2配置(oh-my-zsh+shell integration+Powerlevel9k)
  18. 思科cisco交换机如何查找环路及解决方法
  19. 蜂鸣器播放音乐 fpga实现
  20. windows10安装SQL server 2008 R2

热门文章

  1. Selenium2+python自动化24-js处理富文本(带iframe)
  2. JAVA的instanceOf什么时候用
  3. [转]优化Flash性能
  4. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design
  5. ios获取新数据要不要关_iOS开发之数据读写
  6. python用for循环一直出现最后一个值_python中for循环的list最后一个数据总会覆盖前面的数据...
  7. windows优化大师怎么用_怎么在电脑上添加一款好用的提醒便签软件?
  8. 2017计算机nit考试时间,关于2017年专接本NIT考试,你知道多少呢???
  9. html标记汇总,HTML标记语法汇总.doc
  10. python数据分析第七章实训3_《利用python进行数据分析》读书笔记--第七章 数据规整化:清理、转换、合并、重塑(二)...