Nowe posty

Autor Wątek: Procesy czasu rzeczywistego  (Przeczytany 4911 razy)

mircan

  • Gość
Procesy czasu rzeczywistego
« dnia: 2009-12-02, 22:50:49 »
Witam,

Mam następujące problem a właściwie pytanie:
1. uruchamiam dwa okna basha
2. w jednym z nich uruchamiam skrypt test1 o następującej treści:
#!/bin/sh

counter=0;
while true; do
counter=`expr $counter + 1`;
sleep 0.2;
echo "$counter";
done
Skrypt ten wypisuje na ekranie kolejne liczby całkowite 5 razy na sekundę.
3. następnie uruchamiam w drugim oknie basha (jako root) poleceniem
chrt -rr 99 ./test2
skrypt test2 o tresci:
#!/bin/sh

(sleep 15; kill -9 $$) &

while true; do
true;
done
Przez 15 sekund skrypt test2 jest procesem czasu rzeczywistego o najwyższym priorytecie. Skrypt nie wykonuje żadnych wywołań systemowych (jeśli się nie mylę). Dlaczego więc w trakcie działania skryptu test2 skrypt test1 jest w stanie wypisać kilkukrotnie na ekran liczby (choć oczywiście z opóźnieniem). Czy proces test2 nie powinien zawłaszczyć procesora na 15 sekund w 100%?

ra-v

  • Gość
Procesy czasu rzeczywistego
« Odpowiedź #1 dnia: 2009-12-02, 22:56:40 »
Cytat: mircan
Witam,
Dlaczego więc w trakcie działania skryptu test2 skrypt test1 jest w stanie wypisać kilkukrotnie na ekran liczby (choć oczywiście z opóźnieniem). Czy proces test2 nie powinien zawłaszczyć procesora na 15 sekund w 100%?
Może działa jak nice z najwyższym priorytetem. Gdyby uzyskał prawdziwy realtime system prawdopodobnie by się zwiesił - skrypt miałby większy priorytet niż przerwania, dyski, grafika...


PS. Zmień priorytet na Czas rzeczywisty w Windowsie. Miłego resetu:)

micu

  • Gość
Procesy czasu rzeczywistego
« Odpowiedź #2 dnia: 2009-12-03, 11:56:07 »
Hej,

Nie wiem czy nie jest to spowodowane pewnymi ustawieniami/optymalizacjami  które nowe kernele (2.6) mają dla desktopów ("low latency" itp). Zapewne to co oferują to nie jest pełny "realtime".
Spróbuj może skompilować kernel do testów bez "desktopowych" ustawień i zaaplikować mu łatki typu -rt ...

Pozdrawiam
Micu

mircan

  • Gość
Procesy czasu rzeczywistego
« Odpowiedź #3 dnia: 2009-12-03, 20:48:11 »
Pewnie masz rację, micu. Pobawię się opcjami kompilacji i napiszę tu jeśli do czegoś dojdę.

arctgx

  • Gość
Procesy czasu rzeczywistego
« Odpowiedź #4 dnia: 2009-12-03, 22:48:14 »
Dodam tylko, że pewne opcje wywłaszczania zadań z kolejki (niech mnie ktoś wyręczy w lepszym ujęciu słowem), np. realtime, dostępne są dopiero po użyciu łat.

Jeden z przykładów:
http://www.kernel.org/pub/linux/kernel/projects/rt/

mircan

  • Gość
Procesy czasu rzeczywistego
« Odpowiedź #5 dnia: 2010-02-12, 14:22:48 »
Znalazłem odpowiedź na swoje pytanie. Piszę tu na wypadek gdyby kogoś to zainteresowało. Jak się przekonałem w kernelach sprzed wprowadzenia schedulera CFS wszystko działa tak jak "powinno". Opisywany w tym wątku problem dotyczy jedynie schedulera CFS. Rozwiązanie jest proste. W CFS pojawiły się dwie dodatkowe opcje: sched_rt_runtime_us oraz sched_rt_period_us. Pierwsza określa maksymalny czas jaki mogą "zająć" w sposób ciągły (wszystkie) procesy czasu rzeczywistego. Po upłynięciu tego okresu jądro wywłaszcza te procesy i odczekuje okres czasu określony przez drugą opcję zanim którykolwiek z procesów czasu rzeczywistego może być uruchomiony ponownie. Domyślnie są ustawione odpowiednio na 0,95 s i 1 s. To jest powodem dla którego proces "normalny" może zostać uruchomiony kosztem procesu czasu rzeczywistego. Aby do tego nie dopuścić nie trzeba dokonywać kompilacji jądra - opcje te można zmieniać dynamicznie. Aby procesy czasu rzeczywistego nie były zawieszane na rzecz "zwykłych" procesów wystarczy wykonać polecenie (jako root):
sysctl -w kernel/sched_rt_runtime_us=-1