2015-07-04 4 views
8

Я выполняю различные эксперименты с ядром Ubuntu, работающим под управлением ядра 3.5.7. I разогрев мой тестовый код до 10 миллионов итераций, а затем перейдите к времени 90 миллионов итераций. Тем не менее я вижу следующий джиттер:Возможно ли устранить дрожание от машины Linux при запуске простой однопоточной программы на C++?

Average: 242 nanos | Min Time: 230 nanos | Max Time: 4717 nanos 
0.75 = avg: 240, max: 246 
0.9 = avg: 241, max: 247 
0.99 = avg: 242, max: 250 
0.999 = avg: 242, max: 251 
0.9999 = avg: 242, max: 517 
0.99999 = avg: 242, max: **2109** <=== 
0.999999 = avg: 242, max: **3724** <=== 
0.9999999 = avg: 242, max: **4424** <=== 

Я вижу плохие времена на 0.01% моих итераций. Можно ли сделать ядро ​​Linux действительно в режиме реального времени? Есть ли что-то еще в ядре, которое я не могу контролировать?

for(int i = 0; i < iterations; i++) { 

    long start = get_nano_ts(&ts); 

    for(int j = 0; j < load; j++) { 
     long p = (i % 8) * (i % 16); 
     if (i % 2 == 0) { 
      x += p; 
     } else { 
      x -= p; 
     } 
    } 

    long end = get_nano_ts(&ts); 

    int res = end - start; 

    // store the results, calculate the percentiles, averages, min, max, etc. 
} 

ответ

6

Короткий ответ: нет. Вам придется выбросить все остальное, что обеспечивает ядро, чтобы гарантировать, что ваш код получает 100% -ный рабочий цикл.

Если вы хотите получить гарантированную монополию на CPU, вам необходимо использовать операционную систему реального времени, которая позволяет отключить все прерывания. Что-то вроде FreeRTOS или VXWorks.

Бесшумное ядро ​​предназначено для экономии энергии при простоях. Он не предназначен для полного отключения прерываний. Все устройства ввода-вывода постоянно требуют прерываний. Если вы отключили все драйверы ввода-вывода и бежали без ограничений и отключили все службы, которые могут периодически просыпаться, вы можете приблизиться к работе без дрожания. Но тогда у вас будет кирпич.

 Смежные вопросы

  • Нет связанных вопросов^_^