概述
我想知道在内存中缓存大文件的哪一部分。我使用的是fincore的一些代码,它的工作方式如下:文件是mmaped,然后fincore遍历地址空间并用mincore检查页面,但由于文件大小很长(几分钟) )。Linux:识别内存中的页面
有没有办法循环使用的RAM页面?它会更快,但这意味着我应该从某处获得已使用页面的列表......但是,我无法找到一个方便的系统调用来实现。
这里谈到的代码:
#include
#include
#include
#include
#include
#include
#include
#include
/* } */
#include
#include
#include
#include
#include
#include
void
fincore(char *filename) {
int fd;
struct stat st;
struct sysinfo info;
if (sysinfo(& info)) {
perror("sysinfo");
return;
}
void *pa = (char *)0;
char *vec = (char *)0;
size_t pageSize = getpagesize();
register size_t pageIndex;
fd = open(filename, 0);
if (0 > fd) {
perror("open");
return;
}
if (0 != fstat(fd, &st)) {
perror("fstat");
close(fd);
return;
}
pa = mmap((void *)0, st.st_size, PROT_NONE, MAP_SHARED, fd, 0);
if (MAP_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, st.st_size, vec)) {
fprintf(stderr, "mincore(%p, %lu, %p): %sn",
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("%zdn", 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;
}
2012-07-06
wazoox
+2
映射一个8 TB文件需要20亿4k页面。 “mincore”的48秒运行时间表示正在检查44.7 Mpages/sec。你认为这可以走多快?用printf()打印数百或数十亿行也不是世界上最快的事情。 –
2012-07-06 15:07:44
+0
我不希望让mmap/mincore比这更快;我想要的是减少循环的长度,可能通过扫描较少的页面... –
2012-07-06 15:42:29
+0
'printf'通常是非常慢的操作。将它替换为'activePages ++'之类的东西,看看处理循环需要多少时间。注意'vec'仍然是2 GiB,甚至调用'mincore'可能会改变缓存的内容,因为在分配给'vec'的虚拟地址空间内正在触摸物理内存。 –
2012-07-06 15:50:29
最后
以上就是羞涩泥猴桃为你收集整理的linux下识别内存,Linux:识别内存中的页面的全部内容,希望文章能够帮你解决linux下识别内存,Linux:识别内存中的页面所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复