九、内存映射文件
实际上内存映射文件跟数字图像处理并没有直接的关系。“映射文件”,是一段虚拟内存逐字节对应于一个文件或类文件的资源,使得应用程序处理映射部分如同访问主内存。文件映射允许进程使用随机输入和输出(I / O)和顺序I / O。
1、内存映射文件常见用途:
1、最常见用途是绝大多数操作系统(包括Microsoft Windows与Unix-like系统)用于加载进程。
2、另一个用途是多个进程的共享内存。
3、第三个用途是对大文件的读写,所以内存映射文件是处理大图像的思路之一。
2、内存映射文件的两种分类:
Persisted
Persisted文件与硬盘文件相关联,当关闭内存映射时,数据被写入对应的硬盘文件中。适合于很大的文件。
Non-persisted
Non-persisted文件并不关联于硬盘文件。当关闭内存映射文件,所有数据被抛弃。适用于创建进程间通信的共享内存。
对于Windows操作系统,不需要调用CreateFile。调用CreateFileMapping时,将INVALID_HANDLE_VALUE作为hFile参数传入,指示创建的文件映射对象不是磁盘上的文件,而是页交换文件。所需分配的存储器大小由CreateFileMapping的dwMaximumSizeHigh和dwMaxinumSizeLow参数决定。
3、Windows API函数:
创建或打开文件内核对象HANDLE CreateFile(PCSTR pszFileName,DWORD dwDesiredAccess,DWORD dwShareMode,PSECURITY_ATTRIBUTES psa,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);
创建(或打开)一个文件映射内核对象HANDLE CreateFileMapping(HANDLE hFile,PSECURITY_ATTRIBUTES psa,DWORD fdwProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,PCTSTR pszName);
文件数据映射到进程地址空间并提交PVOID MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap);
从进程地址空间撤消文件映射BOOL UnmapViewOfFile(PVOID pvBaseAddress);
强制系统将修改过的数据重新写入磁盘BOOL FlushViewOfFile(PVOID pvAddress,SIZE_T dwNumberOfBytesToFlush);
关闭文件映射对象:用CloseHandle函数
文件对象:用CloseHandle函数
4、要使用内存映射文件步骤:
1、创建或打开文件内核对象,该对象标识您要用作内存映射文件的磁盘上的文件。
2、创建一个文件映射内核对象,该对象告诉系统文件的大小以及打算如何访问该文件。
3、告诉系统将全部或部分文件映射对象映射到进程的地址空间。
使用完内存映射文件后,必须执行三个步骤来清理:
1、告诉系统从进程的地址空间取消映射文件映射内核对象。
2、关闭文件映射内核对象。
3、关闭文件内核对象。