0

10 ~ 20 GB の巨大な配列を割り当てる必要がある Linux マシンで C プログラムを作成しています。

スペースを割り当てた後、どのコアがそのアレイのどのページを所有しているかを知りたいです。「所有」とは、どのコアがどのページの一貫性を担っているかを意味します。

この情報を取得する関数またはシェル コマンドはありますか?

注: gcc4.7 で Debian を使用しています。

4

2 に答える 2

2

メモリを割り当てる場合、通常、カーネルは仮想メモリのみを割り当てます。コンテンツ (RAM ページ) は、最初のアクセス時にのみ読み込まれます。また、ファイル (ファイルにバックアップされたメモリ マップ) またはスワップ (他のすべてのメモリ) に追い出された場合、それらは追い出された後の次のアクセスで再設定されます。これは、プロセスによって割り当てられたメモリの各ページが存在しないか (慣例により、最初のアクセスでゼロとして読み取られる)、RAM にあるか、(ディスクまたはその他の非 RAM ストレージ メディアに) 削除される可能性があることを意味します。

標準的なマルチコア/マルチ CPU マシンでは、「所有権」はキャッシュ ライン ベースで決定されます。キャッシュ ラインは、通常、16 ~ 256 バイトの小さな 2 の累乗です。各 CPU は、最後にアクセスしたキャッシュ ラインを「所有」します。プロセスが実行されると、コードを実行し、コードにアクセスする CPU とコアが変化するため、固定の「所有者」は存在しません。動的に変化します。さらに、管理は通常、CPU によって実行されるコードではなく、特定のチップ、メモリ管理ユニット、または MMU によって行われます。(MMU は現在、多くの場合、CPU に統合されています。) 特定の CPU コアまたはコアでのみ実行するようにプロセスを固定し、その推測に基づいて実行できます。どの CPU コアがどのメモリを所有しているか。また、一部の MMU には、どのキャッシュラインがどの CPU コアに割り当てられたかを報告する方法があると思いますが、実際に実行できるかどうかは真剣に疑っています。

CPUコアがメモリを「所有」するという全体的な考え方は、非常に奇妙です。Linux カーネル自体は、どの CPU コアが最後にどのページにアクセスしたかを追跡することさえないと思います。どの CPU コアが最後にどのキャッシュラインにアクセスしたかは確かに追跡しません。(トラッキングは RAM を大量に消費し、基本的に何のメリットもありません。)

分散カーネル (少なくとも Linux カーネルへのパッチ) や、メモリと CPU が複数の物理マシンに分散されたクラスターを構築するためのいくつかの方法がありますが、それらが実行されているかのようにプロセスに対して均一に見えます。単一の物理マシン上。このような場合、管理側にクエリを実行して、どの物理ノードがどの CPU とどのメモリ ページを所有しているかを調べることができます。その場合は、使用しているカーネルとツールを詳細に説明する必要があります。管理ツールはさまざまです。

于 2012-09-14T00:57:42.637 に答える
1

move_pages()またはを使用して所有権を設定できますnuma_tonode_memory()

于 2012-09-14T01:42:39.553 に答える