第17章内存映射文件
还是优缺点。然后用途。怎么用。
17.1内存文件原理及用途
17.2使用内存映射文件
17.3用内存映射文件在进程间共享数据
17.1内存文件原理及用途
与虚拟内存相似,内存映射文件允许开发人员预订一块地址空间区域并给区域调拨物理存储器。不同之处在于,内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自系统的页交换文件。一旦把文件映射到地址空间,我们就可对它进行访问,就像整个文件都已被载入内存一样。
内存映射文件主要用于以下三种情况:
1) 系统使用内存映射文件来载入并运行.exe和DLL文件。节省了页交换文件的空间及应用程序启动的实际。(系统自动,不关注)
2) 开发人员可用内存映射文件来访问磁盘上的数据文件。可避免直接对文件进行I/O操作和对文件内容进行缓存。
3) 同一机器的不同进程间共享数据。
17.2使用内存映射文件
1)创建或打开一个文件内核对象。CreateFile
2)创建一个文件映射内核对象来告诉系统文件的大小及我们打算如何访问文件。
3)告诉系统把文件映射对象映射到进程的地址空间中。
用完内存映射文件后,分两步清理
4) 告诉系统从进程地址空间中取消对文件映射内核对象的映射。
5) 关闭文件映射对象和文件对象。
//Open the file for reading and writing
HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { AfxMessageBox(_T("File could not be opened.")); return FALSE; } //Create the file-mapping object. DWORD dwFileSize = GetFileSize(hFile, NULL); HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(TCHAR), NULL); if (NULL == hFileMap) { AfxMessageBox(_T("File map could not be opened.")); CloseHandle(hFile); return FALSE; } //Get the address where the first byte of the file is mapped into memory. PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0); if (NULL == pvFile) { AfxMessageBox(_T("Could not map view of file")); CloseHandle(hFileMap); CloseHandle(hFile); return FALSE; } //Clean up everything before exiting. UnmapViewOfFile(pvFile); CloseHandle(hFileMap); SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN); SetEndOfFile(hFile); CloseHandle(hFile); return TRUE;
17.3用内存映射文件在进程间共享数据
进程间共享数据的方式(或者说进程间通信方式):windows消息、内存映射文件、剪贴板、邮件槽、管道、信号量、套接字等。
用法:与上述相同。注意三点:
Ø A进程执行完上述步骤后,B进程可直接访问(也可执行同样步骤)。
Ø 用内存映射文件来共享数据时,多个进程必须用相同的内存映射文件名。
Ø 若仅为了共享数据,则不需CreateFile,只需将INVALID_HANDLE_VALUE传入CreateFileMapping的hFile。更专业的说法:这样创建的文件映射对象的物理存储器不是磁盘上的文件,而是希望系统从页交换文件中调拨物理存储器。