Linux a czas rzeczywisty
Wprowadzenie do systemów RT:

RTLinux:

KURT Linux:

Slajdy:

Linux a czas rzeczywisty

System Linux był tak projektowany, aby zapewnić dobrą średnia wydajność wszystkich aplikacji. Już do jądra w wersji 2.0 zostały dodane nowe kolejki szeregowania procesów algorytmami zgodnymi POSIX 1003.1b . Dokładnie dodano dwa nowe tryby szeregowania SCHED_FIFO i SCHED_RR. Procesy w tym trybie mają priorytet przed zwykłymi zadaniami SCHED_OTHER przy przydzielaniu procesora.

Dzięki temu Linux nadaje się do wykonywania zadań czasu rzeczywistego, ale tylko o charakterze miękkim. Następujące elementy projektu i implementacji sprawiają, że Linux nie jest twardym systemem czasu rzeczywistego:

  • algorytm szeregowania z podziałem czasu
  • niska rozdzielczość zegara systemowego
  • niewywłaszczalność wywołań systemowych
  • mechanizm pamięci wirtualnej
  • dążenie do optymalnego wykorzystania zasobów
  • wyłączanie przerwań sprzętowych w sekcjach krytycznych jądra

Algorytm szeregowania

Większość planistów (ang. schedulers) systemów unixowych (w tym Linux) przyjmuje za podstawowy cel takie zarządzanie procesami, aby sprawiedliwie rozdzielić pomiędzy nie dysponowany czas pracy procesora. W efekcie wykonanie programu zależy od obciążenia systemu i zachowania innych procesów.

Zegar systemowy

Zegar systemowy linuksa tyka standardowo z częstotliwością 100 Hz. Dla niektórych procesów czasu rzeczywistego może być to zbyt rzadko (o czym przekonamy się w dalszej części prezentacji). Zwiększenie szybkości zegara sprawiłby, iż wzrósłby koszt wybierania procesu do uruchomienia, oraz przełączania kontekstu.

Wywołania systemowe

Jądro systemu Linux zostało tak zaprojektowane, że proces wykonujący się w trybie jądra nie może być wywłaszczony. Zatem jeśli jakiś proces wejdzie do trybu uprzywilejowanego, będzie działał dopóki wywołanie systemowe się nie zakończy lub nie zablokuje. Jeśli w tym czasie proces o wyższym priorytecie zmieni stan na gotowy, będzie zmuszony oczekiwać na zakończenie wywołania. Jest to oczywiście sytuacja nie do zaakceptowania dla procesów czasu rzeczywistego. Nie mniej jednak w sposób znaczący upraszcza implementacja, gdyż nie musimy przejmować się wielowejściowością (ang. reentrant).

Pamięć wirtualna

Mechanizm pamięci wirtualnej jest obecnie stosowany w praktycznie wszystkich systemach operacyjnych. Umożliwia on uruchomienie wielu procesów, nawet wtedy, gdy ilość pamięci, jaka była by do tego potrzebna jest większa niż ilość pamięci operacyjnej dostępnej w komputerze. Niestety mechanizm ten może generować nieprzewidywalne opróżnienia w dostępie do pamięci, jest to oczywiście niedopuszczalne dla procesów czasu rzeczywistego.

Optymalne wykorzystanie zasobów

Jądro systemu optymalizuje proces dostępu do zasobów sprzętowych. Dobrym przykładem jest szeregowanie żądań operacji dyskowych. Może się bowiem zdarzyć, że proces o niższym priorytecie będzie obsłużony szybciej, ponieważ do zrealizowania jego żądania wymagane będzie mniejsze przesunięcie głowić. Jak wiadomo operacja pozycjonowania głowic jest jedną z najbardziej czasochłonnych operacji wykonywanych przez dyski. W ten sposób powstają kolejne nieprzewidywalne opróżnienia.

Przerwania sprzętowe

Bardzo często w trakcie wykonywania sekcji krytycznych wyłączana jest obsługa przerwań sprzętowych. Takie podejście często jest sprawniejsza niż semafory, lub inne techniki wzajemnego wykluczania. Jednak wyłączenie przerwań sprawia, iż nie jesteśmy w stanie natychmiast reagować na zdarzenia zewnętrzne, co wprowadza niepożądane opróżnienia w ich obsłudze.