Linux用のユーザーモードNUMA対応メモリアロケータを構築しています。初期化中のアロケータは、NUMA ノードごとに 1 つのチャンクである大量のメモリ チャンクを取得します。この後、ユーザーが要求したメモリー・ページは、ラージ・チャンク・プールからできるだけ多くのメモリー・ページを提供することで満たされます。
ユーザーが n ページを要求した場合、特定のチャンクから n ページを提供するのは簡単です。しかし今は、インターリーブ割り当てポリシーを実装したいと考えています。このポリシーでは、ユーザーは各チャンクから 1 ページをラウンドロビン方式で最大 n ページ取得します。これにより、これらのページの仮想アドレスが連続しなくなるという問題が発生します。
Q1: 仮想的にアドレス可能な連続メモリを返す方法はありますか? 私が考えることができる唯一の解決策は、あるページから別のページにジャンプする方法を知っている「スマート」ポインターを使用することです。
私がこの道を歩んでいる理由の 1 つは、ラウンドロビン ポリシーが厳密ではない (決定論的) Linux の MPOL_INTERLEAVE メモリ割り当てポリシーに満足できないことです。
Q2: 特定の仮想アドレス範囲がどのページと NUMA ノードにマップされているかを安価に知る方法はありますか? より正確には、 /proc/< proc_id >/numa_maps を読み取ってページレベルの詳細な情報を取得する方法がわかりません。
回答ありがとうございます。