2015-07-04 61 views
8

Przeprowadzam różne eksperymenty z pudełkiem Ubuntu z jądrem 3.5.7. I warmup mój kod testowy do 10 milionów iteracji, a następnie przejść do czasu 90 milionów iteracji. Nadal widzę następujący jitter:Czy można wyeliminować jitter z komputera z systemem Linux podczas uruchamiania prostego programu C++ o pojedynczym wątku?

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** <=== 

Widzę złe czasy na 0,01% moich iteracji. Czy jest możliwe, aby jądro Linuksa działało naprawdę w czasie rzeczywistym? Czy w jądrze dzieje się coś innego, czego nie mogę kontrolować?

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. 
} 

Odpowiedz

6

Krótka odpowiedź brzmi: nie. Musiałbyś wyrzucić wszystko inne, co zapewnia jądro, aby twój kod uzyskał 100% cykl pracy.

Jeśli chcesz mieć gwarantowany monopol na procesor, musisz użyć systemu operacyjnego czasu rzeczywistego, który umożliwia wyłączenie wszystkich przerwań. Coś jak FreeRTOS lub VXWorks.

Jądro bez tikseli jest zaprojektowane do oszczędzania energii, gdy jest w stanie bezczynności. Nie jest przeznaczony do całkowitego wyłączania przerwań. Wszystkie urządzenia IO nieustannie wymagają przerwań. Jeśli wyłączysz wszystkie sterowniki IO i uruchomisz funkcję bez tupetu i wyłączysz wszystkie usługi, które mogą się okresowo obudzić, możesz zbliżyć się do operacji wolnej od drgań. Ale wtedy będziesz miał cegłę.