
内存底层申请两大方式私有内存 Private MemoryVirtualAlloc/VirtualAllocEx物理页仅当前进程独占映射内存 Mapped MemoryCreateFileMapping支持多进程共享同一块物理页分为两种○ 匿名共享物理页INVALID_HANDLE_VALUE不绑定磁盘文件用作 IPC 共享内存○ 文件映射绑定磁盘文件把文件内容映射到虚拟地址核心 API 介绍CreateFileMapping创建文件映射内核对象HANDLECreateFileMapping(HANDLE hFile,// INVALID_HANDLE_VALUE不关联文件直接申请内存LPSECURITY_ATTRIBUTES lpAttributes,// 安全属性一般NULLDWORD flProtect,// 页面保护属性 PAGE_READWRITE / PAGE_READONLY / PAGE_WRITECOPYDWORD dwMaximumSizeHigh,// 偏移高32位可填0DWORD dwMaximumSizeLow,// 偏移低32位填共享内存总字节大小LPCTSTR lpName// 命名用于跨进程打开使用匿名则NULL);返回值内核对象句柄● 对象不存在新建映射对象返回有效句柄● 对象已存在依然返回句柄GetLastError()ERROR_ALREADY_EXISTS● 失败返回NULL保护属性● PAGE_READONLY只读● PAGE_READWRITE读写● PAGE_WRITECOPY写时复制2. MapViewOfFile把物理页映射到当前进程虚拟地址LPVOIDMapViewOfFile(HANDLE hFileMappingObject,//文件映射内核对象句柄DWORD dwDesiredAccess,//FILE_MAP_READ / FILE_MAP_WRITE / FILE_MAP_ALL_ACCESSDWORD dwFileOffsetHigh,//偏移高32位可填0DWORD dwFileOffsetLow,//偏移低32位映射起始位置若从映射对象最开头映射填0SIZE_T dwNumberOfBytesToMap//需要映射的字节数想映射整个映射对象填0);权限规则视图权限不能比底层映射对象权限更宽松底层 PAGE_READONLY视图只能 FILE_MAP_READ不能写3. OpenFileMapping打开已存在的命名映射对象专门用于第二个进程打开别的进程创建好的共享内存配合名称lpName使用4. 资源释放顺序非常重要UnmapViewOfFile(pBuf)先解除当前进程虚拟地址映射CloseHandle(hMapFile)关闭文件映射内核对象句柄内核对象采用引用计数所有进程全部 CloseHandle 之后内核对象才销毁共享内存原理多个进程各自的虚拟地址可以通过页表指向同一份物理页● 进程 A0x390000 → 物理页 P● 进程 B0x520000 → 物理页 P● A 写入数据B 立刻读到零拷贝IPC 通信里性能最高⚠️ 共享内存本身不带同步机制多进程同时读写会出现竞态需要手动加锁互斥体 / 事件等内核对象完整示例代码进程A创建共享内存#defineMapFileNameL共享内存#defineBUFSIZ4096HANDLE g_hMapFileCreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,MapFileName);LPTSTR g_pBuf(LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);*(PDWORD)g_pBuf0x12345678;//写入测试数据// 使用完毕释放UnmapViewOfFile(g_pBuf);CloseHandle(g_hMapFile);进程B打开同一块共享内存 HANDLE hMapOpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,L共享内存);LPVOID pBufMapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);DWORD val*(PDWORD)pBuf;//读取0x12345678UnmapViewOfFile(pBuf);CloseHandle(hMap);VAD 调试观察WinDbg 命令 !vad● 共享内存区域标记为 Mapped● 私有内存栈、堆标记为Private总结CreateFileMapping 创建内核对象MapViewOfFile 建立虚拟地址和物理页的映射两种用途①磁盘文件映射②匿名共享内存IPC 跨进程通信hFileINVALID_HANDLE_VALUE权限双层控制底层映射对象保护属性 MapViewOfFile 视图访问权限取严格者生效释放顺序先 UnmapViewOfFile再 CloseHandle共享内存高性能但无内置同步需要互斥体 / 事件做并发保护