Выделение центрального процессора Mac OS X

Я читал исходный код для расширения ядра драйвера конкретного экземпляра (MSR), который поставляется с монитором производительности Intel Performance Counter (http://software.intel.com/en-us/articles/intel-performance-counter-monitor-a-better-way-to-measure-cpu-utilization). Поскольку независимые копии счетчиков MSR/производительности хранятся на разных ЦП, необходимо указать, с какого 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 **** cpu = cpu_number();
 if(data->cpu_num == cpu)
 {
 data->value = RDMSR(data->msr_num);
 }
}

Мой вопрос: выключает прерывания (через mp_rendezvous_no_intrs делает это) достаточно, чтобы поток, выполняющий функцию cpuReadMSR, оставался на одном CPU все время? Если это не так, я беспокоюсь о следующем сценарии сбоя:

  • Процессор считывает свой числовой идентификатор с помощью cpu_number(), решает, что он является правильным CPU и начинает читать MSR.
  • Этот поток выгружается планировщиком и перемещается в другой процессор.
  • MSR считывается, но теперь считывается из другого ЦП, что дает неправильное значение.
1 ответ

Отключение прерываний отключает ВСЕ прерывания, а не только некоторые из них. Это включает в себя прерывание таймера, которое обычно позволяет выгрузить выполняемый поток.

В то время как прерывания отключены, ничто (что-то вроде сумасшедшего, как исключение процессора) может прерывать выполнение вашего кода, начиная с конца, на одном CPU.

licensed under cc by-sa 3.0 with attribution.