Käyttöjärjestelmän ydin

Wikipedia
Ohjattu sivulta Monoliittinen ydin
Loikkaa: valikkoon, hakuun
Erilaiset käyttöjärjestelmä-rakenteet kuvattuna monoliittisen, mikro- sekä ”hybridi-ytimen” avulla.

Ydin eli kerneli (engl. kernel) määrittelee käyttöjärjestelmän rakenteen, luokituksen ja ominaisuudet. Ydin voi olla kooltaan muutaman tuhannen tai jopa miljoonien koodirivien pituinen.

Käyttöjärjestelmän ytimiä on kahta päätyyppiä: monoliittisia ja mikroytimiä. Monoliittinen ydin (makroydin) sisällyttää kaikki käyttöjärjestelmän ominaisuudet samaan osoiteavaruuteen (engl. address space). Muun muassa sulautetuissa järjestelmissä suosittu mikroydin puolestaan huolehtii vain osasta käyttöjärjestelmän toiminnoista. Nykyaikaiset käyttöjärjestelmät eivät ole rakenteeltaan puhtaasti monoliittisia tai mikroytimeen perustuvia, vaikka edelleen selviä esimerkkejä näistä kahdesta mallista on olemassa. Sen sijaan modernit käyttöjärjestelmät soveltavat monillakin tavoilla toistensa ideoita.

Käyttöjärjestelmärakenteiden kaksi pääluokkaa[muokkaa | muokkaa wikitekstiä]

Monoliittinen ydin[muokkaa | muokkaa wikitekstiä]

Monoliittinen ydin sisältää kaikki käyttöjärjestelmätoiminnot samassa osoiteavaruudessa, ydintilassa (engl. kernel space). Monoliittisen rakenteen etuja ovat käyttöjärjestelmän nopeus sekä helppo kehitysmalli. Toisaalta ylläpitäminen monimutkaistuu ominaisuuksien lisääntyessä, sillä yksittäinen ohjelmoija ei voi tuntea kaikkia toimintoja ja niiden vaikutuksia toisiinsa. Huonoista puolista vakavin on, että yksikin virhe jossain käyttöjärjestelmän toiminnossa, kuten muistinhallinnassa, verkkoprotokollassa, levyjärjestelmässä tai laiteajurissa, vaikuttaa käyttöjärjestelmän muihinkin osiin ja kaikkiin prosesseihin. Tästä seuraa koko järjestelmän kaatuminen.

Monoliittinen ydin toimii yksin suojatussa supervisor-tilassa yhdessä osoiteavaruudessa ja tarjoaa muille ohjelmistoille laitteiston järjestelmäkutsu-rajapinnat. Monoliittinen rakenne voi myös olla osittain modulaarinen, eikä ydintä tällöin kutsuta makroytimeksi. Osa käyttöjärjestelmän toiminnoista – kuten laiteajuri – siirretään irralleen ytimestä omaksi käyttöjärjestelmä­moduulikseen, joka ladataan keskusmuistiin vain tarvittaessa – liitos on tarkasti sovitettu ytimeen. Tällä toiminnolla kyetään pienentämään käyttöjärjestelmän vaatimaa tilantarvetta keskusmuistissa. Esimerkkejä monoliittista rakennetta käyttävistä käyttöjärjestelmistä ovat Linux, OpenBSD, NetBSD, FreeBSD sekä SunOS.

Mikroydin[muokkaa | muokkaa wikitekstiä]

Mikroydinrakenteella pyritään parantamaan käyttöjärjestelmän tietoturvaa ja vakautta, mutta tämä tapahtuu nopeuden kustannuksella. Mikroydinrakenteessa käyttöjärjestelmä pilkotaan useisiin palasiin: pieneksi pelkistetyksi mikroytimeksi sekä käyttöjärjestelmä­moduuleiksi, jotka siirretään toiseen osoiteavaruuteen eli käyttäjätilaan (engl. userspace, userland). Jokainen käyttöjärjestelmä­moduuli suojataan eristämällä moduulit toisistaan, ja ne ovat yhteydessä ytimeen ja toisiinsa suojattuina prosesseina. Yhden käyttöjärjestelmä­moduulin kaatuminen ei vaikuta muihin moduulehin tai ytimeen, vaan ainoastaan sitä tarvitseviin prosesseihin. Vikaantunut käyttöjärjestelmä­moduuli voidaan käynnistää uudelleen ja jatkaa prosessin suorittamista. Jokainen käyttöjärjestelmä­moduuli tai jopa mikroydin voidaan päivittää muista osista riippumatta. Käyttöjärjestelmä on tällöin hyvin modulaarinen rakenteeltaan ja teoriassa hyvin vikasietoinen. Käyttöjärjestelmän jakaminen erillisiin muistiavaruuksiin tekee siitä kuitenkin hitaan, koska tiedon siirtäminen käyttöjärjestelmä­moduulien ja mikroytimen välillä vaatii huomattavasti enemmän prosessorin kellojaksoja kuin monoliittiseen rakenteeseen perustuva käyttöjärjestelmä. Esimerkkejä mikroydinrakenteeseen perustuvista ytimistä ovat Hurd ja Mach.

Hybridiydin ja muut välimuodot[muokkaa | muokkaa wikitekstiä]

Monoliittisen ja mikroytimen lisäksi on useita alaluokkia, kuten exoydin, nanoydin ja hybridiydin, jotka pyrkivät yhdistelemään kahden pääluokan ominaisuuksia. Ristiriitaisin niistä taitaa olla niin kutsuttu hybridiydin, jossa sovelletaan mikroytimeen perustuvaa käyttöjärjestelmärakennetta mutta monoliittisen käyttöjärjestelmän tavoin. Käyttöjärjestelmä on pilkottu mikroytimeksi ja käyttöjärjestelmämoduuleiksi, mutta moduulit tai osa niistä on siirretty käyttäjätilasta takaisin samaan osoiteavaruuteen, ydintilaan. Hybridiytimen on tarkoitus olla vakaudeltaan ja tietoturvaltaan yhtä hyvä kuin mikroytimeen perustuva käyttöjärjestelmä, mutta samalla yhtä nopea kuin monoliittinen käyttöjärjestelmä. Esimerkkinä hybridiydinrakennetta käyttävistä käyttöjärjestelmistä on Windows NT.

Moni käyttöjärjestelmäasiantuntija kuitenkin katsoo, että hybridiydin-termi ei oikeastaan tarkoita mitään. Esimerkiksi Linus Torvalds on sanonut, että puhe hybridiytimistä on pelkkää markkinointia:

»As to the whole ‘hybrid kernel’ thing — it’s just marketing. It’s ‘oh, those microkernels had good PR, how can we try to get good PR for our working kernel? Oh, I know, let’s use a cool name and try to imply that it has all the PR advantages that that other system has’.[1]»

Samoilla linjoilla on IBM:n Sonny Rao:

»It’s wrong... I think this talk... was born from some kind of half-assed marketing game to try and make XXX kernel seem ‘more advanced.’ ‘Micro’ and ‘hybrid’ are always better, more advanced than ‘Monolithic’ right??[2]»

Historiallisia syitä[muokkaa | muokkaa wikitekstiä]

Kun ensimmäiset modernit käyttöjärjestelmät kehiteltiin 1960-luvun alussa, suunnittelijat pitivät tärkeänä niiden suorituskykyä, ja siksi ne oli kirjoitettu assembler-kielellä, vaikka korkean tason ohjelmointikieliä, kuten Fortran, Mad ja ALGOL, oli jo laajalti käytössä. Vakaus ja tietoturva eivät olleet edes suunnitelmissa. Useimmat nykyajan ongelmista voidaan jäljittää 40–50 vuoden taakse, jolloin käyttöjärjestelmän nopeutta pidettiin tietoturvaa tärkeämpänä. Tämä johti monoliittiseen rakenteeseen, jossa koko käyttöjärjestelmä toimi yhtenä suoritettavana binäärinä (makroytimenä) ydintilassa (engl. kernel space).

Kun käyttöjärjestelmän käytettävissä oleva muisti oli vain 32 tuhatta sanaa, niin kuin MIT-yliopiston ensimmäisessä järjestelmässä CTSS:ssä, monen miljoonan rivin käyttöjärjestelmät eivät olleet mahdollisia ja monimutkaisuus oli hallittavissa. Kun saatavilla oleva muistin määrä kasvoi, kasvoivat myös käyttöjärjestelmät. Lopulta jouduttiin nykyiseen tilanteeseen, jossa käyttöjärjestelmä sisältää satoja järjestelmäkutsuja niin monipuolisilla tapahtumilla, että kukaan ei oikeastaan enää ymmärrä, miten ne toimivat. Windows NT 5.1 -käyttöjärjestelmä sisältää 5 miljoonaa riviä koodia (koko järjestelmä sisältää yli 40 miljoonaa) ja Linux yli 3 miljoonaa riviä koodia. Käyttöjärjestelmien monimutkaisuus on nopeasti muodostumassa ongelmaksi. Tämän rivimäärän vuoksi käyttöjärjestelmän monoliittisella rakenteella on haittansa. Tutkimuksissa on havaittu, että tavallisessa sovellusohjelmassa on 1–20 virhettä 1000 koodiriviä kohden. Koska käyttöjärjestelmä on paljon monimutkaisempi kuin tavallinen sovellusohjelma, se sisältää vielä enemmän virheitä jokaista tuhatta koodiriviä kohden. Niinpä miljoonien rivien kokoiset monoliittiset käyttöjärjestelmät aiheuttavat vakaus- ja tietoturvaongelmia.

Näitä ongelmia ehkäisemään kehitettiin mikroytimeen perustuva käyttöjärjestelmärakenne, jossa käyttöjärjestelmän toiminnallisuus hajautetaan kahteen osoiteavaruuteen: ydintilaan ja käyttäjätilaan. Jokainen ongelmia aiheuttava koodirivi siirretään käyttäjätilaan, ja ydintilaan jätetään pelkkä mikroydin. Nykyisin käyttöjärjestelmät soveltavat eri tapoja näiden kahden mallin välillä. Useat ovat kokonaan modulaarisia ja jotkin monoliittisia modulaarisilla ominaisuuksilla. Harvat jäävät puhtaasti monoliittisiksi.

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

Viitteet[muokkaa | muokkaa wikitekstiä]