gpt4 book ai didi

c++ - 为什么虚拟循环会消耗内核时间?

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:32 26 4
gpt4 key购买 nike

我写了这个简单无用的程序:

#include <iostream>
using namespace std;
#define TABSIZE 256*1024*1024

int main(){
volatile int *tab = new int[TABSIZE];

cerr << "start" << endl;
for(int i=0;i<TABSIZE;i+=1)
tab[i] *= i;
cerr << "stop" << endl;

delete []tab;
return 0;
}

在编译它(女巫 O2)并使用 time ./a.out 运行之后,我对结果感到非常惊讶:

real    0m1,660s
user 0m0,462s
sys 0m1,177s

很明显,大部分时间花在了内核空间,即使主循环与任何系统调用无关。我可以在程序启动后立即看到字符串 start,所以 new 不会消耗太多时间。同义地,stop 出现在结束之前。

那么,问题是:为什么这么多时间花在内核空间上?我在 Linux 4.15 上使用 GCC 7.4。

最佳答案

volatile int *tab = new int[TABSIZE];

此语句分配 1 GiB 的 RAM。此数量在进程的页表中标记为已使用,但并未真正初始化或可用(页面标记为“不存在”)。

tab[i] *= i

此时,第一次访问新页面(通常为 4KiB)会导致页面错误,由内核处理,然后用零初始化内存范围并将页面标记为存在。然后,直到下一页,访问都不会出现页面错误。

这种内存管理是内核 CPU 使用的原因。

关于c++ - 为什么虚拟循环会消耗内核时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58012975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com