私は実験し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 キロバイトです。プログラムのメモリを検査するために、主に RES 列と VIRT 列の top を使用しています。これらの値を 3 つの異なる場所で探しています。
mmap
電話の直前mmap
電話の直後- マップされたすべてのメモリを読み取って、ファイルをメイン メモリに効果的にロードした後 (ページ フォールト後)
top によって報告される値は次のとおりです。
- VIRT = 1828 RES = 244
- VIRT = 1964 RES = 248
- VIRT = 1964 RES = 508
1964 年 - 1828 年 = 136、キロバイト単位で推測すると、ファイルのサイズと完全に一致します。
しかし、508 - 248 = 260 の RES の違いが理解できません。仮想メモリ サイズとファイル サイズが異なるのはなぜですか?