3

Intel パフォーマンス カウンター モニター ( http://software.intel.com/en-us/articles/intel-performance-counter-monitorに同梱されているモデル固有のレジスター (MSR) ドライバー カーネル拡張機能のソース コードを読んでいました。-a-better-way-to-measure-cpu-utilization )。MSR/パフォーマンス カウンターの独立したコピーが異なる CPU に格納されるため、どの CPU から読み取るかを指定する必要があります。これは、mp_rendezvous_no_intrs関数を呼び出すことによって行われます。

mp_rendezvous_no_intrs(cpuReadMSR, (void*)idatas);

これにより、各プロセッサは正しいプロセッサ番号であるかどうかをチェックし、正しい場合は MSR からデータを読み取ります。

void cpuReadMSR(void* pIData){
    pcm_msr_data_t* data = (pcm_msr_data_t*)pIData;
    volatile uint cpu = cpu_number();
    if(data->cpu_num == cpu)
    {
        data->value = RDMSR(data->msr_num);
    }
}

私の質問は、cpuReadMSR関数を実行しているスレッドがずっと同じCPUにとどまるようにするのに十分な割り込みをオフにしていますか?そうでない場合は、次の障害シナリオが心配です。

  1. cpu は cpu_number() で数値 ID を読み取り、正しい CPU であると判断し、MSR の読み取りを開始します。
  2. スレッドはスケジューラによって横取りされ、別の CPU に移動されます。
  3. MSR は読み取られますが、現在は別の CPU から読み取られているため、間違った値が返されます。
4

1 に答える 1