7. Luento: Ytimet Arto Salminen arto.salminen@tut.fi
Agenda Johdanto Perusydintyypit Pollaavat Keskeyttävät Prosessiydin Esimerkki: Linux-ydin Valmiina saatavista ytimistä Lyhyesti virtualisoinnista Yhteenveto
Johdanto Käyttöjärjestelmän ytimen päätehtävät: Keskeytysten käsittely Oheislaitteiden ohjaus Prosessien hallinta (Muistinhallinta jos monimutkaisempi kokonaisuus) Pienet ytimet ilman käyttöjärjestelmän omaisia toimintoja Sovellus ja käyttöjärjestelmätaso sekoittuvat helposti (ja tämä voi olla jopa toivottavaa esim. ajoitukseen liittyvistä syistä!) Ohjelmoija vastaa kaikesta Yleiskäyttöisellä puolella käyttöjärjestelmä tarjoaa perusresurssit Esim. prosessit (kevennettynä säie tai tehtävä tai kevytprosessi)
Pollaava ydin Yksinkertaisin mahdollinen ydin, mutta silti varsin käyttökelpoinen monessa yksinkertaisessa laitteessa Alustuksen lisäksi ei keskeytyspalveluita lainkaan (tai vain 1 kello?) Sisäiseltä rakenteeltaan ikuinen silmukka, joka käsittelee laitteita jossain järjestyksessä
Koodi (rutiini yleensä) int main() { alusta laitteet; while (1) { testaa ja käsittele laite 1; testaa ja käsittele laite 2; testaa ja käsittele laite 3;. testaa ja käsittele laite n; } }
Ominaisuuksista Hyvää: Suoraviivainen ja nopea tehdä vaikka itse tarpeen vaatiessa Sopii pieniin sovelluksiin Ei keskeytyksiä -> Ei poissulkemisongelmaa Huonoa Kaikki toiminnot ehdittävä suorittaa saman syklin aikana (rajoittaa kokoa ja monimutkaisuutta) Järjestelmä mitoitettava pahimman mahdollisen tilanteen mukaan -> Tavallisella kierroksella paljon luppoaikaa Pitkään suoritettavat toiminnot voidaan joutua osittamaan -> Lisää monimutkaisuutta Olennaista: Laitteen käsittely ja tiedon käsittely tapahtuvat yhtä aikaa!
Ositusesimerkki void palvele() { static int tilamuuttuja = 0; switch (tilamuuttuja) { case 0: if (laitteella töitä) { aloita työt; tilamuuttuja = 1; } break; case 1: jatka käsittelyä; tilamuuttuja = 2; break; case 2: tee työt loppuun; tilamuuttuja = 0; } // switch } // palvele break; default: virhe;
Keskeytysohjatut ytimet Melko yksinkertainen ydin, muttei vedä siinä suhteessa vertoja pollaavalle ytimelle Ikuinen odotussilmukka, jonka keskeytyspalvelu aina välillä keskeyttää Keskeytykset sidotaan sopiviin keskeytyskäsittelijöihin, ja käsittelijät suorittavat varsinaiset operaatiot Odottaessa voidaan suorittaa jotain hyödyllistä (joskus käytetään termiä taustaydinprosessi, vaikka järjestelmässä ei varsinaisia prosesseja olekaan)
Koodi (tulostus kirjoittimelle) int main() { alusta laitteet; while (1) { if (uusia merkkejä) { tulkitse niin pitkälle kuin mahdollista } if (kirjoitettava rivi valmis) { aloita rivin kirjoitus/salli kellokeskeytykset } } } void sarjaliityntä() {siirrä merkki käsiteltävien puskuriin} void kellokeskeytys() { kirjoita seuraava merkki; siirrä kirjoituspäätä }
Ominaisuuksista Hyvää Yksinkertainen ja nopea toteuttaa itse tarvittaessa Kieltämällä keskeytykset aina keskeytyskäsittelyn ajaksi päästään eroon poissulkemisongelmasta (taustaprosessin kanssa niitä voi yhä tulla!) Huonoa Ositus ei onnistu keskeytyksien käsittelyn suhteen; taustaprosessin kanssa näin voi toimia Ei sovi läheskään kaikkiin järjestelmiin, sillä keskeytystä ei aina tule koskaan (näyttö? mittausjärjestelmä?) Monimutkaistuu jos keskeytyksillä on eri prioriteetit, ja keskeytyksiä ei voi kieltää
Prosessiydin Yksinkertaisenakin selvästi edellisiä monimutkaisempi Sovellus toteutettu prosesseissa Keskeytyspalvelu (käytännössä laiteajurit) huolehtivat kommunikoinnista oheislaitteiden kanssa Käytännössä nykyiset (pienet) prosessiytimet ovat hämmästyttävän keveitä ja sopivat siksi myös pienien sulautettujen järjestelmien toteuttamiseen Ero aiempiin ytimiin: Sovelluslogiikka prosesseissa Laiteohjaus ajureissa Tavallisesti 1 prosessi joka ei tee mitään (taustasäie)
Koodi int main () { alusta laitteet; luo prosessit; käynnistä skeduleri; } while (1) { odota, että joku keskeyttää ns. idle-prosessi } prosessi 1 { prosessin 1 käskyt; } prosessi n { prosessin n käskyt; }
Arviointi Hyvää Prosesseissa voidaan keskittyä ratkaisemaan sovelluskohtaisia ongelmia Voidaan mitoittaa keskimääräisen kuorman mukaan (paitsi jos reaaliaikaisuus halutaan taata) Loogisia toimintoja voi olla useita ajossa yhtä aikaa; prioriteettien perusteella voidaan valita niistä seuraavaksi suoritettava Huonoa Selvästi monimutkaisempi (sekä toteuttaa että myös debugata!) Poissulkemis- ja muut rinnakkaisuuden ongelmat
Yhteenveto erilaisista ytimistä Ytimen tyyppi Pollaava ydin Kietoutuneet toisiinsa Ikuinen silmukka Keskeyttävä ydin Kietoutuneet toisiinsa Keskeytykset Ydin vs. sovelluslogiikka Ohjausrakenne Prosessiydin Erotettu toisistaan Laiteohjaus ytimessä, ydin kontrolloi sovelluksia
Yhteenveto erilaisista ytimistä jatkuu Ytimen tyyppi Edut Haitat Pollaava ydin Keskeyttävä ydin Prosessiydin Helppo tehdä itse tarpeen vaatiessa Helppo tehdä itse tarpeen vaatiessa; erottaa taustasäikeen muusta joten mukana joustoa Selkeä ero ytimen ja sovellusten välillä Joustamaton Vaikka pollaavaa joustavampi edelleen joustamaton Voi olla resurssisyöppö; laitteisto monimutkaistuu myös
Taustasäikeestä (prosessiydin, keskeytysohjattu ydin) Tarkoitus yksinkertaistaa skeduleria Pienin mahdollinen prioriteetti -> Ajossa silloin, kun ei ole mitään muuta tehtävää Yleinen käyttö: Kerää tietoa järjestelmän toiminnasta Ongelma: Luotettavaa tietoa ei saatavilla silloin kun sitä eniten tarvittaisiin (huippukuormitustilanteet) Ongelma: Monesti dokumentoimatonta tietoa järjestelmästä kumuloituu juuri taustasäikeeseen, ja sille alkaa syntyä oma rooli järjestelmässä (ratkaisu: uusi prosessi, jolla on vähän korkeampi prioriteetti?)
Monoliittinen vastaan mikroydin Monoliittisessä ytimessä lähes kaikki ytimen toiminnot on sisällytetty ytimen hoidettavaksi Jaetut tietorakenteet mahdollisia Ytimen sisäinen poissulkeminen kun käsitellään jaettuja tietorakenteita Mikroytimessä toimintoja on pyritty hajauttamaan eri prosesseihin, jolloin ytimestä saadaan pienempi ja yksinkertaisempi Kommunikointi sanomien välityksellä; ei jaettuja tietorakenteita (puhtaimmassa muodossa) Vikasietoisuus voi kasvaa (jos joku prosessi ajautuu ongelmiin, se voidaan käynnistää uudelleen ajamatta koko ydintä alas)
Monolithic vs microkernel
QNX, Minix
Windows NT / 2000
Entäpä reaaliaika? Jos ohjelmoija vastaa kaikesta, niin myös reaaliajasta sitä tarvittaessa Korkeaprioriteettisin keskeytys palvelee reaaliaikatoiminnot Kokonaan reaaliaikainen ydin, jolloin se lupaa huolehtia esim. skedulointialgoritmillaan reaaliajasta (tietyin oletuksin!) Yleiskäyttöisessä ympäristössä erilaisia kikkoja Esim. 2 ydintä, joista toinen reaaliaikainen ja toinen yleiskäyttöinen Kommunikointi yleensä sallittua: Reaaliaikainen KJ voi nähdä yleiskäyttöisen KJ:n esim. sovellusprosessina, ja yleiskäyttöinen KJ puolestaan reaaliaikaisen KJ:n esim. laiteajurina
Yleensä reaaliaikaan liitettäviä vaatimuksia Irroittava skedulointi Prioriteettimekanismit + tason nosto kriittisellä alueella Ennustettava synkronointi Tunnetut latenssit Tehtävän vaihto Keskeytykset Keskeytyksen jälkeinen vuorontaminen
Valmiit ytimet Käytännössä aina (reaaliaikaisia) prosessiytimiä Tyypillisiä piirteitä: Pieni koko (mahduttava kokonaan ROM:iin) Prioriteetteihin perustuva skedulointi Ajetaan vain testattuja ohjelmia; ei suojauksia (nopeuttaa ympäristön vaihtoa ja prosessien välistä kommunikointia) Sovellusohjelmat etuoikeutetussa tilassa (KJkutsut, jotka eivät vaadi ympäristön vaihtoa voidaan suorittaa aliohjelmakutsuina ohjelmoidun keskeytyksen sijaan suorituskykysyistä) Mikroydintyyppinen ratkaisu, jossa ydin sisältää vain prosessien hallinnan ja kommunikoinnin tarvitsemat palvelut; laitteiden ohjausta varten on sovellusprosessit
Joitakin keskeisiä ominaisuuksia Skaalattavuus Pienimmillään muutamia kilotavuja, isommillaan RT + Unix Laitteistovalikoima Joitakin ytimiä saa lähes mille laitteistolle tahansa, ja joillekin laitteistolle saa lähes minkä ytimen tahansa; olennaiseksi nousemassa oheislaitteet ja niiden ominaisuuksien käyttö (esim. laitteistokiihdytetty grafiikka) Kommunikointi ja poissulkeminen: Yleensä semaforit ja/tai viestinvälitys Korkeamman tason mekanismit harvinaisia (esim. monitorit, Adan rendezvous); toisaalta nämä ovat pikemminkin ohjelmointikielen kuin ytimen rakenteita Verkkoyhteydet yleistymässä (TCP/IP, Bluetooth, WLAN, ) Kustannukset Suoritin (voi vaihdella ympäristön vaatimusten mukaan) Ydin (kertakorvaus, lisenssi per yksikkö) Kehitysympäristö (kertamaksu, lisenssi, joskus jopa ilmainen)
Kehitysympäristö Toteutuskieli Yleensä C tai konekieli Muita: PL/M, Ada, Fortran, C++, Java Kehitysympäristönä yleensä PC, kohdelaitteeseen tarvitaan usein ristikäännös Kehitysympäristöllä voi olla vähän käyttäjiä -> Laatu vaihtelee! Tilanne ei paljon helpompi vaikka voisi tehdä suoran käännöksen kehityskoneessa (esim. virtualisoidun ympäristön avulla), sillä laitteistovaatimukset yleensä varsin erilaisia
Esimerkki: Linux-ydin Monoliittinen prosessiydin Modulaarisuus sallii ytimen (hallitun) räätälöinnin Ajureiden avulla mahdollista laajentaa ytimen toimintaa tarpeen mukaan Useita yrityksiä, jotka tekevät homman puolestasi, jos olet valmis maksamaan Dev. Drv1 Dev. Drv2 Dev. Drv3 Dev. Drv4 New Funct. Processor/Cache Control Memory Management Process Management File System Interface Networking Stacks Device & I/O Interface Kernel State Information Extended f. Security/Auth.
PS3 Linux-ydin Linux kernel can access some devices directly (e.g. USB host controller). Other devices are virtualized by hypervisor and device service is provided via hypervisor call. For example, storage service hypervisor calls are available.
EmbinuxTM Sulautettu Linux
Paravirtualized Linux on OKL4 (Genode / Motorola QA4) OKL4 virtuaalikone (hypervisor) ajaa Linux ydintä ja RTOSydintä samalla prosessorilla. Lisäksi ohjelma voidaan suorittaa suoraan OKL4-ytimen päällä
Joitakin kaupallisia ytimiä C Executive (askeettinen, oikeastaan vain aliohjelmakirjasto) Posix-yhteensopivia (monimutkaisia, oikeastaan melkein kuin yleiskäyttöinen käyttöjärjestelmä) LynxOS PDOS psos+ UniFLEX Sulautettu Linux
Posix-yhteensopivuudesta (http://en.wikipedia.org/wiki/posix) Core services Process Creation and Control Signals Floating Point Exceptions Segmentation / Memory Violations Illegal Instructions Bus Errors Timers File and Directory Operations Pipes C Library (Standard C) I/O Port Interface and Control Process Triggers
Posix-yhteensopivuudesta (http://en.wikipedia.org/wiki/posix) Real-time extensions Priority Scheduling Real-Time Signals Clocks and Timers Semaphores Message Passing Shared Memory Asynch and Synch I/O Memory Locking Interface
Posix-yhteensopivuudesta (http://en.wikipedia.org/wiki/posix) Thread extensions Thread Creation, Control, and Cleanup Thread Scheduling Thread Synchronization Signal Handling
Lyhyesti virtualisoinnista virtuaalinen ikään kuin todellisen sijaan; täsmällinen määrittely vaikeaa Voidaan soveltaa usealla tasolla, Tässä lähinnä laitteiston virtualisointi; VM joka toimii kuten laitteisto Hypervisorin (VM Monitor, VMM) ohjauksessa full lähes täydellinen virtualisointi; partial vain osa virtualisoidaan Para- - ei laitteiston virtualisointia, mutta osa ohjelmista voidaan eristää (Käyttöjärjestelmän virtualisointi)
System vs. process VM Applications Operating system Virtualizing software (VM) Hardware Applications Virtualizing software (VM) Operating system Hardware System virtual machine Process virtual machine
Yhteenveto Ytimien erot kulminoituvat siihen, miten ytimen ja sovelluksen toiminnot erotetaan Pollava ydin: Ydin ja sovelluslogiikka kietoutuneet toisiinsa; ohjausrakenne ikuinen silmukka Keskeyttävä ydin: Ydin ja sovelluslogiikka kietoutuneet toisiinsa; ohjausrakenne keskeytykset Prosessiydin: Ydin ja sovelluslogiikka erotettu toisistaan; laiteohjaus ytimessä, sovelluslogiikka prosesseissa Monoliittinen vs. mikroydin Useita valmiina saatavia ytimiä; jos tarvitset johonkin todelliseen laitteeseen ytimen, tutki edes saatavilla olevat vaihtoehdot ennen kuin ryntäät oman toteutuksen kimppuun ( oma kiinnostus + omat harrastukset on eri asia ;-)
Sitten jotain ihan muuta: Dynamic C Integrated development environment reduces the time and effort to write real-time software for embedded systems that use a Rabbit microprocessor enabling easy development of a wide range of applications Toteuttaa monet ytimiin liittyvät seikat mielenkiintoisella tavalla ohjelmointikielen tasolla http://www.digi.com/products/wireless-wiredembedded-solutions/software-microprocessorsaccessories/software/dynamicc#overview
Koodia (ftp://ftp1.digi.com/support/documentation/html/dyncusersmanual/3tutoria.htm) main() { int secs; // seconds counter secs = 0; // initialize counter while (1) { // endless loop // Task 1 will print the seconds elapsed. costate { secs++; // increment counter waitfor( DelayMs(1000) ); // wait one s. printf("%d seconds\n", secs); // print elapsed s. } // Task 2 checks if any keys have been pressed. costate { if (!kbhit() ) abort; // key been pressed? printf(" key pressed = %c\n", getchar() ); } } // end of while loop } // end of main