我想知道一个巨大的文件的哪个部分被缓存在内存中.我正在使用fincore中的一些代码,它以这种方式工作:文件被mmaped,然后fincore循环遍历地址空间并使用mincore检查页面,但由于文件大小(几TB),它很长(几分钟) ).
有没有办法循环使用的RAM页面呢?它会快得多,但这意味着我应该从某个地方获取已用过的页面列表…但是我找不到一个方便的系统调用来实现这一点.
代码如下:
#include dio.h>
#include Failed == pa) {
perror("mmap");
close(fd);
return;
}
/* vec = calloc(1,1+st.st_size/pageSize); */
/* 2.2 sec for 8 TB */
vec = calloc(1,(st.st_size+pageSize-1)/pageSize);
if ((void *)0 == vec) {
perror("calloc");
close(fd);
return;
}
/* 48 sec for 8 TB */
if (0 != mincore(pa,vec)) {
fprintf(stderr,"mincore(%p,%lu,%p): %s\n",pa,(unsigned long)st.st_size,vec,strerror(errno));
free(vec);
close(fd);
return;
}
/* handle the results */
/* 2m45s for 8 TB */
for (pageIndex = 0; pageIndex <= st.st_size/pageSize; pageIndex++) {
if (vec[pageIndex]&1) {
printf("%zd\n",pageIndex);
}
}
free(vec);
vec = (char *)0;
munmap(pa,st.st_size);
close(fd);
return;
}
int main(int argc,char *argv[]) {
fincore(argv[1]);
return 0;
}