CreateFileMapping使用Page_NOCACHE
时间: 2024-10-27 22:08:43 浏览: 18
`CreateFileMapping` 是 Windows 操作系统中用于创建文件映射区的一个API,它允许应用程序将一个文件的部分或全部内容映射到进程的地址空间,使得程序可以直接操作文件就像处理内存一样。其中,`FILE_MAP_READ`, `FILE_MAP_WRITE`, `FILE_MAP_EXECUTE`, 等标志定义了映射的权限;而 `FILE_MAP_NOCACHE` 则是一个额外的选项,用于指示创建的映射应该避免使用操作系统缓存。
当你在 `CREATE_FILE_MAPPING` 请求中加上 `FILE_MAP_NOCACHE` 标志(通常与 `FILE_MAP_WRITE` 结合使用),表示这个文件映射区的内容不会被操作系统缓存在高速缓存中。这通常用于需要高性能、低延迟或者需要保持数据一致性的情况,因为直接写入磁盘的数据不会立即进入缓存,而是立即同步到硬盘,降低了数据丢失的风险,特别是对于写密集型应用,如数据库或日志系统。
以下是 `CreateFileMapping` 的基本用法,展示了如何包含 `FILE_MAP_NOCACHE`:
```cpp
HANDLE hFileMappingObject;
LPVOID lpBaseAddress;
DWORD dwDesiredAccess = FILE_MAP_READ | FILE_MAP_WRITE | FILE_MAP_NOCACHE; // 包含NOCACHE标志
DWORD dwMaximumSize = 0; // 表示整个文件大小
LPCTSTR lpFileName = ...; // 文件路径
INT nNumberOfSections = 1;
LPSECURITY_ATTRIBUTES lpAttributes = NULL;
hFileMappingObject = CreateFileMapping(INVALID_HANDLE_VALUE, // 使用父进程的句柄
lpAttributes, // 默认属性
PAGE_READWRITE, // 对应于dwDesiredAccess中的PAGE_NOCACHE
0, // 最小偏移量
dwMaximumSize, // 映射的最大尺寸
lpFileName); // 文件名
if (hFileMappingObject != INVALID_HANDLE_VALUE) {
// 成功创建映射对象,然后可以通过lpBaseAddress访问映射后的内存
lpBaseAddress =MapViewOfFile(hFileMappingObject, dwDesiredAccess, 0, 0, dwMaximumSize);
// 现在你可以直接在lpBaseAddress上操作文件内容
} else {
// 处理错误
}
```
阅读全文