MFC创建内存映射文件一

什么是内存映射文件?

 首先,“映射”这个词,就和数学课上说的一一“映射”,是一个意思,就是建立一种一一对应关系,在这里主要是指硬盘上文件的位置与进程逻辑地址空间中 一块大小相同的区域之间的一一对应。

       而内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping)。具体到代码就是建立并初始化了相关的数据结构 ,这个过程有系统的内部函数mmap()实现。内存映射文件与虚拟内存有些类似。根据内存映射文件的大小,可以在进程的逻辑地址中保留一个大小相同的区域,同时将物理存储器(磁盘)的数据提交给此区域。所以,在进程对该文件进行操作之前必须进行如下四个步骤:

1、首先对文件进行映射,就如将整个文件从磁盘加载到内存类似。

2、逻辑地址与物理地址转换,与内存映射无关

3、进程第一次访问ptr所指向的内存区域,导致缺页中断。由中断处理函数完成数据拷贝。与内存映射无关。

4、虚拟内存映射,与内存地址

                                                                                       图1

然后详细的原理请参考链接: 内存映射文件原理。

为什么使用内存映射效率高?

从 代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一 样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?

原因是read()是系统调用,其中进行了数据 拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图1中过程1,然后再将这些数据拷贝到用户空间,如图1中过程2,在这个过程中,实际上完成 了两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。

由此可以看出,使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理,由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。另外,实际工程中的系统往往需要在多个进程之间共享数据,如果共享数据容量巨大,那么就需要借助于内存映射文件来进行。实际上,内存映射文件正是解决本地多个进程间数据共享的最有效方法。

 

参考:

https://blog.csdn.net/chenxing888/article/details/5912183

https://blog.csdn.net/mengxingyuanlove/article/details/50986092

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值