for (int i = 0; i < 100000; ++i) {
int *page = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
page[0] = 0;
munmap(page, PAGE_SIZE);
}
我希望在用户空间中获得大约100000个dTLB-store-misses,每次迭代一个(内核中也有大约100000个页面错误和dTLB-load-misses)。 运行以下命令,结果大约是我期望的两倍。 我会感激如果有人能够澄清为什么会出现这种情况:
perf stat -e dTLB-store-misses:u ./test
Performance counter stats for './test':
200,114 dTLB-store-misses
0.213379649 seconds time elapsed
附言:我已经验证并确定生成的代码没有引入任何可以解释这个结果的东西。此外,我的确得到了大约 100000 个页面故障和 dTLB-load-misses:k。
MAP_POPULATE
选项时不会修改页表,尽管原帖提到了页面错误。真是个失误。 - Peter Cordes