现在才真正使用了一次mmap,之前是没有使用的需求。

优势体会:

1.内存映射文件虽然可以避免IO操作,性能更好,但是使用起来并不比fwrite,fread简单。

2.断电时正在写文件的话,该文件在开机之后就是空的了,内存映射可以避免这个问题,至少保证文件中是有数据的。

3.应该是可以用于IPC进程通信,这个比共享内存有自己的特殊优势:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h> //mmap#include <sys/types.h> //open,close 3 .h
#include <unistd.h>
#include <fcntl.h>#include <string>
#include <iostream>
#include <unordered_map>
#include <cstring>
#include <stdio.h>int main(){int m_shmid = open("/usr/local/share/TEMP_FILE",O_RDWR);void *p = mmap(NULL, 40960, PROT_READ|PROT_WRITE, MAP_SHARED ,m_shmid, 0);close(m_shmid);memset(p,0,40960);//这里表面上映射的是4个字节的大小,但是实际上因为有最小单位:页,映射的是一个页的大小:4096(默认大小)int m_shmid1 = open("/usr/local/share/TEMP_FILE",O_RDWR); void *p1 = mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_SHARED ,m_shmid1, 0); //这里最后一个参数是偏移,如果改为了4096可以看看效果// int m_shmid1 = open("/usr/local/share/TEMP_FILE",O_RDONLY);//O_RDONLY 这里注意,如果设置为readonly,进行写值的话会触发段错误// void *p1 = mmap(NULL, 4, PROT_READ, MAP_SHARED ,m_shmid1, 0);close(m_shmid1);printf("addr:%lx,%lx\n",p,p1);*(int *)p1 = 23;*((int *)p1+1) = 65; //这里说明最小就需要一页!*((int *)p1+1023)  = 98;// *((int *)p1+1024)  = 99; 这里加上就是段错误,因为越过了一个页的大小printf("0-24:%d,%d,%d,%d,%d,%d\n",*((int *)p+0), *((int *)p+1),*((int *)p+1022),*((int *)p+1023),*((int *)p+1024),*((int *)p+1025));sleep(10);munmap(p, 40960);munmap(p1, 4);return 0;
}

根据这个例子可以看出,mmap可以当做共享内存使用,然后他可以选择映射其中一部分,这个很灵活。

可以还可以设置权限,以只读打开的映射,赋值就会崩溃。

劣势:

1.使用比较麻烦,还有一些细节要理解,字节对齐等等。

内存映射文件的优势劣势体会相关推荐

  1. 使用内存映射文件来提高你程序的性能

    本人在学习<WINDOWS核心编程>的时候对JEFFREY大师提到的一个小程序写了两个版本来比较性能,该程序的原始需求是这样的:对一个大文件进行倒序,也就是将一个文件头变成尾,尾变成头. ...

  2. C#内存映射文件学习总结

    C#内存映射文件学习 http://www.cnblogs.com/flyant/p/4443187.html 内存映射文件是由一个文件到进程地址空间的映射. C#提供了允许应用程序把文件映射到一个进 ...

  3. 内存映射文件 写入 卡住_在Java中使用内存映射文件时检测(写入)失败

    内存映射文件 写入 卡住 内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入 ...

  4. 在Java中使用内存映射文件时检测(写入)失败

    内存映射文件是一个很好的并且经常被忽视的工具. 我不会在这里详细介绍它们的工作方式(使用 力 Google Luke!),但我将快速总结其优势: 操作系统提供的延迟加载和写入缓存(您不必自己编写,并且 ...

  5. VC++中使用内存映射文件处理大文件

    引言 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile().ReadFile() ...

  6. 内存映射文件使用详细

    http://www.cppblog.com/woaidongmao/archive/2008/12/26/70439.html 摘要: 本文通过内存映射文件的使用来对大尺寸文件进行访问操作,同时也对 ...

  7. 使用内存映射文件在进程之间共享数据

    数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面.因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中 ...

  8. MongoDB内存映射文件

    2019独角兽企业重金招聘Python工程师标准>>> Mongodb源码分析--内存文件映射(MMAP) 内存映射文件原理探索 Linux 内存映射函数 mmap()函数详解 Li ...

  9. windows笔记-内存映射文件

    Windows提供了3种进行内存管理的方法: • 虚拟内存,最适合用来管理大型对象或结构数组. • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据. ...

  10. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

最新文章

  1. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程
  2. .NET智能客户端(SmartClient)
  3. C语言链表是否为循环表的算法(附完整源码)
  4. 设置函数环境——setfenv(转)
  5. functions.php 在哪,functions.php常用函数
  6. python外星人入侵怎么发给别人_python_外星人入侵(1-1)
  7. 【APIO2010】巡逻
  8. [渝粤教育] 厦门工学院 逻辑与批判性思维 参考 资料
  9. 新中大财务软件虚拟化解决方案
  10. x86 android 显卡 tablet2,随心而变 ThinkPad Tablet 2评测
  11. 王思聪喜欢的女生类型是这样的?
  12. 用html制作三角形九九乘法表,用js实现打印九九乘法表
  13. 泥瓦匠:程序猿为啥要坚持写原创技术博客?
  14. 用pandas合并两个csv表格并保存
  15. MT2502 datasheet,MT2502硬件设计,MT2502芯片资料
  16. Font shape `OMX/cmex/m/n‘ in size <10.53937> not available (Font) size <10.95> substituted.
  17. 搭建 WNMP 环境
  18. python中去掉字符串中的空格
  19. java创建response对象_创建一个HttpResponse对象
  20. 北卡教堂山计算机专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名北卡罗来纳大学教堂山分校排名第17...

热门文章

  1. 线性代数学习之对称矩阵与矩阵的SVD分解
  2. 行政区划矢量数据介绍与下载教程
  3. Java短信验证码-互亿无线
  4. LED灯具检验标准与方法
  5. Redis 操作命令大全
  6. 2.高速PCB设计规范(一)
  7. 简单无须Root 谷歌相机Gcam 打开即闪退的解决方法
  8. 实战OpenPose项目1:开篇使用文档
  9. VSFTPD (500 Illegal PORT command 500 OOPS: vsf_sysutil_bind) 错误解决方法
  10. 大一大学计算机考试考什么,【大学生计算机基础考题】 计算机基础大一考试题...