我正在试验mmap
并附带以下示例代码:
int main() {
int fd;
char *filename = "/home/manu/file";
struct stat statbuf;
int i = 0;
char c = *(filename);
// Get file descriptor and file length
fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("fopen error");
}
if (fstat(fd, &statbuf) < 0) {
perror("fstat error");
}
printf("File size is %ld\n", statbuf.st_size);
// Map the file
char* mmapA = (char*) mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE,
fd, 0);
if (mmapA == MAP_FAILED) {
perror("mmap error");
return 1;
}
// Touch all the mapped pages
while (i < statbuf.st_size) {
c = mmapA[i];
i++;
}
c++;
// Close file descriptor
if (close(fd) == -1) {
perror("close");
return 1;
}
//Unmap file
munmap(mmapA, statbuf.st_size);
return EXIT_SUCCESS;
}
文件大小为 137948 字节 = 134.7 KB。为了检查程序的内存,我使用顶部,主要是 RES 和 VIRT 列。我在三个不同的地方寻找这些值:
- 就在
mmap
通话之前 - 就在
mmap
通话后 - 在读取所有映射内存以将文件有效加载到主内存后(页面错误后)
top 报告的值是
- 维特 = 1828 资源 = 244
- VIRT = 1964 RES = 248
- VIRT = 1964 RES = 508
1964 - 1828 = 136,我猜是千字节,因此完全匹配文件的大小。
但我无法理解 508 - 248 = 260 的 RES 差异。为什么它与虚拟内存大小和文件大小不同?