Käyttöjärjestelmän ydin

Kohteesta Wikipedia
(Ohjattu sivulta Monoliittinen ydin)
Loikkaa: valikkoon, hakuun
Erilaiset käyttöjärjestelmäarkkitehtuurit 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 pääluokat[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 tilassa omassa osoiteavaruudessa ja tarjoaa muille ohjelmistoille järjestelmäkutsut ytimen toimintojen kutsumiseen. 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 OpenBSD, NetBSD, FreeBSD sekä SunOS.

Myös VMS on monoliittiseen ytimeen perustuva (tosin Digital kokeili myös mikroydintä).[1]

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. Symbian ja QNX ovat esimerkkejä mikroytimeen perustuvista menestyksekkäistä käyttöjärjestelmistä. Muita mikroytimeen perustuvia käyttöjärjestelmiä ovat BeOS ja Nextstep.

Mikroytimen keskeinen toimintaperiaate on viestien välittäminen moduulien välillä.[2] Kommunikaation aiheuttama kuormitus on myös merkittävä haittatekijä.[2][3]

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ä.

Vain harvat ytimet ovat puhtaasti monoliittisiä ytimiä tai mikroytimiä.[2] Linux ja Solaris toteuttavat ladattavia moduuleja ytimen osoiteavaruuteen.[2][4] Mac OS X yhdistää Mach-ytimeen BSD-ytimen ominaisuuksia.[2] Myös Windows NT on suurelta osin monoliittinen.[2]

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’.[5]»

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??[6]»

Ytimen suojaus[muokkaa | muokkaa wikitekstiä]

Tyypillisesti käyttöjärjestelmä ydin on suojattu omaan suoritustilaan (kernel-mode) ja se käyttää usein laitteiston fyysisiä osoitteita. Käyttäjäsovellukset ovat user-mode suoritustilassa ja käyttävät virtuaaliosoitteita niille varattuihin muistipaikkoihin. Ytimen suoritustila voidaan toteuttaa suorittimen ominaisuuksista riippuen korkeammalla suoritustasolla (supervisor-tila, Motorola 68000-sarja) tai käyttämällä ohjelmasegmentin tilaa (x86).[7]

On myös ytimiä, jotka eivät toteuta muistisuojausta, kuten Amiga OS, jonka piti toimia myös suorittimilla ilman muistinhallintayksikköä.[8]

Historiallisia syitä[muokkaa | muokkaa wikitekstiä]

Kun ensimmäiset modernit käyttöjärjestelmät kehiteltiin 1960-luvun alussa suorituskyky oli tärkeä suunnittelutavoite ja osin siksi ne oli kirjoitettu assemblyllä. Korkeamman tason ohjelmointikieliä oli jo laajalti käytössä sovellusohjelmointiin kuten Fortran ja ALGOL. Järjestelmäohjelmointikielet kuten C-kieli lisäsivät ylemmän tason kielien käyttöä käyttöjärjestelmien toteutuksessa. Tietokoneet olivat vielä rajatussa käytössä, jossa niiden käyttö oli operaattoreiden vastuulla. Ensimmäiset ytimet olivat pieniä ja käyttivät monoliittista rakenteeseen, jossa koko käyttöjärjestelmä toimi yhtenä suoritettavana binäärinä.

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.

IBM pyrki kehittämään Workplace OS käyttöjärjestelmää OSF Research Instituten kanssa perustuen Carnegie Mellon -yliopiston (CMU) Mach-mikrokerneliin, josta tuli yksi kalleimmista epäonnistumisista.[3]

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

Viitteet[muokkaa | muokkaa wikitekstiä]

  1. A Model and Prototype of VMS Using the Mach 3.0 Kernel Digital Equipment Corporation. Viitattu 22. kesäkuuta 2007.
  2. a b c d e f Silberschatz & Galvin & Gagne: Operating System Concepts Essentials (PDF) Viitattu 10.11.2017.
  3. a b Workplace Microkernel and OS: A Case Study University of California. Viitattu 20.1.2017.
  4. Nitesh Dhanjani & Gustavo Rodriguez: Loadable Kernel Module Programming and System Call Interception 1.2.2001. Linux Journal. Viitattu 22.11.2017.
  5. Linus Torvalds, Real World Technologies Discussion Forum Viitattu 9.5.2006.
  6. Sonny Rao, Real World Technologies Discussion Forum Viitattu 8.5.2006.
  7. John Gulbrandsen: How Do Windows NT System Calls REALLY Work? 26.8.2004. Viitattu 6.11.2017.
  8. It’s alive!: Ars reviews AmigaOS 4.1 23.9.2008. Ars Technica. Viitattu 10.11.2017.