我正在linux机器上编写一个C程序,需要分配一个10到20 GB的巨大数组。
分配空间后,我想知道哪个核心拥有该阵列的哪些页面。 通过“拥有”,我的意思是哪个核心负责哪个页面的连贯性。
是否有任何函数或shell命令来获取此信息?
注意:我正在使用Debian和gcc4.7。
答案 0 :(得分:2)
当你分配内存时,内核通常只分配虚拟内存;内容(RAM页面)仅在第一次访问时填充。如果逐出文件(文件支持的内存映射)或交换(所有其他内存),它们将在驱逐后的下一次访问时重新填充。这意味着进程分配的每个内存页可能不存在(按照惯例在第一次访问中读为零),在RAM中,或被驱逐(到磁盘或其他非RAM存储介质)。
在标准的多核/多CPU机器上,“所有权”是基于高速缓存行确定的,高速缓存行通常是2的小功率,在16到256字节之间。每个CPU“拥有”它最后触摸的缓存行。随着进程的运行,运行代码并因此访问代码的CPU和核心发生变化,因此没有固定的“所有者”;它动态变化。此外,管理通常由特定芯片,存储器管理单元或MMU完成,而不是由CPU运行的代码完成。 (MMU现在经常集成到CPU中。)您可以将进程固定为仅在某些CPU核心或核心上运行,并基于 guess 哪个CPU核心拥有哪个内存。我猜一些MMU可能有办法报告它给哪个CPU核心提供了哪些缓存行 - 尽管我很怀疑它在实践中是否可行。
CPU核心“拥有”内存的整个想法非常奇怪。我不认为Linux内核本身甚至跟踪哪个CPU核心触及哪个页面最后,它肯定不会跟踪哪个CPU核心触及哪个高速缓存行。 (跟踪会消耗太多RAM,并且基本上没有任何好处。)
有分布式内核(至少是Linux内核的补丁)和其他一些方法,用于构建一个集群,其中内存和CPU分布在多个物理机器上,但对于进程来说似乎是统一的 - 就像他们在一台物理机器上运行。在这种情况下,可以查询管理端以找出哪个物理节点拥有哪些CPU和哪些内存页。如果这是您的情况,您将需要详细描述您正在使用的内核和工具,因为管理工具各不相同。
答案 1 :(得分:1)
您可以使用move_pages()
或numa_tonode_memory()
设置所有权。