Käyttöjärjestelmän rakenteesta: monoliittinen / microkernel =========================================================== Alussa taisin mainita, että käyttöjärjestelmän tehtävä kaikkein yleisimmillän on tarjota kaikkein alimman tasoinen ja vähiten abstrakti virtuaalikonerajapinta, joka abstrahoi fyysisen laitteiston käytön. Tässä vaiheessa kurssia alkanee alustavasti hahmottua, mitä osa-alueita tuon päätehtävän toteuttaminen vaatii. Voitaisiin sanoa, että käyttöjärjestelmän tehtäviä ovat ainakin prosessinhallinta, muistinhallinta, tiedostonhallinta, I/O -laitteiden hallinta. Nämäkin yläkäsitteet sitten jakautuvat täsmällisempiin alitehtäviin ja -osiin. Iso ohjelma, kuten käyttöjärjestelmä, on syytä kirjoittaa modulaarisesti, eli siten, että yksi tehtävä hoituu mahdollisimman tarkkaan rajatulla ohjelmakoodilla, moduulilla, joka tarjoaa selkeän ja tarkoituksenmukaisen rajapinnan muille moduuleille. Luentomonisteen alussa puhutaan hieman käyttöjärjestelmien tehtävistä ja rakenteesta. Siellä mainitaan mm. monoliittinen eli kerrosmainen käyttöjärjestelmätoteutus ja sitten microkernel-rakenne. Mielestäni nämä toteutusmahdollisuudet alkavat olla paremmin ymmärrettävissä tässä vaiheessa kurssia, kun ollaan (toivottavasti) päästy kärryille prosessorilaitteistosta, prosessorin kernel/user -toimintatiloista sekä kontekstinvaihdoista ja vielä prosessien välisestä kommunikaatiostakin. Monoliittinen käyttöjärjestelmätoteutus: - Koko käyttöjärjestelmä kaikkine palveluineen on koko ajan muistisssa siitä asti kun se on ladattu käynnistyksen yhteydessä. - Käyttöjärjestelmää voidaan ajatella yhtenä erityisenä prosessina, jolla on konteksti ja muistialueita (tosin siis todellisina eikä virtuaalisina muistiosoitteina) - Kaikki käyttöjärjestelmän palvelut toimitetaan prosessorin ollessa käyttöjärjestelmätilassa, johon se päätyy aina keskeytyksen tullessa. - mm. bugi laiteajurissa voi jumittaa koko koneen, jos keskeytykset ovat estettynä; silloinhan vuorontajakoodi ei pääse hallitsemaan prosesseja... - Käyttöjärjestelmäohjelmiston käsitteellinen ja lähdekoodissa toteutuva modulaarisuus ei ilmene sen suorituksessa: Suojausta moduulien välillä ei ole laitteistotasolla -- periaatteessa kaikilla moduuleilla on (väärin ohjelmoituna) mahdollisuus kajota toistensa datoihin ja sotkea kokonaisuuden toiminta perusteellisesti. Monoliittisen käyttöjärjestelmän toteuttaminen on kurinalaista ja vaativaa. Siis bugeja tulee melkeinpä väistämättä, kun erehtyväiset ihmiset näitä koodaavat. - Uuden ominaisuuden lisääminen käyttöjärjestelmään, tai jonkun toiminnallisuuden muuttaminen edellyttää koko käyttöjärjestelmäkoodin kääntämistä uudelleen, vanhan binääritiedoston korvaamista uudella, ja tietokoneen uudelleenkäynnistämistä asennuksen jälkeen. Monoliittisessa käyttöjärjestelmässä on siis tiettyjä hankaluuksia. Kuitenkin nykyään useimmiten näemme käytännössä monoliittisia käyttöjärjestelmiä. Syitä ovat ainakin seuraavat: - monoliittiset ovat toistaiseksi tehokkaampia (eli prosessoriaikaa jää käyttäjäprosessien suorittamiseen enemmän, kun käyttöjärjestelmäprosessi ei vaadi niin paljon aikaa esim. suojattuun viestinvälitykseen moduuliensa välillä) - ei ole vielä tehty yleisimmin käytettyjä käyttöjärjestelmiä uudellen alusta alkaen siten, että rakenne olisi erilainen. Microkernel-rakenne puolestaan olisi seuraava: - Käyttöjärjestelmän "ytimen ydin" (se joka toimii käyttöjärjestelmätilassa) tosi pieni, siis "micro" "kernel". Microkernelin tehtävänä olisi esim. lähinnä vuorontaminen, fyysisen muistin varaaminen, keskeytyskäsittelyn aloitus ja minimalistinen viestinvälitys prosessien välillä. - Laiteajurit, muistinhallinnan algoritmit, tiedostonhallinta ym. lisäosat toimivat käyttäjätilassa eli prosesseina siinä missä mikä tahansa prosessi! - Käyttäjän prosessi (sovellusohjelma) pyytää palveluita käyttöjärjestelmän prosesseilta. Kaikki tapahtuu prosessorin kannalta käyttäjätilassa, paitsi viestinvälitys ja primitiivisimmät laiteoperaatiot. - mm. suojatumpi, helpompi saada vakaaksi; modulaarisempi -- eli monet monoliittisen käyttöjärjestelmän ongelmat korjautuisivat. - edellyttää tehokasta IPC:tä käyttäjätilassa toimivien osien välillä Tutkimus microkernel-mallista on aktiivista, ja voi olla että tulevaisuudessa ainakin uudet käyttöjärjestelmät voivat hyvinkin olla microkernel-tyyppisiä, jos tehokkuudessa päästään jollain keinoin lähelle monoliittista mallia.