linux下识别内存,Linux:识别内存中的页面

我想知道在内存中缓存大文件的哪一部分。我使用的是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): %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;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值