c - 查找核心的内存页面所有权

标签 c linux caching memory paging

我正在 linux 机器上编写一个 C 程序,它需要分配一个 10 到 20 GB 的巨大数组。

分配空间后,我想知道哪个核心拥有该数组的哪些页面。 “拥有”是指哪个核心负责哪个页面的连贯性。

是否有任何函数或 shell 命令可以获取此信息?

注意:我使用的是带有 gcc4.7 的 Debian。

最佳答案

当你分配内存时,内核通常只分配虚拟内存;内容(RAM 页)仅在第一次访问时填充。如果被驱逐到文件(文件支持的内存映射)或交换(所有其他内存),它们将在驱逐后的下一次访问中重新填充。这意味着进程分配的每一页内存可能不存在(按照惯例,在第一次访问时它会被读取为零)、在 RAM 中或被逐出(到磁盘或其他非 RAM 存储介质)。

在标准的多核/多 CPU 机器上,“所有权”是根据缓存行确定的,缓存行通常是 2 的小幂,介于 16 和 256 字节之间。每个 CPU“拥有”它最后触及的缓存行。随着进程的运行,CPU 和核心运行代码,从而访问代码,发生变化,因此没有固定的“所有者”;它动态变化。此外,管理通常由特定芯片、内存管理单元或 MMU 完成,而不是由 CPU 运行的代码。 (如今,MMU 通常集成到 CPU 中。)您可以固定一个进程,使其仅在特定的一个或多个 CPU 核心上运行,并据此猜测哪个 CPU 核心拥有哪个内存。我猜某些 MMU 可能有一种方法来报告它已将哪些高速缓存行分配给了哪个 CPU 内核——尽管我严重怀疑它在实践中是否可行。

CPU 核心“拥有”内存的整个想法极其奇怪。我认为 Linux 内核本身甚至不跟踪哪个 CPU 内核最后触及了哪个页面,它当然不跟踪哪个 CPU 内核最后触及了哪个缓存行。 (跟踪会消耗太多 RAM,并且基本上没有任何好处。)

有分布式内核(至少是 Linux 内核的补丁)和其他一些方法来构建一个集群,其中内存和 CPU 分布在多个物理机器上,但对进程来说是统一的——就像他们在一台物理机器上运行。在这种情况下,可以查询管理端以找出哪个物理节点拥有哪些 CPU 和哪些内存页。如果这是您的情况,您需要详细描述您正在使用的内核和工具,因为管理工具各不相同。

关于c - 查找核心的内存页面所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416267/

相关文章:

linux - 如何在 Amazon Linux AMI 上设置 cron 作业

linux - 如何根据文件B中的行号替换文件A中的某些行

c++ - linux 中 poll 系统调用的不正确行为

HTTP header : Controlling Cache and History Mechanism

java - Confluence Schema Registry 如何管理本地缓存

即使通过简单的方法也无法在 string 和指定的 char 中找到空格

c - 我怎样才能从用户那里得到一个字符串然后动态分配它?

C初学者帮助: day of week for any given date

python - 如何使用 Flask 缓存变量?

c - nn_send 完成后,nn_socket 将禁止立即以 Req/Rep 模式发送下一条数据