スレッドによってアクセスされるデータに基づくスケジューリング オプションを探しています。特定のスレッドがアクセスするキャッシュのページを見つける方法はありますか。2 つの異なるプロセスからの 2 つのスレッドがある場合、両方のスレッドによってアクセスされる共通のデータ/ページを見つけることは可能ですか?
1 に答える
同じプロセスの 2 つのスレッドが、プロセスのメモリ空間全体を共有している可能性があります。プログラムがメモリの特定の領域へのアクセスをスレッドに制限していない場合、どのスレッドをどの CPU に割り当てる必要があるかを正確に知るのが難しい場合があります。
スレッドが増えると、スレッドが異なるデータをいくつかの異なるスレッドと共有し、関係のネットワークを作成する可能性があるため、問題はより困難になります。2 つのスレッド間の関係が特定の CPU コアへのアフィニティを義務付けている場合、推移性により、それらの関係ネットワークのすべてのスレッドも同じコアにバインドする必要があります。おそらく、関係の数、または何らかの形式のクラスタリング分析 (相互接続性) が役立つでしょう。
特定の質問に関して、2 つのスレッドがデータを共有しているが、異なるプロセスからのものである場合、これらのプロセスは、shm_open
(共有メモリ セグメントを作成する) およびmmap
(そのセグメントをプロセス メモリにマップする) を使用して、これらのページを自発的に共有する必要があります。それ以外の場合、プロセス間でデータ ページを共有することはできません。ただし、OS が fork されたプロセスに使用するコピー オン ライト メカニズムを暗黙のうちに (再び) 例外とします。この場合、1 つのプロセスが書き込みを行うまで、各ページは共有されたままになります。
ページの明示的な共有 ( by shm_open
) を使用して、両方のスレッドに同じ CPU アフィニティをプログラムで定義することができます。おそらく、両方のプログラムで関連するスレッドを最初のコアに関連付ける慣例によって、または共有メモリ オブジェクト (たとえば、メモリ セグメントの最初のバイトは、それにアクセスする最初のスレッドによって、選択された CPU 番号 + 1 に設定される可能性があります。0 はまだアフィニティがないことを意味します)。
残念ながら、posix スレッド API には、スレッドの CPU アフィニティを設定する方法がありません。Linux プラットフォームpthread_attr_setaffinity_np
で提供される移植性のない拡張cpuset
機能を使用して、スレッド アフィニティを構成する関数のファミリを使用できます。
参照: