我與mmap
試驗,並與下面的示例代碼來:爲什麼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千字節。 檢查程序的內存我正在使用top,主要是RES和VIRT列。
- 只是
- 只是
mmap
電話 - 後
mmap
調用之前讀取所有映射內存有該文件的有效加載到主內存後(:我在三個不同的地方尋找這些值之後頁面錯誤)
由最高記錄的數值是
- VIRT = 1828個RES = 244
- VIRT = 1964和RES = 248
- VIRT = 1964和RES = 508
1964年至1828年= 136,我想在千字節,因此完美地匹配文件的大小。
但我不明白RES的差異508 - 248 = 260 ..爲什麼它不同於虛擬內存大小和文件大小?
操作系統被編碼爲最常用的最佳用途,或者呼叫聲最大的客戶的典型用途 - 它做了很多事情,可能對您的使用沒有意義。你真的在意嗎? – 2012-04-18 20:44:05
@MartinBeckett不,我根本不在乎;-)這只是爲了學習的目的,我很好奇。 – 2012-04-18 20:47:49
好吧,您可以隨時閱讀源代碼;-)我的猜測是,它總是保留mmap以上的特定內存以防擴展 - 即使在這裏您只能打開只讀。但我不知道,所以我沒有添加這個作爲答案 – 2012-04-18 20:53:16