Reaalaja operatsioonisüsteem

Reaalaja operatsioonisüsteem (RTOS) on reaalajaliste rakenduste kasutamiseks välja töötatud operatsioonisüsteem. Neid kasutatakse reaalajasüsteemides.
Reaalaja operatsioonisüsteemide võtmetunnuseks on rakenduste nõuete vastuvõtmisele ja täitmisele kuluva aja, kosteaja, pidevus ja ennustatavus. Reaalaja operatsioonisüsteemid jagunevad rangeteks ning nõrkadeks reaalaja operatsioonisüsteemideks. Range reaalaja operatsioonisüsteem on pidevam ja paremini ennustatava ajalise kasutusega kui nõrk reaalaja operatsioonisüsteem. Reaalaja operatsioonisüsteem, mis enamasti või tavaliselt suudab täita tähtaegu on nõrk reaalaja operatsioonisüsteem. Kui süsteem suudab tähtaegu alati deterministlikult täita on tegemist range süsteemiga. Põhiline disainiprobleem ei ole mitte kõrge läbilaskevõime vaid tagatud nõrk või range jõudluskategooria.
Reaalaja operatsioonisüsteemide tähtsaks osaks on ressursijaotusega tegelev arenenud plaanurid. Paindlik ja keeruline plaanur lubab küll erinevamate prioriteetidega rakenduste hulka, aga reaalaja operatsioonisüsteemid on enamasti pühendatud kitsamale kasutusvaldkonnale. Võtmetegurid on katkestuste ja lõimevahetuse minimaalne latents. Reaalaja operatsioonisüsteemi puhul väärtustatakse rohkem kui kiirelt ja etteaimatavalt see suudab reageerida, mitte see kui palju tööd ajaühikus ära tehakse.
Disainifilosoofia.
Levinumad disainid on järgmised:
Aega jagavad disainid aktiveerivad tegumeid tihemini kui rangelt vaja oleks, aga meed annavad ladusama multitegumtöö, tekitades illusiooni, et protsess või kasutaja kasutab arvutit üksi.
Vanad protsessorid vajasid tegumi vahetamiseks palju tsükleid, mille ajal protsessor ei saanud midagi kasulikku teha. Näiteks 20 MHz 68000 protsessoril (tavaline 1980. aastate lõpus) kulus tegumi vahetamiseks umbes 20 mikrosekundit. 2008. aastast pärit 100 MHz ARM-iga protsessoril kulub selleks alla 3 mikrosekundi. Sel põhjusel üritasid varajased operatsioonisüsteemid suurendada kiirust vahetades tegumeid võimalikult harva.
Ressursijaotus.
Tavaliselt on protsessidel kolm staatust:
Enamus protsessid on suurema osa ajast blokeeritud või täitmiseks valmis, sest enamasti saab samal ajal ühe protsessori peal töötada ainult üks tegum. Järjekorras ootavate protsesside arv võib olla väga erinev, ning sõltub töötavate tegumite hulgast ja süsteemi kasutatavast plaanurist.
Tegumitevaheline suhtlus ja ressursside jagamine.
Multitegumtöötlusega süsteemid peavad andmeid ja riistvara ressursse protsesside vahel jagama. Kui samal ajal üritavad mitu protsessi samale ressursile juurde pääseda, tekivad ennustamatud olukorrad. Selle probleemiga võitlemiseks on kolm enam levinud lahendust.
Katkestuste ajutine väljalülitamine.
Tavalised operatsioonisüsteemid ei luba kasutaja programmidel katkestusi välja lülitada, sest niiviisi võiks kasutaja programm kontrollida protsessorit nii kaua kui tahab. Modernsed protsessorid ei luba kasutaja programmidel katkestusi keelata, sest sellist kontrolli peetakse võtmetähtsusega operatsioonisüsteemi ressursiks. Paljud manussüsteemid ja reaalaja operatsioonisüsteemid, lubavad kõigil programmidel tuuma õigustes töötada, et tagada suurem süsteemikutse efektiivsus, ning lubada suuremat kontrolli riistvara üle.
Kui tegum töötab tuuma õigustes ühe protsessoriga süsteemis ja omab õigust katkestusi keelata, on nende väljalülitamine tihti parim (väikseima kuluga) lahendus takistamaks samaaegseid ligipääsemisi jagatud ressursile. Keelatud katkestustega ajal on protsessil eksklusiivne õigus protsessorile, sest mitte ükski teine tegum ega katkestus ei saa käivituda, seeläbi on kriitiline osa kaitstud. Kui tegum lõpetab kriitilise töö, peab ta katkestused uuesti sisse lülitama. Kui ootel oli katkestusi siis need käivituvad seejärel. Ajutiselt katkestuste keelamist peaks kasutama ainult siis kui kõige pikem tee läbi kriitilise osa võtab vähem aega kui maksimaalne katkestuse latents. Seda viisi kasutatakse enamasti siis, kui kriitiline kood on mõne masinkäsu pikkune ega sisalda tsükleid. Näiteks on see ideaalne kaitsmaks riistvara seadeid muutvaid registreid nende muutmise ajal.
Binaarne semafor.
Kui kriitiline kood on pikem kui mõni rida koodi või sisaldab tsükleid, peab reaalaja operatsioonisüsteem kasutusele võtma tavalistes operatsioonisüsteemides kasutatavad lahendused.
Binaarne semafor on lukus lahti või lukus. Kui see on lukus peab tegum ootama kuni see lukust lahti võetakse. Semoforidel on ka hulk teada olevaid probleeme – näiteks õiguste ümberpöördumine ja ummik.
Sõnumite saatmine.
Veel üks viis ressursside jagamiseks tegumite vahel, on organiseeritud sõnumite saatmise skeem. Sellises raamistikus omab ainult üks tegum otseselt ressurssi. Kui teine protsess tahab juurdepääsu ressursile saadab ta sõnumi haldavale protsessile. Kuigi nende reaalajaline käitumine on halvem kui semaforisüsteemidel, õnnestub lihtsatel sõnumeid saatvatel süsteemidel võidelda paremini ummikute vastu.
Katkestuste juhtija ja plaanur.
Kuna katkestuste juhtija plokid on kõige kõrgema prioriteediga jooksev tegum ja reaalajasüsteemide lõime vahetuse aega hoitakse minimaalsena, on katkestuste kood võimalikult lühike. Enamasti katkestuse kood lihtsalt teadvustab katkestuse toimumist ja paneb vastava riistvaralise töö madalama prioriteediga juhtprogrammile, näiteks lukustades semafori lahti või saates teate. Tavaliselt pakuvad plaanurid viisi, kuidas katkestuse seest tegumeid lahti lukustada.
Mäluhaldus.
Mäluhaldus on reaalaja operatsioonisüsteemis palju tähtsamal kohal kui tavalistes operatsioonisüsteemides. Mälu eraldamise kiirus on väga tähtis. Tavalised mäluhaldus süsteemid otsivad vaba mäluosa teadmata pikkusega ahelloendist. Reaalaja operatsioonisüsteemi vaatepunktist on see lubamatu, sest mälu eraldamine peab toimuma kindla aja jooksul. Reaalaja operatsioonisüsteemides kasutatakse seetõttu lihtsamaid ja kiiremaid algoritme, mis on vähem efektiivsed.