2011-12-21 8 views
2

私は、Linux用のユーザモードのNUMA対応メモリアロケータを構築しています。その初期化中のアロケータは、NUMAノードごとに1つのチャンクという大きなチャンクを取得します。この後、大きなチャンクプールから多くのメモリページを与えることによって、ユーザによって要求されたメモリページが満たされる。ユーザモードのNUMA対応メモリアロケータでインターリーブドページアロケーションを実装する方法は?

ユーザがnページを要求すると、特定のチャンクからnページを簡単に与えることができます。しかし今、インターリーブド・アロケーション・ポリシーを実装したいと考えています。ここで、ユーザーは各チャンクから1ページを取得し、nページまでラウンドロビンします。これは、これらのページの仮想アドレスがもはや連続していないという問題を引き起こす。

質問:仮想アドレス可能な連続メモリを返す方法はありますか?私が考えることができる唯一の解決策は、あるページから別のページにジャンプする方法を知っている "スマート"ポインタを使用することです。

私はこの道を歩いていた理由の一つは、私がそのラウンドロビンポリシー(決定)厳密ではないのlinuxのMPOL_INTERLEAVEメモリ割り当てポリシーに満足していないということです。

質問2:指定された仮想アドレス範囲にマップされているページとNUMAノードを安価に知る方法はありますか?もっと正確には、読み込み/ proc/< proc_id>/numa_mapsからきめ細かなページレベルの情報を取得する方法はありません。

ありがとうございました。

答えて

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から<numaif.h> までの仮想アドレスのnumaノードを決定し、ターゲットノードにNULLを渡すことができます。現在のノードの位置は、ステータスの戻り値になります。

int status[1]; 
move_pages(0, 1, &ptr_to_check, NULL, status, 0); 
関連する問題