【发布时间】:2017-12-24 07:30:56
【问题描述】:
比如说,如果我有一个大文件映射到我的进程的虚拟地址空间中:
//Error handling is omitted for brevity
HANDLE hFile = CreateFile(L"path-to\\file",
GENERIC_READ,
FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
char* pAddress = (char*)MapViewOfFile(hFileMapping,
FILE_MAP_READ, 0, 0, 0);
//And get the data
char data_byte = pAddress[offset];
//Then remember to do the cleanup ....
内核虚拟内存管理器何时从磁盘上的文件中读取实际数据(或执行 I/O 操作以从硬盘驱动器获取数据):
A) 当MapViewOfFile 被调用时,或者
B) 当我使用pAddress[offset]访问它时?
如果上面的答案是 B,还有第二个问题——当它获取数据时:
C) 它是否读取整个文件,或者
D) 仅包含页面(4K 大小左右)?
【问题讨论】:
-
答案 - B 和 D