我正在为linux构建一个用户模式的NUMA感知内存分配器。初始化期间的分配器会占用大块内存,每个NUMA节点一个块。在此之后,通过从大块池中提供尽可能多的内存页面来满足用户请求的内存页面。
如果用户要求n个页面,则很容易从特定块中提供n个页面。但是现在我想实现一个交错分配策略,其中用户从每个块获取一个页面,循环最多n个页面。这引起了这些页面的虚拟地址不再是连续的问题。
Q1:有没有办法返回几乎可寻址的连续内存?我能想到的唯一解决方案是使用一个知道如何从一个页面跳到另一个页面的“智能”指针。
我走这条路的原因之一是我对linux的MPOL_INTERLEAVE内存分配策略不满意,因为它的循环策略不严格(确定性)。
Q2:是否有一种廉价的方法可以知道给定虚拟地址范围映射到哪个页面和NUMA节点?更准确地说,我不知道如何从read / proc /<中获取细粒度的页面级信息。 proc_id> / numa_maps。
感谢您的回答。
答案 0 :(得分:0)
A1。 几乎连续的内存并不意味着物理内存是连续的。在linux中,物理页面在malloc期间不绑定到虚拟页面,而是在第一页错误期间绑定。
如果您真的想要,您应该能够对页面进行预先故障以将它们绑定到特定的numa节点,以便使用默认分配策略创建严格的交错。
e.g。
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
中的<numaif.h>
来确定虚拟地址的numa节点
并将NULL作为目标节点传递。当前节点位置将处于状态返回值。
e.g。
int status[1];
move_pages(0, 1, &ptr_to_check, NULL, status, 0);