body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

MMAP文件映射(文件内存映射)

——大文件操作,防止频繁读,效率低,所以映射到内存。映射到内存,再次操作文件就相当于操作内存,效率很高,操作完解除映射,文件也相应改变了;

mmap 将一个文件或者其它对象(主要指设备)映射进内存。文件被映射到多个页上(每页4K),如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零;mmap在用户空间映射调用系统中作用很大。

#include<sys/mman.h>

void* mmap(void* start,     size_t  length,    int  prot,    int   flags,    int  fd,    off_t  offset);        //失败返回(char*)-1

int  munmap(void*  start,  size_t length);         //解除内存映射:用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。

成功执行时,mmap()返回被映射区的指针munmap()返回0。失败时,mmap()返回MAP_FAILED,其值为(void *)-1,munmap返回-1


start:映射区的开始地址,设置为NULL时表示由系统决定映射区的起始地址。
length:映射区的长度。//长度单位是 以字节为单位,不足一内存页按一内存页处理(常用映射文件大小
prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运算合理地组合在一起
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问

flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个的组合体 (常用MAP_SHARED
fd:有效的文件描述词。一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射
off_toffset:被映射对象内容的起点。(相对于内存映射页的偏移)(常用0

prot:   PROT_READ|PROT_WRITE  (页内容可读可写)

flags:  MAP_SHARED  (与其他所有映射这个对象的进程共享映射空间)

openmode:  RDWR

test.c
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<sys/mman.h>
#include<string.h>
int main(int argc,char **argv)
{
     int fd = open(argv[1],O_RDWR);
     struct stat buf;
     bzero(&buf,sizeof(struct stat));
     fstat(fd,&buf);
     char *p = (char *)mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
     printf("p=%s\n",p);
     char tmp[5]="world";
     for(int i=0;i<strlen(tmp);i++)
     {
             p[i]=tmp[i];
     }
     printf("------after change------\n%s\n",p);
     munmap(NULL,buf.st_size);
     return 0;
}

mmap

1、文件必须有大小,映射后不能改变文件大小

2、让系统帮我们选择起始地址,第一个参数问NULL

3、用完后要解除映射munmap


#include<unistd.h>
#include<sys/mman.h>
int munmap(void *start,size_t length);   //接触映射;解除映射成功则返回0,否则返回-1

函数说明: munmap()用来取消参数start所指的映射内存起始地址,参数length则是欲取消的内存大小。当进程结束或利用exec相关函数来执行其他程序时,映射内存会自动解除,但关闭对应的文件描述符时不会解除映射。




MMAP文件内存映射的更多相关文章

  1. .NET Framework自带的文件内存映射类

    最近一直为文件内存映射发愁,整个两周一直折腾这个东西.在64位系统和32位系统还要针对内存的高低位进行计算.好麻烦..还是没搞定 偶然从MSDN上发现.NET 4.0把内存文件映射加到了.NET类库中 ...

  2. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...

  3. python标准库基础之mmap:内存映射文件

    #作用:建立内存映射文件而不是直接读取内容文本信息内容:如下(名称是text.txt) Lorem ipsum dolor sit amet, consectetuer adipiscing elit ...

  4. mmap:内存映射文件

    介绍 建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据. 内存映射通常可以提高I/O性能,因为使用内存映射时,不需要对每一个访问都建立一个单独 ...

  5. c++/MFC 封装好的文件内存映射类

    整理日: 2015年2月16日 首先介绍内存映射文件操作------函数的用法以及先后执行顺序 // 第一步:创建文件 HANDLE hFile = CreateFileForMapping(_T(& ...

  6. 【JavaNIO的深入研究4】内存映射文件I/O,大文件读写操作,Java nio之MappedByteBuffer,高效文件/内存映射

    内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileC ...

  7. 内存控制函数(1)-mmap() 建立内存映射

    示例1: 1.首先建立一个文本文件,名字为tmp,内容为hello world 2.编写mmap.c #include <sys/types.h> #include <sys/sta ...

  8. cocos2d 文件系统使用文件内存映射性能对比

    //cocos 修改代码 ..... //性能测试代码 extern "C" { #include <time.h> #include <stdlib.h> ...

  9. Linux内存映射--mmap函数

    Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...

随机推荐

  1. 从LayoutInflater分析XML布局解析成View的树形结构的过程

    上一篇博客分析了XML布局怎么载入到Activity上.不了解的能够參考 从setContentView方法分析Android载入布局流程 上一篇博客仅仅是分析了怎么讲XML布局加入到 Activit ...

  2. Navicat运行sql文件报错out of memory

    下载并安装mysql workbench:

  3. mybatis三剑客之mybatis-pagehelper分页插件

    这是pom.xml里的依赖: 后续再讲具体的使用

  4. SDWebimage清空缓存

    清空缓存 - (void)clearTmpPics{ [[SDImageCache sharedImageCache] clearDisk]; [[SDImageCache sharedImageCa ...

  5. public boolean onKeyDown(int keyCode, KeyEvent event)

    @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated method ...

  6. WebStorm mac下如何安装WebStorm + 破解

    1.下载软件最好的地址就是官网了下载地址 选择好系统版本以后点击DOWNLOAD   下载Webstorm 2.安装双击下载好的安装包.将WebStromt拖入application文件夹,然后在La ...

  7. JQuery UI中的Tabs与base元素摩擦的BUG

    JQuery UI中的Tabs与base元素冲突的BUG 以前一直使用jquery-ui-1.8,最近打算试一下目前最新的版本1.11.但对于Tabs,页面是乱的,怎么也不正常.折腾了好几个小时,最后 ...

  8. jenkins下搭建c++持续集成环境

      运行环境为centos 5.8 1.下载tomcat,并解压 2.下载jenkins,把jenkins.war放到tomcat的webapp目录下 3.在tomcat的bin目录下执行./star ...

  9. make clean 与 make distclean 的区别

    make clean仅仅是清除之前编译的可执行文件及配置文件. 而make distclean要清除所有生成的文件. Makefile 在符合GNU Makefiel惯例的Makefile中,包含了一 ...

  10. Android 自定义View-字母索引表(一)

    在有些Android应用中,为了方便快速定位,经常会看到屏幕右侧有一个字母索引表,今天尝试使用自定义View的方式实现了索引表的基本布局. 字母索引表的样式如下面的示意图所示, 此时我们至少需要知道以 ...