首页 > 解决方案 > 为什么 TLB 未命中次数不等于缺页次数

问题描述

我尝试了解 Linux 内核的内存管理,并编写如下代码:

//mem.c
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>


void main()
{
    char *brk_end = NULL;
    char *p = sbrk(0);
    int nr = 10000, i = 0; 

    brk(p +  4096*nr);

    i = 0;
    for (i = 0; i < nr; i++) {
        *(p + (i*4096) + 100) = 1;
    }

}

在我看来,每次我这样做*(p + (i*4096) + 100),都会出现页面错误(4K页面大小)。我像这样向 Linux 内核添加代码来捕获页面错误:

if (memcmp(current->comm, "mem", 3)) {
    g_counter++;
}

“mem”是我的进程名,我编译内核。最后g_counter表示这个程序实际上触发了大约 10000 次页面错误。

在我看来,缺页必须发生在 TLB 未命中之后,因此 TLB 未命中的次数应该等于缺页的次数。但是当我尝试用它perf来检测程序的 TLB 未命中时,我得到了另一个答案:

$perf stat -e dTLB-load-misses,iTLB-load-misses ./mem >/dev/null

 Performance counter stats for './mem':

             7,426      dTLB-load-misses                                            
               397      iTLB-load-misses                                            

       0.022220726 seconds time elapsed

为什么 TLB 未命中次数小于缺页次数?

标签: memory-managementlinux-kernelperftlbpage-fault

解决方案


推荐阅读