**Real-Time Linux** (RTL, myös Linux-rt, PREEMPT\_RT) on reaaliaikainen (RTOS) versio Linux-ytimestä, joka tunnetaan Linux Foundationin projektina.

Reaaliaikaista Linuxia on käytetty mm. robotiikassa, pörssipalveluissa ja tietokoneissa, joiden pitää olla yhteydessä "kovan" reaaliaikajärjestelmän kanssa.

Vaatimukset
-----------

Kovan reaaliaikajärjestelmän vaatimuksille on neljä määrittelyä ja on tiedettävä mitä käyttäjä tarkoittaa:

* järjestelmän on aina kohdattava aikarajat
	+ tämä määritelmä on epäreilu ohjelmalle mikäli laitteisto vikaantuu
* järjestelmän on aina kohdattava aikarajat, mutta vain laitteistovian puuttuessa
	+ tämä määritelmä yksinkertaistaa asioita, mutta ei ole riittävä järjestelmätasolla
	+ "timantinkova" reaaliaikajärjestelmä voi suorittaa kytkemällä pois laitteistokeskeytykset
* järjestelmä saa ohittaa aikarajan, mutta vain jos se ilmoittaa siitä
	+ esimerkiksi korkean tarkuuden anturitietojen keruussa ennakoimattomien kuormien ollessa läsnä järjestelmässä
* järjestelmä määritellään testijoukon läpäisyllä
	+ eräät vaativat tämän sijaan formaalia (matemaattista) todistetta eivätkä kelpuuta tätä määrittelyä

Reaaliaikaisuus ei tarkoita nopeutta vaan latenssia ja deterministisyyttä.
Reaaliaikaisessa käsittelyssä 99 %:n todennäköisyys ei ole riittävä ja painopiste on pahimpien tapauksien (engl. *worst case*) käsittely siten, että tulos on ennakoitava ja toistettava: suorituskykyä painottava käsittely optimoi keskivertotapausta.
Turvakriittinen ja reaaliaikainen eivät ole sama asia, mutta voivat liittyä toisiinsa.

Historia
--------

Linuxia käytettiin tutkimusalustana jo varhain ja tutkijat alkoivat muuttaa Linuxia reaaliaikaiseksi käyttöjärjestelmäksi vaihtelevalla menestyksellä, mutta eivät tähdänneet pääsarjan ytimen muuttamiseen. Vuonna 2004 eri tahot aloittivat koordinoimattomia yrityksiä saada avaintekniikoita ytimeen, mutta ne olivat vielä puutteellisia. Red Hatille työskennellyt Ingo Molnar alkoi koota ja muokata kehitystä muutossarjaksi nimeltä PREEMPT\_RT ja samaan aikaan Thomas Gleixner työskenteli Doug Niehausin kanssa oman ratkaisun siirtämiseksi. Molnarin ja Gleixnerin työ oli sekä toisiaan täydentävää että ristiriidassa keskenään joten he yhdistivät voimavaransa. Muita tahoja kuten Steven Rostedt liittyi mukaan tuoden omia ideoita ja kokemusta reaaliaikaisuuden tutkimuksesta. Ryhmä sai nopeasti aikaan ratkaisun, joka oli vielä kaukana ylläpidettävästä ja tuotantovalmiista. Pääsarjan ytimeen liittämiseksi on tarvittu vielä paljon valmistelevaa työtä ja integraatio ei ole voinut olla haittana muulle Linux-ytimen käytölle ja kehitykselle: muutossarja koskee keskeisiä osia ytimestä.

Reaaliaikaisten järjestelmien käyttöalue on laaja ja useissa tapauksissa hyvin erikoistunut sekä voi olla aluekohtaisten standardien ja lakien säätelemä. Real-Time Linux projekti ei tähtää näihin erikoistuneisiin tapauksiin vaan on suunnattu kattamaan 99% käyttötapauksista. Validointia varten on käynnistetty Linux Foundationin ELISA-projekti.
Moniprosessointi on yleistynyt myös sulaututetuissa järjestelmissä ja järjestelmän osiointi (suorittimien eristäminen tiettyyn tehtävään) on yksi käyttötapaus.

RTL:stä on myös käytetty nimiä *-rt*, *RT-Patch* ja *RT PREEMPT* sekä *PREEMPT\_RT*. Pääsarjan ydintä on vaiheittain muokattu yhteensopivaksi. Linux-ytimen versiossa 5.3 on CONFIG\_PREEMPT\_RT on liitetty osaksi pääsarjan ydintä. Muutoksilla ytimen omat toiminnot ovat keskeytettäviä. 
Lukitukseen liittyvä koodi on yhdistetty pääsarjaan versiossa 5.15. SLUB-muistivaraus on tehty yhteensopivaksi PREEMPT\_RT:n kanssa versiossa 5.15.
Reaaliaikakäyttöön konfiguroidussa ytimessä on siihen tarkoitetut versiot mutexeista, wait/wound mutexeista, luku/kirjoitus semaforeista, spinlockeista ja read/write lukoista. 
Aiemmin SCHED\_DEADLINE-vuoronnus on lisätty ytimeen versiossa 3.14. Muita käytäntöjä ovat SCHED\_FIFO ja SCHED\_RR.
Keskeytyksien käsittely säikeissä on ollut ytimessä jo pitkään.

Toteutus
--------

Linux-ytimen reaaliaikatuki voidaan konfiguroida useasta eri vaihtoehdosta:

* ei pakotettua keskeytystä - CONFIG\_PREEMPT\_NONE
* vapaaehtoinen keskeytys - CONFIG\_PREEMPT\_VOLUNTARY
* keskeytettävä ydin (alhaisen latenssin työpöytä) - CONFIG\_PREEMPT\_LL
* keskeytettävä ydin (perustason reaaliaikaisuus) - CONFIG\_PREEMPT\_RTB
* täysin keskeytettävä ydin - CONFIG\_PREEMPT\_RT\_FULL

Prioriteettien inversio-ongelman välttämiseksi reaaliaikainen ydin tukee prioriteettien perintää. Prioriteettien perintä nostaa lukon varanneen prioriteettia vähintään samalle tasolle kuin lukkoa odottavalla kunnes lukko vapautuu, jotta lukon varannut saa riittävästi ajoaikaa.
Reaaliaikaisessa ytimessä *spin lock* -lukituksista tulee *mutex*-lukituksia.

Normaali Linux-ydin käyttää *tasavertaista* (engl. *fair*) vuoronnusta, mutta reaaliaikaisessa ytimessä korkeimmalla prioriteetilla oleva saa aina ensin vuoron. Tasavertaisessa lukkoa ensin odottava saa ensin vuoron mutta reaaliaikaisessa korkeammalla prioriteetilla oleva saa sen ensin. 
Levylle sivuttaminen on mahdollista estää.

Ytimessä on käytetty `local_lock`-alueita merkitsemään paikkoja, jotka tavallisessa ytimessä voivat hetkellisesti kytkeä moniajon pois tai estää keskeytykset. PREEMPT\_RT-ytimessä nämä eivät estä ytimen moniajoa eivätkä kytke pois keskeytyksiä ja lisäksi PREEMPT\_RT-ytimessä eräät primitiivit käyttävät eri tyyppiä jotta moniajoa ei estetä.

Ytimessä on *Lockdep*-niminen työkalu lukitusmallin oikeellisuuden validointiin.

Suoritintuki
------------

Reaaliaikaversio on saatavilla mm. seuraaville suoritinarkkitehtuureille:

* ARM
* x86 / x86-64
* MIPS
* M68k
* Power

Jäsenjärjestöt ja tukijat
-------------------------

Projektin tukijoina ovat:

* National Instruments
* OSADL
* Texas Instruments
* Altera
* ARM
* Intel
* IBM

OSADL jäseniä ovat:

* BMW
* Homag GmbH
* Intel
* KEBA AG
* Komax
* Phoenix Contact
* Roche
* Trumpf
* WAGO

OSADL-projekti *Safety Critical Linux* pyrkii sertifioimaan reaaliaikaisen Linuxin.

Muut projektit
--------------

Lisäksi on olemassa RTLinux, RTAI-laajennus Linux-ytimeen, Xenomai, Linux/RK, LITMUS-RT sekä LibeRTOS.

Katso myös
----------

* Reaaliaikainen käyttöjärjestelmä
* Jailhouse

Lähteet
-------

1. 1 2  The Linux Foundation Announces Project to Advance Real-Time Linux  5.10.2015. Linux Foundation.  Arkistoitu. Viitattu 29.1.2017. (englanniksi)
2. ↑  Intro to Real-Time Linux for Embedded Developers Linux.com. Viitattu 29.1.2017.
3. 1 2 3  Paul E. McKenney: SMP and Embedded Real Time  1.1.2007. Linux Journal. Viitattu 25.10.2019. (englanniksi)
4. 1 2 3 4 5  Steven Rostedt: Real-Time is coming to Linux (PDF) *events19.linuxfoundation.org*.  24.10.2018. Viitattu 26.10.2019. (englanniksi)
5. 1 2  Jonathan Corbet: Safety-critical realtime with Linux  25.9.2017. Lwn.net. Viitattu 27.10.2019. (englanniksi)
6. 1 2 3 4 5 6 7 8 9 10  In the trenches with Thomas Gleixner, real-time Linux kernel patch set *linux.com*.  20.4.2021. Viitattu 18.2.2022. (englanniksi)
7. ↑  The Linux Foundation Launches ELISA Project Enabling Linux In Safety-Critical Systems *linuxfoundation.org*.  21.2.2019.  Arkistoitu 4.11.2020. Viitattu 1.11.2020. (englanniksi)
8. ↑  2.13. System Partitioning Red Hat Enterprise Linux for Real Time *access.redhat.com*. Viitattu 18.2.2022. (englanniksi)
9. ↑  CPU Partitioning *wiki.linuxfoundation.org*. Viitattu 18.2.2022. (englanniksi)
10. ↑  Thomas Gleixner: [patch 0/1 Kconfig: Introduce CONFIG\_PREEMPT\_RT] *lwn.net*.  15.7.2019. Viitattu 25.10.2019. (englanniksi)
11. ↑  Linux\_5.3 *kernelnewbies.org*. Viitattu 25.10.2019. (englanniksi)
12. ↑  Robert Love: Lowering Latency in Linux: Introducing a Preemptible Kernel  1.5.2002. Linux Journal. Viitattu 25.10.2019. (englanniksi)
13. 1 2  Paul McKenney: A realtime preemption overview  10.8.2005. Lwn.net. Viitattu 25.10.2019. (englanniksi)
14. ↑
15. ↑
16. ↑  Jonathan Corbet: Short subjects: Realtime, Futexes, and ntfs3 *lwn.net*.  16.8.2021. Viitattu 1.11.2021. (englanniksi)
17. ↑  SCHED\_DEADLINE To Be Added To Linux 3.14 Kernel *phoronix.com*. Viitattu 25.10.2019. (englanniksi)
18. ↑  John Ogness: A Checklist for Writing Linux Real-Time Applications (PDF) *ogness.net*.  lokakuu 2020. Viitattu 17.11.2020. (englanniksi)
19. ↑  Priority inheritance in the kernel  3.4.2006. Lwn.net. Viitattu 28.10.2019. (englanniksi)
20. ↑  PI-futex: -V1 *lwn.net*.  25.3.2006. Viitattu 28.10.2019. (englanniksi)
21. 1 2 3  Klaas van Gend: Using Real-Time Linux (PDF) *elinux.org*. Viitattu 26.10.2019. (englanniksi)
22. 1 2  Lock types and their rules *kernel.org*. Viitattu 18.2.2022. (englanniksi)
23. ↑  RT-mutex implementation design *kernel.org*. Viitattu 18.2.2022. (englanniksi)
24. ↑  RT-mutex subsystem with PI support *kernel.org*. Viitattu 18.2.2022. (englanniksi)
25. ↑  Jonathan Corbet: Interrupts, threads, and lockdep *lwn.net*.  3.3.2009. Viitattu 18.2.2022. (englanniksi)
26. ↑  Runtime locking correctness validator *kernel.org*. Viitattu 18.2.2022. (englanniksi)
27. ↑  OSADL Project: Realtime Linux
28. ↑  OSADL Regular Members *osadl.org*. Viitattu 29.1.2017.
29. ↑  OSADL Project: Safety Critical Linux *osadl.org*. Viitattu 29.1.2017.

Aiheesta muualla
----------------

* Real-Time Linux Wiki
* The RTL Collaborative Project
* OSADL