1.什么是内存映射文件
如上图:内存映射文件意思就是吧一个硬盘上的文件映射到物理页上在把物理页映射到虚拟内存上。
这样的好处是不必再打开、关闭文件,直接像访问自己的内存一样想读就读想写就写,想要读写文件时候就直接读写内存。还有一个很大的优点就是当文件很大的时候使用这种方式会有很好的性能。
下面我们尝试用代码实现
介绍下CreateFileMapping()函数,这个可以理解为准备物理内存的。在之前的物理内存中我们也知道,这个函数是来实现多个进程公用物理页的。他还可以把硬盘上的内容映射到物理页上(把文件句柄)
HANDLE CreateFileMappingA(
[in] HANDLE hFile,
[in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
[in] DWORD flProtect,
[in] DWORD dwMaximumSizeHigh,
[in] DWORD dwMaximumSizeLow,
[in, optional] LPCSTR lpName
);
MapViewOfFile()函数:把物理内存与虚拟内存关联(就是最上面图中左边的箭头)
当执行完后我们会得到一个地址,我们代码中得到的就是虚拟内存的地址。然后我们就可以使用这个地址了。(下面我们读取地址)
LPVOID MapViewOfFile(
[in] HANDLE hFileMappingObject,
[in] DWORD dwDesiredAccess,
[in] DWORD dwFileOffsetHigh,
[in] DWORD dwFileOffsetLow,
[in] SIZE_T dwNumberOfBytesToMap
);
#include"stdafx.h"
#include<stdio.h>
#include<Windows.h>
DWORD MappingFile(LPSTR lpcFile)
{
HANDLE hFile;
HANDLE hMapFile;
DWORD dwFileMapSize;
LPVOID lpAddr;
//1.得到文件句柄
hFile = CreateFileA(lpcFile,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFile 失败:%d \n", GetLastError());
return 0;
}
//2.创