我正在为 linux 构建一个用户模式的 NUMA 感知内存分配器。分配器在初始化期间会获取一大块内存,每个 NUMA 节点一个块。在此之后,通过从大块池中提供尽可能多的内存页面来满足用户请求的内存页面。
如果用户要求 n 页,则很容易从特定块中给出 n 页。但是现在我想实现一个交错分配策略,用户从每个块中获取一个页面,循环最多 n 个页面。这带来了这些页面的虚拟地址不再连续的问题。
Q1:有没有办法返回虚拟可寻址的连续内存?我能想到的唯一解决方案是使用知道如何从一页跳转到另一页的“智能”指针。
我走这条路的原因之一是我对循环策略不严格(确定性)的 linux 的 MPOL_INTERLEAVE 内存分配策略不满意。
Q2:是否有一种廉价的方法可以知道给定的虚拟地址范围映射到哪个页面和 NUMA 节点?更准确地说,我不知道如何通过阅读 /proc/< proc_id >/numa_maps 获得细粒度的页面级信息。
谢谢您的回答。