博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MapViewOfView和UnmapViewOfFile
阅读量:6856 次
发布时间:2019-06-26

本文共 2189 字,大约阅读时间需要 7 分钟。

hot3.png

MapViewOfView

函数MapViewOfView为文件的数据保留一个地址空间区域,并将文件的数据作为映射到这个区域的物理存储器进行提交。

LPVOID MapViewOfFile(HANDLE hFileMappingObject,                     DWORD dwDesiredAccess,                     DWORD dwFileOffsetHigh,                     DWORD dwFileOffsetLow,                     SIZE_T dwNumberOfBytesToMap);

参数

hFileMappingObject

[in]用来标识文件映射对象的句柄,这个句柄是CreateFIleMapping或OpenFileMapping函数返回的。

dwDesiredAccess

[in]用来标识如何访问这个数据,可以是下表中的某值。

可选值 含义
FILE_MAP_WRITE 允许读取以及写入文件数据。CreateFileMapping函数必须通过传递PAGE_READWRITE标识来调用
FILE_MAP_READ 允许读取文件数据。CreateFileMapping函数可以通过传递下列任一一个保护属性来调用:PAGE_READONLY,PAGE_READWRITE
FILE_MAP_ALL_ACCESS 等同于FILE_MAP_WRITE or FILE_MAP_READ or FILE_MAP_COPY
FILE_MAP_COPY 允许读取以及写入文件数据。在写入文件数据时,创建一个私有页面的拷贝(用到copy-on-write机制)。
FILE_MAP_EXECUTE 允许执行。可以执行映射的空间内的代码。CreateFileMapping函数必须通过传递PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_READ标识来调用

dwFileOffsetHigh

[in]数据文件中将作为视图中第一个字节的偏移值(64位)的高32位。

dwNumberOfBytesToMap

[in]数据文件中将作为视图中第一个字节的偏移值(64位)的低32位。这个偏移值必须是系统分配粒度的倍数。

dwNumberOfBytesToMap

[in]设定文件中有多少字节需要映射到地址空间。如果设定的值为0,系统将设法把从文件中指定偏移位置开始,到整个文件结尾的视图映射到地址空间。

返回值

如果函数调用成功,将返回已映射视图的起始地址。

如果函数调用失败,将返回NULL。可调用GetLastError获得错误码。

注意

  • 映射一个文件使指定的部分在进程的地址空间内可见。
  • 对于那些比地址空间size大的文件,每次只能映射文件的一小部分。当第一部分完成了,可以取消映射该部分并映射下一部分。
  • 调用VirtualQuery函数获得映射的size。
  • 如果指定了FILE_MAP_COPY标志,那么系统会从页交换文件中调拨物理存储器。调拨的物理存储器大小由dwNumberOfBytesToMap参数决定。在堆文件映射视图进行操作时,只要我们不执行读取数据之外的任何操作,系统就不会用到从页交换文件中调拨的页面。但是,一旦哪个线程写入文件映射视图中的任何内存地址,系统就会从页交换文件中选择一个页面,把原始数据复制到页交换文件中的页面,然后把复制的页面映射到进程的地址空间中。此后,各线程都将访问数据的副本,而不会访问或修改原始数据
  • 允许创建多个由单个数据文件支持的文件映射对象。Windows不保证这些不同的文件映射对象的视图具有一致性,但能保证单个文件映射对象的多个视图具有一致性(如将一个文件的前10K映射到进程A,前5K映射到进程B,这两个视图映射于同一个文件映射对象,那么进程B若修改了前5K的数据,进程A中同样位置也会被修改,数据始终保持一致性)。

UnmapViewOfFile

不再需要把文件的数据映射到进程的地址空间中时,可以该函数来释放内存区域:

BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

参数

lpBaseAddress

指向要释放的区域的基地址。该值必须等于MapViewOfView或MapViewOfViewEx的返回值。

返回值

如果函数调用成功,返回非0,并且所有指定范围内的修改过的页面将被写入磁盘。

如果函数调用失败,范围0.调用GetLastError获得详细错误码。

注意

  • 必须调用UnmapViewOfFile,否则,在进程终止之前,区域将得不到释放,即使调用了CloseHandle关闭了CreateFile和CreateFileMapping返回的句柄。
  • 如果原来使用FILE_MAP_COPY标志进行视图映射,那么对文件进行任何修改,实际上都是对存放在系统页面文件中的文件数据拷贝所做的修改,在这种情况下,如果调用UnmapViewOfFile函数,那么这个函数就不会对磁盘文件进行更新,只会释放页面文件中的页面,进而造成数据丢失。

转载于:https://my.oschina.net/simplefocus/blog/288234

你可能感兴趣的文章
LAMP及LNMP测试环境快速构建(yum版)
查看>>
常熟尚湖沙盘模拟公开课
查看>>
DHCP在企业网中的应用
查看>>
gitlab提示“Your account is locked”
查看>>
性能调优之sar
查看>>
apache 日志中记录代理IP以及真实客户端IP
查看>>
寻找数组中第二大的数_代码实现
查看>>
MySQL5.7-winx64的zip包安装过程
查看>>
windows 7安装时提示gpt分区无法安装windows系统
查看>>
GPT分区不能安装Linux/Redhat 5.x的解决方法
查看>>
我的友情链接
查看>>
运行WordCount报错:java.lang.OutOfMemoryError: Java heap space
查看>>
2条ce1链路捆绑成一条4M的链路,做负载均衡
查看>>
我的友情链接
查看>>
Hadoop序列化与Java序列化
查看>>
三款主流云笔记软件比较
查看>>
梯形的面积可以通过几何画板来计算吗
查看>>
对于异步的理解
查看>>
JQuer的简单应用
查看>>
国产开源敏捷工具-fKanban
查看>>