memory-management - 为什么 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 未命中次数小于缺页次数?
解决方案
推荐阅读
- firebase - 原因:未找到 zip END 标头。我只是安装工作室并在连接后连接到 Firebase 我面临这个错误
- spring-boot - 访问其他服务的 API
- angular - Bootstrap 5 工具提示在 Angular 11 项目中不起作用
- excel - 如果满足多个条件,数据从一个工作簿传输到另一个工作簿
- mongodb - MongoDB Atlas全文搜索:根据另一个字段中的值为一个字段分配分数
- android - 无法使用 Android NDK 交叉编译 c++ 库
- python - 请求 Microsoft graph api 时出现 SSL 错误
- php - 使用 FFMPEG 为视频添加水印并转换为所有分辨率的 HLS
- angular - 如何捕获锚标签的路由事件
- javascript - Typescript 数组类型,其中输出是动态输入数量的所有可能组合