我写了一个示例C程序:
程序:
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include<inttypes.h>
int main()
{
int fd;
char *data;
fd = open("file.txt", O_RDWR);
int pagesize = getpagesize();
data = mmap((caddr_t)0, pagesize, PROT_READ, MAP_SHARED, fd, pagesize);
srand(time(NULL));
while(1)
{
int r = ( rand() % 9999 ) + 1;
char x = data[r];
}
return 0;
}
我正在为c中的大文件(大小为11GiB)做“mmap”。当我编译这个程序并尝试使用perf检查主要页面错误时我得到零。
Perf命令:
perf stat -e major-faults ./test
我已经运行了这个程序大约30秒并试图杀死,perf报告的主要页面错误数量为零。我的物理内存大小是8GiB。
此外,如果我使用非常大的随机数代替9999,我会遇到分段错误。
任何人都可以建议我在这里做错了什么。
答案 0 :(得分:1)
mmap
的第二个参数应该是你要打开的文件的大小(在这种情况下,11GB或其他任何东西,你可以fseek
到最后或{{1}获取确切的大小),而不是pagesize。另外,我认为fstat
的第三个参数应该匹配mmap
标志。您只是从文件中读取内容,因此我会将open
更改为O_RDWR
。有意义的是,如果您仅将页面大小O_RDONLY
放入文件中,则不会出现页面错误。此外,将9999增加到随机大数可能会尝试读取页面大小以上,这可以解释段错误。最后,最好在继续之前检查mmap
对-1的回报以及open
对mmap
的回报。