Real-Time Linux
Real-Time Linux (RTL, myös Linux-rt, PREEMPT_RT) on reaaliaikainen (RTOS) versio Linux-ytimestä, joka tunnetaan Linux Foundationin projektina.[1]
Reaaliaikaista Linuxia on käytetty mm. robotiikassa, pörssipalveluissa ja tietokoneissa, joiden pitää olla yhteydessä ”kovan” reaaliaikajärjestelmän kanssa.[2]
Vaatimukset
[muokkaa | muokkaa wikitekstiä]Kovan reaaliaikajärjestelmän vaatimuksille on neljä määrittelyä ja on tiedettävä mitä käyttäjä tarkoittaa:[3]
- 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ä.[4] 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.[5] Turvakriittinen ja reaaliaikainen eivät ole sama asia, mutta voivat liittyä toisiinsa.[5]
Historia
[muokkaa | muokkaa wikitekstiä]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.[6] Vuonna 2004 eri tahot aloittivat koordinoimattomia yrityksiä saada avaintekniikoita ytimeen, mutta ne olivat vielä puutteellisia.[6] 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.[6] Molnarin ja Gleixnerin työ oli sekä toisiaan täydentävää että ristiriidassa keskenään joten he yhdistivät voimavaransa.[6] Muita tahoja kuten Steven Rostedt liittyi mukaan tuoden omia ideoita ja kokemusta reaaliaikaisuuden tutkimuksesta.[6] Ryhmä sai nopeasti aikaan ratkaisun, joka oli vielä kaukana ylläpidettävästä ja tuotantovalmiista.[6] 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ä.[6]
Reaaliaikaisten järjestelmien käyttöalue on laaja ja useissa tapauksissa hyvin erikoistunut sekä voi olla aluekohtaisten standardien ja lakien säätelemä.[6] Real-Time Linux projekti ei tähtää näihin erikoistuneisiin tapauksiin vaan on suunnattu kattamaan 99% käyttötapauksista.[6] Validointia varten on käynnistetty Linux Foundationin ELISA-projekti.[6][7] 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.[3][8][9]
RTL:stä on myös käytetty nimiä -rt, RT-Patch ja RT PREEMPT sekä PREEMPT_RT. Pääsarjan ydintä on vaiheittain muokattu yhteensopivaksi.[10] Linux-ytimen versiossa 5.3 on CONFIG_PREEMPT_RT on liitetty osaksi pääsarjan ydintä.[11] Muutoksilla ytimen omat toiminnot ovat keskeytettäviä.[12][13][3] Lukitukseen liittyvä koodi on yhdistetty pääsarjaan versiossa 5.15.[14] SLUB-muistivaraus on tehty yhteensopivaksi PREEMPT_RT:n kanssa versiossa 5.15.[15] Reaaliaikakäyttöön konfiguroidussa ytimessä on siihen tarkoitetut versiot mutexeista, wait/wound mutexeista, luku/kirjoitus semaforeista, spinlockeista ja read/write lukoista.[16] Aiemmin SCHED_DEADLINE-vuoronnus on lisätty ytimeen versiossa 3.14.[17] Muita käytäntöjä ovat SCHED_FIFO ja SCHED_RR.[18] Keskeytyksien käsittely säikeissä on ollut ytimessä jo pitkään.[4][13]
Vuodesta 2005 kehitetty muutossarja on kokonaan mukana Linux-ytimen versiossa 6.12. Muutoksia on liitetty asteittain pääsarjan ytimeen, muun muassa NO_HZ-ominaisuus virrankulutuksen vähentämiseen on lisätty aiemmin.[19][20][21] Joitakin kehityskohtia on edelleen jäljellä eri arkkitehtuurien ja ajurien tuen parantamiseksi. "Kova" reaaliaikajärjestelmä ei ole vain ytimestä kiinni, vaan vaatii myös laitteiston ja muun ohjelmiston optimointia halutulle vasteajalle.[22]
Toteutus
[muokkaa | muokkaa wikitekstiä]Linux-ytimen reaaliaikatuki voidaan konfiguroida useasta eri vaihtoehdosta:[4]
- 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ää.[4] 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.[23][24] Reaaliaikaisessa ytimessä spin lock -lukituksista tulee mutex-lukituksia.[4]
Normaali Linux-ydin käyttää tasavertaista (engl. fair) vuoronnusta, mutta reaaliaikaisessa ytimessä korkeimmalla prioriteetilla oleva saa aina ensin vuoron.[25] Tasavertaisessa lukkoa ensin odottava saa ensin vuoron mutta reaaliaikaisessa korkeammalla prioriteetilla oleva saa sen ensin.[25] Levylle sivuttaminen on mahdollista estää.[25]
Ytimessä on käytetty local_lock
-alueita merkitsemään paikkoja, jotka tavallisessa ytimessä voivat hetkellisesti kytkeä moniajon pois tai estää keskeytykset.[26] 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ä.[26][27][28]
Ytimessä on Lockdep-niminen työkalu lukitusmallin oikeellisuuden validointiin.[29][30]
Suoritintuki
[muokkaa | muokkaa wikitekstiä]Reaaliaikaversio on saatavilla mm. seuraaville suoritinarkkitehtuureille:[31]
Jäsenjärjestöt ja tukijat
[muokkaa | muokkaa wikitekstiä]Projektin tukijoina ovat:[1]
OSADL-projekti Safety Critical Linux pyrkii sertifioimaan reaaliaikaisen Linuxin.[33]
Muut projektit
[muokkaa | muokkaa wikitekstiä]Lisäksi on olemassa RTLinux, RTAI-laajennus Linux-ytimeen, Xenomai, Linux/RK, LITMUS-RT sekä LibeRTOS.
Katso myös
[muokkaa | muokkaa wikitekstiä]Lähteet
[muokkaa | muokkaa wikitekstiä]- ↑ a b The Linux Foundation Announces Project to Advance Real-Time Linux 5.10.2015. Linux Foundation. Arkistoitu Viitattu 29.1.2017. (englanniksi)
- ↑ Intro to Real-Time Linux for Embedded Developers Linux.com. Viitattu 29.1.2017.
- ↑ a b c Paul E. McKenney: SMP and Embedded Real Time 1.1.2007. Linux Journal. Viitattu 25.10.2019. (englanniksi)
- ↑ a b c d e Steven Rostedt: Real-Time is coming to Linux (PDF) events19.linuxfoundation.org. 24.10.2018. Viitattu 26.10.2019. (englanniksi)
- ↑ a b Jonathan Corbet: Safety-critical realtime with Linux 25.9.2017. Lwn.net. Viitattu 27.10.2019. (englanniksi)
- ↑ a b c d e f g h i j In the trenches with Thomas Gleixner, real-time Linux kernel patch set linux.com. 20.4.2021. Viitattu 18.2.2022. (englanniksi)
- ↑ 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)
- ↑ 2.13. System Partitioning Red Hat Enterprise Linux for Real Time access.redhat.com. Viitattu 18.2.2022. (englanniksi)
- ↑ CPU Partitioning wiki.linuxfoundation.org. Viitattu 18.2.2022. (englanniksi)
- ↑ Thomas Gleixner: [patch 0/1 Kconfig: Introduce CONFIG_PREEMPT_RT] lwn.net. 15.7.2019. Viitattu 25.10.2019. (englanniksi)
- ↑ Linux_5.3 kernelnewbies.org. Viitattu 25.10.2019. (englanniksi)
- ↑ Robert Love: Lowering Latency in Linux: Introducing a Preemptible Kernel 1.5.2002. Linux Journal. Viitattu 25.10.2019. (englanniksi)
- ↑ a b Paul McKenney: A realtime preemption overview 10.8.2005. Lwn.net. Viitattu 25.10.2019. (englanniksi)
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e5e726f7bb9f
- ↑ https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cc09ee80c3b18ae1a897a30a17fe710b2b2f620a
- ↑ Jonathan Corbet: Short subjects: Realtime, Futexes, and ntfs3 lwn.net. 16.8.2021. Viitattu 1.11.2021. (englanniksi)
- ↑ SCHED_DEADLINE To Be Added To Linux 3.14 Kernel phoronix.com. Viitattu 25.10.2019. (englanniksi)
- ↑ John Ogness: A Checklist for Writing Linux Real-Time Applications (PDF) ogness.net. lokakuu 2020. Viitattu 17.11.2020. (englanniksi)
- ↑ Kevin Purdy: Real-time Linux is officially part of the kernel after decades of debate arstechnica.com. 19.9.2024. Viitattu 19.9.2024. (englanniksi)
- ↑ Steven Vaughan-Nichols: 20 years later, real-time Linux makes it to the kernel - really zdnet.com. 18.9.2024. Viitattu 19.9.2024. (englanniksi)
- ↑ NO_HZ: Reducing Scheduling-Clock Ticks docs.kernel.org. Viitattu 19.9.2024. (englanniksi)
- ↑ Thorsten Leemhuis: After 20 years of painstaking work: Linux kernel now real-time capable heise.de. 20.9.2024. Viitattu 28.11.2024. (englanniksi)
- ↑ Priority inheritance in the kernel 3.4.2006. Lwn.net. Viitattu 28.10.2019. (englanniksi)
- ↑ PI-futex: -V1 lwn.net. 25.3.2006. Viitattu 28.10.2019. (englanniksi)
- ↑ a b c Klaas van Gend: Using Real-Time Linux (PDF) elinux.org. Viitattu 26.10.2019. (englanniksi)
- ↑ a b Lock types and their rules kernel.org. Viitattu 18.2.2022. (englanniksi)
- ↑ RT-mutex implementation design kernel.org. Viitattu 18.2.2022. (englanniksi)
- ↑ RT-mutex subsystem with PI support kernel.org. Viitattu 18.2.2022. (englanniksi)
- ↑ Jonathan Corbet: Interrupts, threads, and lockdep lwn.net. 3.3.2009. Viitattu 18.2.2022. (englanniksi)
- ↑ Runtime locking correctness validator kernel.org. Viitattu 18.2.2022. (englanniksi)
- ↑ OSADL Project: Realtime Linux
- ↑ OSADL Regular Members osadl.org. Viitattu 29.1.2017.
- ↑ OSADL Project: Safety Critical Linux osadl.org. Viitattu 29.1.2017.