Käyttöjärjestelmän ydin
Ydin eli kerneli () 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 (). 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.
Monoliittinen ydin sisältää kaikki käyttöjärjestelmätoiminnot samassa osoiteavaruudessa, ydintilassa (). 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ä).
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 (). 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ä. Kommunikaation aiheuttama kuormitus on myös merkittävä haittatekijä.
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ä. Linux ja Solaris toteuttavat ladattavia moduuleja ytimen osoiteavaruuteen. Mac OS X yhdistää Mach-ytimeen BSD-ytimen ominaisuuksia. Myös Windows NT on suurelta osin monoliittinen.
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:
Samoilla linjoilla on IBM:n Sonny Rao:
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).
On myös ytimiä, jotka eivät toteuta muistisuojausta, kuten Amiga OS, jonka piti toimia myös suorittimilla ilman muistinhallintayksikköä.
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 Institute"n kanssa perustuen Carnegie Mellon -yliopiston (CMU) Mach-mikrokerneliin, josta tuli yksi kalleimmista epäonnistumisista.