首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找内核的内存页所有权

查找内核的内存页所有权
EN

Stack Overflow用户
提问于 2012-09-14 07:34:35
回答 2查看 259关注 0票数 0

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

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

有没有什么函数或shell命令来获取此信息?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-14 09:42:40

您可以使用move_pages()numa_tonode_memory()设置所有权。

票数 1
EN

Stack Overflow用户

发布于 2012-09-14 08:57:43

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

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

CPU核心“拥有”内存的整个概念是非常奇怪的。我认为Linux内核本身甚至不会跟踪哪个CPU核心最后触及了哪个页面,它肯定不会跟踪哪个CPU核心最后触及哪个缓存线。(跟踪这将消耗太多的RAM,并且基本上没有任何好处。)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12416267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档