我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.
处理器x86/x86_64中使用哪种寻址在L1,L2和L3(LLC)中进行缓存 - 物理或虚拟(使用PT/PTE和TLB)以及PAT(页面属性表)对它有何影响?
在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间是否存在差异?
简短回答 - 英特尔使用虚拟索引,物理标记(VIPT)L1缓存:线程之间的数据交换将用于在具有HT的一个Core上执行什么?
8-way用于定义的高速缓存中Set需要低12 bits,这在virt和phys中是相同的)匿名内存(即程序堆和堆栈)是Linux 上页面缓存的一部分吗?内核的链接文档没有说明这一点。
但是关于页面缓存的维基百科条目包含一个图形(请看右上角),它给我的印象是malloc()在页面缓存中分配动态内存:

那有意义吗?关于mmap(),当它用于访问文件时,使用页面缓存是有意义的。通常也用于匿名内存,例如通过?malloc()进行匿名映射。mmap()
我希望得到一些解释。
谢谢。
编辑 2021-03-14
我决定最好在邮件列表上询问内存子系统的内核维护者。幸运的是,马修·威尔科克斯做出了回应并帮助了我。提炼:
page cache。LRU lists(最近最少使用)上找到它们,也可以通过page tables. 有点临时的。swap cache,而不是page cache。我最近问了一个问题: 为什么迭代std :: array比迭代std :: vector快得多?
正如人们很快指出的那样,我的基准测试存在许多缺陷。因此,当我尝试确定基准时,我注意到这std::vector并不慢std::array,实际上,情况恰恰相反。
#include <vector>
#include <array>
#include <stdio.h>
#include <chrono>
using namespace std;
constexpr int n = 100'000'000;
vector<int> v(n);
//array<int, n> v;
int main()
{
int res = 0;
auto start = chrono::steady_clock::now();
for(int x : v)
res += x;
auto end = chrono::steady_clock::now();
auto diff = end - start;
double elapsed =
std::chrono::duration_cast<
std::chrono::duration<double, std::milli>
>(end - start).count();
printf("result: %d\ntime: %f\n", res, elapsed);
}
Run Code Online (Sandbox Code Playgroud)
我尝试从以前的基准进行改进的事情:
-O3标志速度 …benchmarking ×1
c++ ×1
caching ×1
heap-memory ×1
linux ×1
linux-kernel ×1
performance ×1
tlb ×1
x86 ×1