相关疑难解决方法(0)

什么是写时复制?

我想知道什么是copy-on-write是什么以及它用于什么?Sun JDK教程中多次提到术语"写时复制数组",但我不明白它的含义.

copy-on-write data-structures

108
推荐指数
5
解决办法
8万
查看次数

处理器x86/x86_64中使用物理或虚拟寻址在L1,L2和L3中进行缓存?

处理器x86/x86_64中使用哪种寻址在L1,L2和L3(LLC)中进行缓存 - 物理或虚拟(使用PT/PTE和TLB)以及PAT(页面属性表)对它有何影响?

在这种情况下,驱动程序(内核空间)和应用程序(用户空间)之间是否存在差异?


简短回答 - 英特尔使用虚拟索引,物理标记(VIPT)L1缓存:线程之间的数据交换将用于在具有HT的一个Core上执行什么?

  • L1 - 虚拟寻址(在8-way用于定义的高速缓存中Set需要低12 bits,这在virt和phys中是相同的)
  • L2 - 物理寻址(需要访问Virt-2-Phys的TLB)
  • L3 - 物理寻址(需要访问Virt-2-Phys的TLB)

x86 caching virtual-memory virtual-address-space tlb

27
推荐指数
1
解决办法
9584
查看次数

Linux 上的匿名内存是页面缓存的一部分吗?

匿名内存(即程序堆和堆栈)是Linux 上页面缓存的一部分吗?内核的链接文档没有说明这一点。

但是关于页面缓存的维基百科条目包含一个图形(请看右上角),它给我的印象是malloc()在页面缓存中分配动态内存:
Thomas Krenn 的 Linux 存储堆栈图

那有意义吗?关于mmap(),当它用于访问文件时,使用页面缓存是有意义的。通常也用于匿名内存,例如通过?malloc()进行匿名映射。mmap()

我希望得到一些解释。

谢谢。

编辑 2021-03-14
我决定最好在邮件列表上询问内存子系统的内核维护者。幸运的是,马修·威尔科克斯做出了回应并帮助了我。提炼:

  • 匿名内存不由 处理page cache
  • 匿名页面有多种不同的处理方式——可以在LRU lists(最近最少使用)上找到它们,也可以通过page tables. 有点临时的。
  • 维基百科的图表是错误的。它还包含更多缺陷。
  • 如果系统提供交换并且匿名内存被交换 - 它将进入swap cache,而不是page cache

可以在此处此处阅读讨论。

linux memory-management heap-memory linux-kernel

5
推荐指数
1
解决办法
2499
查看次数

为什么通过std :: vector进行迭代比通过std :: array进行迭代要快?

我最近问了一个问题: 为什么迭代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标志速度 …

c++ performance benchmarking

1
推荐指数
2
解决办法
156
查看次数