2

我正在为 linux 构建一个用户模式的 NUMA 感知内存分配器。分配器在初始化期间会获取一大块内存,每个 NUMA 节点一个块。在此之后,通过从大块池中提供尽可能多的内存页面来满足用户请求的内存页面。

如果用户要求 n 页,则很容易从特定块中给出 n 页。但是现在我想实现一个交错分配策略,用户从每个块中获取一个页面,循环最多 n 个页面。这带来了这些页面的虚拟地址不再连续的问题。

Q1:有没有办法返回虚拟可寻址的连续内存?我能想到的唯一解决方案是使用知道如何从一页跳转到另一页的“智能”指针。

我走这条路的原因之一是我对循环策略不严格(确定性)的 linux 的 MPOL_INTERLEAVE 内存分配策略不满意。

Q2:是否有一种廉价的方法可以知道给定的虚拟地址范围映射到哪个页面和 NUMA 节点?更准确地说,我不知道如何通过阅读 /proc/< proc_id >/numa_maps 获得细粒度的页面级信息。

谢谢您的回答。

4

1 回答 1

0

A1。虚拟连续内存并不意味着物理内存是连续的。在 linux 中,物理页面在 malloc 期间不绑定到虚拟页面,而是在第一个页面错误期间绑定。

如果您真的想这样做,您应该能够预先故障页面以将它们绑定到特定的 numa 节点,以便使用默认分配策略创建严格的交错。

例如

N - # numa nodes
PAGES - # pages in allocation

for(i=0; i < N; i++):
   pin current thread to node i
   for(p=i; p < PAGES; p += N)
      touch page p;

设置完成后,您可以输出预先交错的连续页面。

Q2。move_pages您可以通过使用from<numaif.h> 并将 NULL 作为目标节点来确定虚拟地址的 numa节点。当前节点位置将在状态返回值中。

例如

int status[1];
move_pages(0, 1, &ptr_to_check,  NULL, status, 0);
于 2012-11-26T08:33:56.033 回答