ZALICZENIE: 31.03.2026 · 16:15
materiały do zaliczenia

Systemy Operacyjne
Czasu Rzeczywistego

Dostaniesz 2 z 3 pytań. Wszystkie trzy są poniżej. Skup się na architekturze jądra i QNX — to filary tego przedmiotu.

Dodatkowe

PYTANIE 01 / 03
Mikrojądra – cechy, priorytety, wady
Mikrojądra procesów – cechy charakterystyczne, priorytety, negatywne aspekty
Czym jest jądro (kernel)?
Jądro to oprogramowanie tworzące warstwę między sprzętem a systemem operacyjnym. Jest pierwszym programem ładowanym przy starcie. Zarządza zasobami pamięci, wszystkimi procesami/zadaniami, dostępem do zasobów oraz procesorem.
Mikrojądro – definicja i zasada działania
Mikrojądro to minimalistyczne jądro, które ogranicza się do absolutnego minimum: planowanie zadań, komunikacja między procesami (IPC), obsługa przerwań, zarządzanie pamięcią. Wszystkie pozostałe usługi (sterowniki, system plików, TCP/IP) działają jako odizolowane procesy w przestrzeni użytkownika.
Mikrojądro QNX Neutrino: ~10 kB. Jądro monolityczne Linux: >700 kB. Proporcja ~70:1.
Co robi mikrojądro? (tylko 4 funkcje)
funkcja 1
Szeregowanie zadań
Decyduje, który proces/wątek dostaje procesor i kiedy. Zarządza kolejkami priorytetów.
funkcja 2
Komunikacja IPC
Mechanizm przekazywania komunikatów między odizolowanymi procesami. Podstawa całej architektury.
funkcja 3
Obsługa przerwań
Przechwytuje przerwania sprzętowe i kieruje je do odpowiednich procesów obsługujących.
funkcja 4
Zarządzanie pamięcią
Chroni przestrzenie adresowe procesów przez MMU. Każdy moduł = własna chroniona przestrzeń.
Priorytety w mikrojądrze (na przykładzie QNX)
Mikrojądro QNX udostępnia 32 poziomy priorytetów (0–31), gdzie 31 = najwyższy.
Dla programów użytkownika dostępne są wartości 0–19. Poziomy 20–31 zarezerwowane dla systemu.

Procesy na tym samym poziomie priorytetu szeregowane są wg jednego z trzech algorytmów:
FIFO
First In, First Out
Najdłużej czekający gotowy proces dostaje procesor. Wykonuje się aż do zakończenia, zawieszenia lub wywłaszczenia przez wyższy priorytet.
Round-Robin (karuzelowy)
Kwant czasu = 50 ms
Procesy kolejno dostają kwant czasu. Po wyczerpaniu → wywłaszczenie, następny w kolejce. Sprawiedliwy podział.
Adaptacyjny
Adaptive Scheduling
Algorytm znany z UNIX-a. Jeśli zadanie zużyje cały kwant bez blokowania, jego priorytet jest tymczasowo dekrementowany. Po wejściu w stan blokowania — priorytet przywrócony. Zapobiega głodzeniu zadań interaktywnych.
Zalety mikrojądra
  • Niezawodność — awaria sterownika nie zawiesza całego systemu; jądro może automatycznie zrestartować wadliwy moduł
  • Pełna izolacja — każdy komponent w własnej chronionej przestrzeni adresowej (MMU)
  • Bezpieczeństwo — błąd w jednym module nie wpływa na resztę systemu
  • Rozszerzalność — dodawanie/usuwanie usług bez rekompilacji całego jądra
  • Przenaszalność — łatwiejsze przenoszenie na różne platformy sprzętowe
  • Możliwość szybkiej rekonfiguracji — modułowa budowa
Wady mikrojądra (negatywne aspekty)
  • Wolniejsze wykonanie — każda wymiana danych między modułami wymaga przesłania komunikatu (IPC) + kopii danych między przestrzeniami adresowymi + zmiany kontekstu procesora
  • Narzut komunikacyjny — wysłaniu komunikatu towarzyszy kopiowanie danych i zmiana kontekstu procesora (context switch)
  • Słabsza wydajność pakietowa — protokoły sieciowe (TCP/IP) działają poza jądrem → mniejsza przepustowość niż w monolitycznym (dotyczy np. routerów)
  • Klasa zastosowań limitowana — systemy wymagające ekstremalnej przepustowości sieciowej (firewalle, routery) mogą działać wolniej
Dlaczego QNX nie nadaje się do wszystkiego? Architektura mikrojądra powoduje utratę wydajności przez przekazywanie komunikatów. Dla routerów i firewalli stosuje się raczej systemy monolityczne.
PYTANIE 02 / 03
Porównanie typów jąder
Porównanie jąder – monolityczne vs mikrojądro – różnice, zalety, wady
Trzy modele jądra systemu operacyjnego
Monolityczne
np. Linux, Unix, RTEMS
Jądro, sterowniki, aplikacje — jedna wspólna przestrzeń adresowa. Moduły komunikują się bezpośrednio przez wywołania funkcji.
Najwyższa wydajność obliczeniowa — brak przełączania kontekstu między modułami
Błąd dowolnego komponentu → Kernel Panic = całkowite unieruchomienie systemu
Nowa funkcja = rekompilacja całego jądra
Mikrojądro
np. QNX Neutrino, Mach
Jądro minimalne (~10 kB). Sterowniki = odizolowane procesy w przestrzeni użytkownika
Błąd sterownika → restart tylko tego procesu, system działa dalej
Idealne dla RTOS — gwarancja niezawodności
Wolniejsze — narzut IPC (kopiowanie danych + zmiana kontekstu przy każdej operacji)
Hybrydowe
np. Windows NT/10/11, macOS, RT-Linux
Mikrojądro jako baza + krytyczne czasowo usługi (grafika, sieć) ładowane do przestrzeni jądra
Łączy stabilność mikrojądra z wydajnością monolitycznego
Skomplikowana budowa. Usługa w jądrze → ryzyko awarii całego systemu
Szczegółowe porównanie – 7 wymiarów
Cecha Monolityczne Mikrojądro
Przestrzeń adresowa Jedna wspólna — jądro + sterowniki + aplikacje razem Oddzielna dla każdego komponentu — chroniona przez MMU
Szybkość ✓ Szybsze — wszystko w jednej przestrzeni, zero kopiowania ✗ Wolniejsze — każda operacja = komunikat między przestrzeniami
Stabilność ✗ Błąd w sterowniku = crash całego systemu ✓ Błąd w sterowniku izolowany — system działa dalej, jądro może zrestartować moduł
Komunikacja IPC Sygnały i gniazda (sockets) Kolejki komunikatów (message passing)
Rozszerzalność ✗ Nowa funkcja = rekompilacja całego jądra ✓ Nowa usługa = nowy izolowany proces, bez rekompilacji jądra
Debugowanie ✗ Trudne — awaria w przestrzeni jądra może uszkodzić debugger ✓ Łatwiejsze — komponenty odseparowane
Bezpieczeństwo ✗ Cały kod w jądrze → większe ryzyko awarii ✓ Podział na strefy — błąd jednej usługi nie kompromituje innych
Rozmiar jądra Duże (Linux: kilkadziesiąt MB) Małe (QNX Neutrino: ~10 kB)
Przykłady systemów Linux, Unix, RTEMS, VxWorks (częściowo) QNX, Mach, L4, MINIX
Architektura z ochroną pamięci – 3 poziomy
1
Architektura słabych SCR – brak ochrony pamięci
Sterowniki, protokoły i aplikacje w jednej niechronionej przestrzeni jądra. Błąd dowolnego elementu → crash całości. Stosowane w prostych, dedykowanych systemach wbudowanych.
2
Architektura monolityczna – ograniczona ochrona
Wydzielona przestrzeń użytkownika dla aplikacji. Ale sterowniki nadal w przestrzeni jądra. Błąd sterownika → crash jądra → crash całego systemu. Błąd aplikacji → tylko aplikacja pada, system działa.
3
Architektura mikrojądra (QNX) – zaawansowana ochrona
Każdy komponent (sterowniki, TCP/IP, system plików) w własnej chronionej przestrzeni adresowej. Błąd sterownika → system wydziedzicza proces, zwalnia pamięć, reszta działa normalnie. Jądro może automatycznie zrestartować wadliwy moduł.
Podsumowanie – kiedy co stosować?
Monolityczne → użyj gdy:
Potrzebujesz maksymalnej wydajności i przepustowości. Systemy gdzie szybkość ważniejsza niż odporność na awarie. Routery, firewalle, serwery sieciowe, systemy hardRT gdzie liczy się każda mikrosekunda.
Mikrojądro → użyj gdy:
Potrzebujesz niezawodności i bezpieczeństwa. Systemy krytyczne gdzie awaria jest niedopuszczalna. Automatyka przemysłowa, medycyna, lotnictwo, automotive (ABS, airbag).
PYTANIE 03 / 03
Konkretne systemy SOCR
Konkretne systemy SOCR – QNX, VxWorks, OS-9, RT-Linux, iRMX – opis i porównanie
Duże systemy SOCR (3 najważniejsze)
QNX Neutrino
QNX Software Systems Ltd (Kanada) · od 1980 · Hard RTOS
mikrojądro
Architektura: 32-bitowe mikrojądro Neutrino (~10 kB). Jądro odpowiada tylko za 3 rzeczy: planowanie wątków, obsługę przerwań, komunikację IPC. Sterowniki, TCP/IP, system plików = odizolowane procesy w przestrzeni użytkownika.

Niezawodność: Awaria sterownika karty sieciowej nie powoduje „Blue Screena" ani Kernel Panic. Ubijany jest tylko ten jeden proces — system może go natychmiast zrestartować w tle. Reszta systemu działa normalnie.

Komunikacja (IPC / Message Passing): ponieważ moduły są odizolowane, komunikują się przez szybkie, synchroniczne wysyłanie i odbieranie pakietów danych (komunikatów). To podstawa całej architektury.

Zgodność z POSIX (ważne!): QNX jest w 100% zgodny z normami POSIX. Dla programisty QNX wygląda i zachowuje się jak standardowy Linux/UNIX. Umożliwia łatwe przenoszenie programów C/C++ na platformę czasu rzeczywistego.

Priorytety: 32 poziomy (0–31). Algorytmy: FIFO, Round-Robin (50ms), Adaptacyjny.

Zastosowania (konkretne przykłady!):
• Systemy pokładowe samochodów: Audi, BMW, Porsche (multimedialne i sterujące)
• Robotyka medyczna: chirurgiczne ramiona robotyczne
• Automatyka przemysłowa: ABB, WAT, MERA
• Sterowanie ruchem kolejowym

Wada: słabsza wydajność pakietowa — TCP/IP poza jądrem. Narzut IPC przy każdej operacji (kopiowanie danych + zmiana kontekstu).
VxWorks
Wind River Systems · od 1987
monolityczne
Pozycja rynkowa: >50% rynku aplikacji wbudowanych. Używany w ponad 350 miliardach urządzeń na świecie.

Cechy kluczowe:
• Nieograniczona liczba zadań, szybkie deterministyczne przełączanie
256 poziomów priorytetów
• Algorytm z wywłaszczaniem oparty na priorytetach + Round-Robin
• Dziedziczenie priorytetów (priority inheritance) — rozwiązanie inwersji priorytetów
• Semafory: binarne, całkowite, wzajemnego wykluczania

Szybkość (CPU MPC8260 @ 50 MHz): przełączanie kontekstu ~11 μs, reakcja na przerwanie ~98 μs

Zastosowania: rakiety wojskowe, centrale telefoniczne, sprzęt medyczny, NASA (Mars Pathfinder), ABS, bankomaty, sterowniki przemysłowe.
OS-9
Microware · modułowy system wielozadaniowy
modułowy
Kluczowa cecha: architektura modułowa pamięci — wszystkie programy w formie modułów. Moduły są position-independent (mogą być ładowane do dowolnego miejsca w pamięci) → ROM-owalność.

Moduł składa się z: NAGŁÓWKA (nazwa, rozmiar, typ, język, wymagania pamięciowe) + CIAŁA + CRC (suma kontrolna 3 bajty).

Szeregowanie: Round-Robin z możliwością zmiany na czysto priorytetowy. Mechanizm kolejkowania: prosta karuzela, próg priorytetu, wywłaszczanie priorytetowe, tryb pojedynczego procesu.

Pamięć: przydzielana dynamicznie przez jądro. Brak pamięci wirtualnej. Adresy bazowe + pośrednie adresowanie.

Zastosowania: telekomunikacja, przemysł. Zgodność z UNIX na poziomie C. Praca bezdyskowa (z ROM).
Inne systemy SOCR (mniejsze / historyczne)
RT-Linux
System hybrydowy
Małe jądro czasu rzeczywistego + nad nim jądro Linux. Zadania CR komunikują się z procesami Linux przez kolejki FIFO. Problem: monolityczna architektura → słaba skalowalność. Duże wymagania pamięciowe.
Zastosowania: NASA, sterowanie robotami, eksperymenty medyczne.
iRMX (Intel)
Intel Real-Time Multitasking Executive
Rodzina systemów dla procesorów Intel 8/16-bit. 7 modułów jądra, ok. 18 kB pamięci. Wersje: iRMX-80 (8-bit), iRMX-86 (16-bit, duże systemy), iRMX-88 (16-bit, mniejsze konfiguracje). Szeregowanie z wywłaszczaniem.
MicroC/OS-II (Micrium)
Prosty system wbudowany
Bardzo mały: 8–14 kB kodu, od 500B RAM. Do 256 procesów. Certyfikaty DO-178B Level A (lotnictwo, medycyna, instalacje nuklearne). Procesory 8–32 bit.
Windows CE (Microsoft)
32-bit, wielozadaniowy, Hard RT
Jądro działa w 1 MB pamięci. 256 poziomów priorytetów. Dziedziczenie priorytetów. Podstawowa jednostka = wątek. Przenośny między platformami sprzętowymi.
Tabela porównawcza 4 systemów (wyniki ocen)
Kryterium QNX Neutrino 6.2 WinCE .NET VxWorks AE 1.1 RedHat Linux
Wydajność7529
Instalacja i konfiguracja8543
Architektura (RTOS)9773
Narzędzia8888
Dokumentacja i wsparcie5427
Średni wynik8.06.44.46.9
Źródło: Dedicated Systems Experts, sierpień 2002. QNX wygrywa głównie dzięki architekturze RTOS i odporności na awarie.
DODATKOWE
Klasyfikacja systemów operacyjnych CR
Podział ze względu na sposób działania
Sterowane czasem
Time-driven
Działają w rytm przerwania zegarowego. Aplikacje inicjowane w określonych momentach. Nie podatne na przeciążenia zdarzeniami zewnętrznymi. Minimalna wariancja czasu odpowiedzi.

Zastosowanie: przemysł samochodowy i kolejowy. Podstawa systemów Hard Real-Time.
Sterowane zdarzeniami
Event-driven
Odbierają informacje o zdarzeniach asynchronicznie przez przerwania sprzętowe. Większa wariancja czasu odpowiedzi. Podatne na przeciążenia przy zbyt dużej liczbie aplikacji.

Zaleta: wygodne tworzenie aplikacji (podobne do systemów ogólnych).
Podział ze względu na sposób tworzenia aplikacji
Systemy skrośne
Cross-development
Służą wyłącznie do uruchamiania i symulacji. Brak interaktywnej pracy z systemem.
Systemy samodzielne
Self-hosted
Platforma do tworzenia aplikacji + narzędzia i środowisko pracy. Pełna samodzielność.
Architektura partycji – ochrona czasu procesora
W systemach CR ochronie podlega czas procesora. Realizuje się ją przez podział systemu na partycje wykonawcze. Czas przydzielony każdej partycji jest stały i niezależny od liczby zadań w jej obrębie. Błąd w jednej partycji nie zakłóca innych.
DODATKOWE
Algorytmy szeregowania w QNX
Szczegóły mikrojądra QNX Neutrino
Egzekutor jądra udostępnia 32 poziomy priorytetów (0 = najniższy, 31 = najwyższy). Dla programów użytkownika: 0–19. Procesy na tym samym poziomie szeregowane jednym z trzech algorytmów.
Trzy algorytmy szeregowania QNX
FIFO
Najdłużej czekający gotowy proces dostaje CPU. Wykonuje się aż do: zakończenia, zawieszenia, lub wywłaszczenia przez proces o wyższym priorytecie.
Round-Robin (karuzelowy)
Kwant czasu = 50 ms. Po wyczerpaniu kwantu → wywłaszczenie, następny proces w kolejce. Jeśli nie zakończy się lub nie zawiesi wcześniej — wywłaszczenie.
Adaptacyjny
Jak Round-Robin, ale jeśli proces wykorzysta cały kwant bez blokowania → jego priorytet tymczasowo dekrementowany. Gdy przejdzie w stan "blokowane" → priorytet natychmiast przywrócony. Chroni zadania interaktywne.
Cechy mikrojądra QNX
  • Wielozadaniowość — wiele procesów jednocześnie, kernel zarządza przełączaniem
  • Wielowątkowość — proces może tworzyć podrzędne wątki wykonywane równolegle
  • Wywłaszczalność — system może odebrać czas procesora dowolnemu procesowi
  • Skalowalność — zmiana wydajności sprzętu nie wpływa na poprawność działania
  • Komunikacja IPC — przez przekazywanie komunikatów (message passing)
Środowisko QNX Momentics (narzędzia)
C/C++ Code Development C/C++ Debugger System Builder Target System Information Memory Analysis SAT — System Analysis Toolkit
QNX Momentics = pełne IDE oparte na platformie Eclipse. Dostępne wersje: NC (darmowa, niekomercyjna), SE (standard), PE (profesjonalna).
DODATKOWE
Procesory sygnałowe – DSP
Czym jest DSP?
Procesor sygnałowy (DSP – Digital Signal Processor) to układ stworzony do błyskawicznego przetwarzania ciągłych strumieni danych w czasie rzeczywistym. Jego architektura mocno różni się od klasycznych mikroprocesorów ogólnego przeznaczenia – każdy element sprzętowy służy temu, by nie tracić ani jednego cyklu zegara.
Kluczowe cechy architektoniczne (4 filary)
Architektura Harwardzka
Rozdzielone szyny i pamięci
Fizycznie oddzielna pamięć i szyna dla danych oraz dla programu (instrukcji). Pozwala na jednoczesne pobranie instrukcji i danych w jednym cyklu zegara.

Eliminuje "wąskie gardło" architektury von Neumanna (gdzie dane i instrukcje walczą o jedną szynę). Umożliwia pracę równoległą.
MAC w jednym cyklu
Multiply-Accumulate
Równoległe mnożenie z akumulacją w jednym cyklu zegara:

A = A + (x * y)

Eliminuje opóźnienia i zapewnia maksymalną prędkość obliczeń. Kluczowe dla FFT, filtrów cyfrowych, korelacji.
AGU
Address Generation Unit
Niezależny układ sprzętowy, który w tle automatycznie wylicza adresy pamięci. Obsługuje:
• adresowanie kołowe (circular)
• odwracanie bitów dla FFT (bit-reverse)

Odciąża główny procesor — nie musi sam liczyć adresów.
Sprzętowe pętle
Hardware Loops
Mechanizm pozwalający powtarzać instrukcje z maksymalną prędkością, bez marnowania ani jednego cyklu zegara na sprawdzanie warunku końca pętli i skoki.

W zwykłym CPU: koniec pętli = cmp + branch = dodatkowe cykle. Tu: zero narzutu.
Organizacja pamięci w DSP
  • Pamięć podręczna (cache) — do wewnętrznego użytku procesora, najszybsza
  • Pamięć wewnętrzna RAM — w samym procesorze, do użytku programisty (program i dane)
  • Pamięć zewnętrzna — osobna "kość" pamięci typu DDR, większa ale wolniejsza
  • Pamięć ROM — stały program, np. firmware
Techniki przyspieszania: praca potokowa, równoległa, SIMD, VLIW, pamięć podręczna, praca wieloprocesorowa.
Podział procesorów DSP
Precyzja
Stałoprzecinkowe — tańsze, prostsze, dla aplikacji gdzie nie potrzeba pełnej precyzji
Zmiennoprzecinkowe — wyższa precyzja, dużo droższe
Szerokość słowa
16-bit — np. TMS320C32-2xx (Texas Instruments)
32-bit — np. TMS320C320-6xx (TI), ADSP21xxx (Analog Devices)
64-bit — zaawansowane systemy
Producenci
Texas Instruments — TMS320 (dominuje rynek)
Analog Devices — ADSP
Motorola — DSP56xx, MSC81xx
Zastosowania DSP
Telekomunikacja i multimedia
• Cyfrowa telefonia komórkowa
• Komunikacja satelitarna
• Sprzęt nawigacyjny (GPS)
• Modemy
• Systemy wideokonferencyjne
• Cyfrowe kamery
• Obróbka i przetwarzanie dźwięku
Przemysł i medycyna
• Sonary i radary
• Sterowanie napędami (wektorowe metody sterowania)
• Ultradźwiękowe systemy diagnostyki medycznej
• Implementacja złożonych algorytmów sterowania
• Elektronika przemysłowa
• Teoria estymacji
DSP vs klasyczny mikroprocesor – kluczowe różnice
Cecha Klasyczny CPU (von Neumann) DSP (Harvard)
Architektura pamięciJedna przestrzeń — dane i program razemOddzielna pamięć dla danych i programu
Pobranie instrukcjiDane i instrukcje kolejno — "wąskie gardło"Równoległe w jednym cyklu
MnożenieWiele cykli, osobna instrukcjaMAC w jednym cyklu: A = A + (x*y)
AdresowanieCPU oblicza adresy (traci cykle)AGU robi to w tle równolegle
PętleCmp + branch = dodatkowe cykleSprzętowe pętle = zero narzutu
ZastosowanieOgólne — aplikacje, OS, gryStrumieniowe przetwarzanie sygnałów w czasie rzeczywistym
Karta DSP1102 (używana w laboratorium): procesor TMS320C31, 128K×32bit RAM, wejścia/wyjścia analogowe i cyfrowe, enkoder, generator PWM (0.01Hz–1MHz), przetworniki A/D 12 i 16 bit (zakres ±10V).