Käyttöjärjestelmä määrittelee tietotekniikkakokemuksemme. Se on ensimmäinen ohjelmisto, jonka näemme, kun käynnistämme tietokoneen, ja viimeinen ohjelmisto, jonka näemme, kun tietokone sammutetaan. Se on ohjelmisto, joka mahdollistaa kaikki käyttämämme ohjelmat. Käyttöjärjestelmä organisoi ja ohjaa pöydällämme ja kädessämme olevaa laitteistoa, mutta useimmat käyttäjät eivät kuitenkaan osaa sanoa varmuudella, mitä käyttöjärjestelmä tarkalleen ottaen tekee.
Tässä HowStuffWorksin numerossa kerromme, mitä ohjelmiston on tehtävä, jotta sitä voidaan kutsua käyttöjärjestelmäksi, ja näytämme, miten käyttöjärjestelmä tekee laitteistokokoelmasta tehokkaan tietokonetyökalun!
The Bare Bones
On tärkeää ymmärtää, että kaikissa tietokoneissa ei ole käyttöjärjestelmää. Esimerkiksi tietokone, joka ohjaa keittiössäsi olevaa mikroaaltouunia, ei tarvitse käyttöjärjestelmää. Sillä on yksi joukko suhteellisen yksinkertaisia tehtäviä suoritettavana, hyvin yksinkertaisia syöttö- ja tulostustapoja (näppäimistö ja nestekidenäyttö) ja yksinkertaista, koskaan muuttumatonta laitteistoa ohjattavana. Tällaiselle tietokoneelle käyttöjärjestelmä olisi tarpeeton rasite, joka lisäisi monimutkaisuutta sinne, missä sitä ei tarvita. Sen sijaan mikroaaltouunissa oleva tietokone käyttää vain yhtä ohjelmaa koko ajan.
Mikroaaltouunin monimutkaisuutta monimutkaisemmissa tietokonejärjestelmissä käyttöjärjestelmä voi kuitenkin olla avain toiminnan tehostamiseen ja sovelluskehityksen helpottamiseen. Kaikissa pöytätietokoneissa on käyttöjärjestelmä. Yleisimpiä ovat Windows-käyttöjärjestelmäperhe, UNIX-käyttöjärjestelmäperhe ja Macintosh-käyttöjärjestelmät. Erikoissovelluksia varten on saatavilla satoja muita käyttöjärjestelmiä, mukaan lukien erikoisversiot suurtietokoneita, robotiikkaa, valmistusta, reaaliaikaisia ohjausjärjestelmiä ja niin edelleen varten.
Yksinkertaisimmillaan käyttöjärjestelmä tekee kaksi asiaa:
- Se hallinnoi tietokonejärjestelmän laitteisto- ja ohjelmistoresursseja. Näihin resursseihin kuuluvat esimerkiksi prosessori, muisti, levytila jne.
- Se tarjoaa vakaan ja johdonmukaisen tavan, jolla sovellukset voivat käsitellä laitteistoa ilman, että niiden tarvitsee tuntea kaikkia laitteiston yksityiskohtia.
Ensimmäinen tehtävä, laitteisto- ja ohjelmistoresurssien hallinta, on erittäin tärkeä, sillä erilaiset ohjelmat ja syöttömenetelmät kilpailevat keskusyksikön (CPU) huomiosta ja vaativat muistia, tallennustilaa ja I/O-kaistanleveyttä (input/output) omiin tarkoituksiinsa. Tässä roolissa käyttöjärjestelmä on hyvä vanhempi, joka huolehtii siitä, että kukin sovellus saa tarvitsemansa resurssit ja pelaa samalla hienosti kaikkien muiden sovellusten kanssa sekä käyttää järjestelmän rajallista kapasiteettia kaikkien käyttäjien ja sovellusten parhaaksi.
Toinen tehtävä, johdonmukaisen sovellusrajapinnan tarjoaminen, on erityisen tärkeää, jos käyttöjärjestelmää käyttää useampi kuin yksi tietyntyyppinen tietokone tai jos tietokoneen laitteisto voi joskus muuttua. Yhdenmukaisen sovellusrajapinnan (API) ansiosta ohjelmistokehittäjä voi kirjoittaa sovelluksen yhdelle tietokoneelle ja luottaa suurella varmuudella siihen, että se toimii toisella samantyyppisellä tietokoneella, vaikka muistin tai tallennustilan määrä olisi erilainen näissä kahdessa koneessa. Vaikka tietty tietokone olisikin ainutlaatuinen, käyttöjärjestelmä voi varmistaa, että sovellukset toimivat myös laitteiston päivitysten ja päivitysten yhteydessä, koska käyttöjärjestelmän eikä sovelluksen tehtävänä on hallita laitteistoa ja sen resurssien jakamista. Windows 98 on hyvä esimerkki käyttöjärjestelmän tarjoamasta joustavuudesta. Windows 98 toimii tuhansien eri valmistajien laitteistoissa. Se voi käyttää tuhansia erilaisia tulostimia, levyasemia ja erityisiä oheislaitteita kaikissa mahdollisissa yhdistelmissä.
Käyttöjärjestelmien laajassa perheessä on yleensä neljä tyyppiä, jotka luokitellaan sen mukaan, millaisia tietokoneita ne ohjaavat ja millaisia sovelluksia ne tukevat. Laajat luokat ovat:
- Reaaliaikainen käyttöjärjestelmä (RTOS) – Reaaliaikaisia käyttöjärjestelmiä käytetään koneiden, tieteellisten instrumenttien ja teollisuusjärjestelmien ohjaamiseen. RTOS:ssä on tyypillisesti hyvin vähän käyttöliittymäominaisuuksia eikä loppukäyttäjän apuohjelmia, koska järjestelmä on ”suljettu laatikko”, kun se toimitetaan käytettäväksi. Erittäin tärkeä osa RTOS:ää on tietokoneen resurssien hallinta siten, että tietty toiminto suoritetaan täsmälleen samassa ajassa joka kerta, kun se tapahtuu. Monimutkaisessa koneessa osan liikuttaminen nopeammin vain siksi, että järjestelmän resursseja on käytettävissä, voi olla yhtä katastrofaalista kuin se, että se ei liiku lainkaan, koska järjestelmä on varattu.
- Yksi käyttäjä, yksi tehtävä – Kuten nimikin kertoo, tämä käyttöjärjestelmä on suunniteltu hallitsemaan tietokonetta niin, että yksi käyttäjä voi tehokkaasti tehdä yhtä asiaa kerrallaan. Palm-kämmentietokoneiden Palm OS on hyvä esimerkki nykyaikaisesta yhden käyttäjän, yhden tehtävän käyttöjärjestelmästä.
- Yhden käyttäjän monitehtäväkäyttöjärjestelmä – Tällaista käyttöjärjestelmää useimmat ihmiset käyttävät nykyään pöytä- ja kannettavissa tietokoneissaan. Windows 98 ja MacOS ovat molemmat esimerkkejä käyttöjärjestelmästä, joka antaa yhden käyttäjän käyttää useita ohjelmia samanaikaisesti. On esimerkiksi täysin mahdollista, että Windows-käyttäjä kirjoittaa muistiinpanoa tekstinkäsittelyohjelmassa samalla kun hän lataa tiedoston Internetistä ja tulostaa sähköpostiviestin tekstiä.
- Monikäyttäjä – Monikäyttäjä-käyttöjärjestelmä antaa monelle eri käyttäjälle mahdollisuuden hyödyntää tietokoneen resursseja samanaikaisesti. Käyttöjärjestelmän on huolehdittava siitä, että eri käyttäjien vaatimukset ovat tasapainossa ja että jokaisella heidän käyttämällään ohjelmalla on riittävät ja erilliset resurssit, jotta yhden käyttäjän ongelma ei vaikuta koko käyttäjäkuntaan. Unix, VMS ja suurtietokoneiden käyttöjärjestelmät, kuten MVS, ovat esimerkkejä monikäyttäjäkäyttöjärjestelmistä.
On tärkeää erottaa tässä yhteydessä toisistaan monikäyttäjäkäyttöjärjestelmät ja yhden käyttäjän käyttöjärjestelmät, jotka tukevat verkottumista. Windows 2000 ja Novell Netware voivat kumpikin tukea satoja tai tuhansia verkkokäyttäjiä, mutta käyttöjärjestelmät itsessään eivät ole todellisia monikäyttäjäkäyttöjärjestelmiä. Järjestelmänvalvoja on Windows 2000:n tai Netwaren ainoa ”käyttäjä”. Verkkotuki ja kaikki verkon mahdollistamat etäkäyttäjien kirjautumiset ovat käyttöjärjestelmän kokonaissuunnitelmassa hallintakäyttäjän suorittama ohjelma.
Kun erilaiset käyttöjärjestelmätyypit ovat mielessä, on aika tarkastella käyttöjärjestelmän tarjoamia perustoimintoja.
Herätyssoitto
Kun tietokoneeseen kytketään virta, ensimmäinen ohjelma, joka käynnistyy, on yleensä tietokoneen lukumuistissa (ROM) säilytettävä ohjejoukko, joka tutkii järjestelmälaitteiston varmistaakseen, että kaikki toimii oikein. Tämä käynnistyksen itsetesti (Power-on Self Test, POST) tarkistaa suorittimen, muistin ja BIOS-järjestelmän (Basic Input-Output Systems) virheiden varalta ja tallentaa tulokset erityiseen muistipaikkaan. Kun POST on suoritettu onnistuneesti, ROM-muistiin ladattu ohjelmisto (jota kutsutaan joskus laiteohjelmaksi) alkaa aktivoida tietokoneen levyasemia. Useimmissa nykyaikaisissa tietokoneissa, kun tietokone aktivoi kiintolevyn, se löytää käyttöjärjestelmän ensimmäisen osan: bootstrap-laturin.
Bootstrap loader on pieni ohjelma, jolla on vain yksi tehtävä: Se lataa käyttöjärjestelmän muistiin ja antaa sen aloittaa toimintansa. Yksinkertaisimmillaan käynnistyslataaja asettaa pienet ajuriohjelmat, jotka ovat yhteydessä tietokoneen eri laitteiston osajärjestelmiin ja ohjaavat niitä. Se määrittää muistin osat, joihin käyttöjärjestelmä, käyttäjätiedot ja sovellukset sijoitetaan. Se luo tietorakenteet, joihin tallennetaan lukemattomat signaalit, liput ja semaforit, joita käytetään kommunikointiin tietokoneen osajärjestelmien ja sovellusten sisällä ja välillä. Sitten tietokoneen hallinta siirretään käyttöjärjestelmälle.
Käyttöjärjestelmän tehtävät jakautuvat yleisimmässä mielessä kuuteen luokkaan:
- Prosessorin hallinta
- Muistin hallinta
- Laitehallinta
- Tallennustilan hallinta
- Sovellusrajapinta
- Käyttäjärajapinta
Joidenkin mielestä käyttöjärjestelmän pitäisi hoitaa muitakin kuin näitä kuutta tehtävää, ja jotkut käyttöjärjestelmätoimittajat rakentavatkin käyttöjärjestelmiinsä paljon enemmän apuohjelmia ja aputoimintoja, nämä kuusi tehtävää määrittelevät lähes kaikkien käyttöjärjestelmien ytimen. Tarkastellaan seuraavaksi työkaluja, joita käyttöjärjestelmä käyttää kunkin tehtävän suorittamiseen.
Prosessorin hallinta
Prosessorin hallinnan ytimessä on kaksi toisiinsa liittyvää asiaa:
- Varmuus siitä, että jokainen prosessi ja sovellus saa riittävästi prosessorin aikaa toimiakseen kunnolla
- Käytetään mahdollisimman paljon prosessorisyklejä todelliseen työhön
Ohjelmiston perusyksikkö, jota käyttöjärjestelmä käsittelee prosessorin tekemän työn aikatauluttamisessa, on käyttöjärjestelmästä riippuen joko prosessi tai säie.
On houkuttelevaa ajatella prosessia sovelluksena, mutta se antaa epätäydellisen kuvan siitä, miten prosessit liittyvät käyttöjärjestelmään ja laitteistoon. Näkemäsi sovellus (tekstinkäsittelyohjelma, taulukkolaskentaohjelma tai peli) on tosiaan prosessi, mutta kyseinen sovellus voi käynnistää useita muita prosesseja, jotka suorittavat tehtäviä, kuten yhteydenpitoa muiden laitteiden tai muiden tietokoneiden kanssa. On myös lukuisia prosesseja, jotka toimivat ilman suoraa näyttöä niiden olemassaolosta. Prosessi on siis ohjelmisto, joka suorittaa jonkin toiminnon ja jota käyttäjä, muut sovellukset tai käyttöjärjestelmä voivat ohjata.
Käyttöjärjestelmä ohjaa prosesseja, ei sovelluksia, ja ajoittaa ne suorittimen suoritettaviksi. Yhden tehtävän järjestelmässä aikataulutus on suoraviivaista. Käyttöjärjestelmä antaa sovelluksen aloittaa suorituksen ja keskeyttää sen suorittamisen vain niin pitkäksi aikaa, että se voi käsitellä keskeytyksiä ja käyttäjän syötteitä. Keskeytykset ovat laitteiston tai ohjelmiston suorittimelle lähettämiä erityisiä signaaleja. Se on ikään kuin jokin tietokoneen osa nostaisi yhtäkkiä kätensä ja pyytäisi prosessorin huomiota vilkkaassa kokouksessa. Joskus käyttöjärjestelmä aikatauluttaa prosessien prioriteetin niin, että keskeytykset peittyvät – eli käyttöjärjestelmä jättää huomiotta joistakin lähteistä tulevat keskeytykset, jotta tietty työ voidaan suorittaa loppuun mahdollisimman nopeasti. On joitakin keskeytyksiä (esimerkiksi virhetilanteista tai muistiongelmista johtuvia), jotka ovat niin tärkeitä, ettei niitä voi jättää huomiotta. Nämä ei-maskoitavat keskeytykset (NMI:t) on käsiteltävä välittömästi riippumatta muista käsillä olevista tehtävistä.
Ja vaikka keskeytykset monimutkaistavat jonkin verran prosessien suorittamista yksitehtäväjärjestelmässä, käyttöjärjestelmän työ muuttuu paljon monimutkaisemmaksi monitehtäväjärjestelmässä. Nyt käyttöjärjestelmän on järjestettävä sovellusten suoritus niin, että uskot, että samanaikaisesti tapahtuu useita asioita. Tämä on monimutkaista, koska suoritin voi tehdä vain yhtä asiaa kerrallaan. Jotta saadaan aikaan vaikutelma, että samanaikaisesti tapahtuu paljon asioita, käyttöjärjestelmän on vaihdettava eri prosessien välillä tuhansia kertoja sekunnissa. Näin se tapahtuu.
- Prosessi vie tietyn määrän RAM-muistia. Se käyttää myös rekistereitä, pinoja ja jonoja suorittimen ja käyttöjärjestelmän muistialueella.
- Kun kaksi prosessia on monitehtävässä, käyttöjärjestelmä jakaa tietyn määrän suorittimen suoritusjaksoja yhdelle ohjelmalle.
- Tämän syklimäärän jälkeen käyttöjärjestelmä tekee kopiot kaikista prosessien käyttämistä rekistereistä, pinoista ja jonoista ja merkitsee muistiin kohdan, jossa prosessi keskeytti suorituksensa.
- Sen jälkeen se lataa kaikki toisen prosessin käyttämät rekisterit, pinot ja jonot ja antaa sille tietyn määrän suoritinsyklejä.
- Kun nämä ovat päättyneet, se tekee kopiot kaikista toisen ohjelman käyttämistä rekistereistä, pinoista ja jonoista ja lataa ensimmäisen ohjelman.
Kaikki tiedot, joita tarvitaan prosessin seuraamiseen vaihdon aikana, säilytetään datapaketissa, jota kutsutaan prosessinohjauslohkoksi. Prosessinohjauslohko sisältää tyypillisesti:
- Tunnistenumero, joka yksilöi prosessin
- Ohjeita ohjelmassa ja sen tiedoissa oleviin paikkoihin, joissa käsittely viimeksi tapahtui
- Rekisterien sisältö
- Erilaisten lippujen ja kytkimien tilat
- Ohjeita ylempään prosessin tarvitseman muistin ylä- ja alarajaan
- Luettelo prosessin avaamista tiedostoista
- Prosessin prioriteetti
- Kaikkien prosessin tarvitsemien I/O-laitteiden tila
Kun prosessin tila muuttuu, esimerkiksi odottavasta aktiiviseksi tai keskeytetystä käynnissä olevaksi, prosessin ohjauslohkon tietoja on käytettävä kuten minkä tahansa muun ohjelman tietoja ohjaamaan käyttöjärjestelmän tehtävänvaihto-osan suoritusta.
Tämä prosessinvaihto tapahtuu ilman suoraa käyttäjän puuttumista asiaan, ja jokainen prosessi saa riittävästi prosessisyklejä suorittaakseen tehtävänsä kohtuullisessa ajassa. Ongelmia voi kuitenkin tulla, jos käyttäjä yrittää saada liian monta prosessia toimimaan samanaikaisesti. Käyttöjärjestelmä itse tarvitsee jonkin verran suoritinsykliä suorittaakseen kaikkien sovellusprosessien rekisterien, jonojen ja pinojen tallentamisen ja vaihtamisen. Jos prosesseja käynnistetään tarpeeksi ja jos käyttöjärjestelmää ei ole suunniteltu huolellisesti, järjestelmä voi alkaa käyttää suurinta osaa käytettävissä olevista suorittimensykleistä prosessien väliseen vaihtoon prosessien suorittamisen sijasta. Kun näin tapahtuu, sitä kutsutaan thrashingiksi, ja se vaatii yleensä jonkinlaista suoraa käyttäjän väliintuloa prosessien pysäyttämiseksi ja järjestyksen palauttamiseksi järjestelmään.
Yksi tapa, jolla käyttöjärjestelmien suunnittelijat vähentävät thrashingin mahdollisuutta, on vähentää uusien prosessien tarvetta suorittaa erilaisia tehtäviä. Jotkin käyttöjärjestelmät sallivat ”prosessin kevytmuotoisen”, säikeeksi kutsutun prosessin, joka voi hoitaa kaikki tavallisen prosessin suorittimen vaatima työ, mutta ei yleensä hoida erilaisia I/O-tyyppejä eikä luo rakenteita, jotka vaativat tavallisen prosessin laajan prosessinohjauslohkon. Prosessi voi käynnistää useita säikeitä tai muita prosesseja, mutta säie ei voi käynnistää prosessia.
Tähän mennessä kaikki käsittelemämme aikataulutus on koskenut yhtä prosessoria. Järjestelmässä, jossa on kaksi tai useampia suorittimia, käyttöjärjestelmän on jaettava työmäärä suorittimien kesken ja pyrittävä tasapainottamaan vaadittujen prosessien vaatimukset eri suorittimissa käytettävissä olevien syklien kanssa. Epäsymmetriset käyttöjärjestelmät käyttävät yhtä prosessoria omiin tarpeisiinsa ja jakavat sovellusprosessit muiden prosessoreiden kesken. Symmetriset käyttöjärjestelmät jakavat itsensä eri suorittimille ja tasapainottavat kysyntää ja suorittimen saatavuutta myös silloin, kun vain itse käyttöjärjestelmä on käynnissä.
Kaikkakin käyttöjärjestelmä on ainoa ohjelmisto, jolla on suoritustarpeita, suoritin ei ole ainoa resurssi, jota aikataulutetaan. Muistinhallinta on seuraava ratkaiseva vaihe sen varmistamisessa, että kaikki prosessit toimivat sujuvasti.
Muistin ja tallennustilan hallinta
Kun käyttöjärjestelmä hallitsee tietokoneen muistia, siinä on kaksi laajaa tehtävää:
- Kullakin prosessilla on oltava riittävästi muistia suoritettavaksi, eikä se voi ajaa toisen prosessin muistitilaan eikä joutua toisen prosessin ajamaksi.
- Järjestelmän eri muistityyppejä on käytettävä oikein, jotta kukin prosessi voi toimia mahdollisimman tehokkaasti.
Ensimmäinen tehtävä edellyttää, että käyttöjärjestelmä asettaa muistirajat ohjelmistotyypeille ja yksittäisille sovelluksille.
Tarkastellaan esimerkkinä kuvitteellista järjestelmää, jossa on 1 megatavu (1 000 kilotavua) RAM-muistia. Käynnistysprosessin aikana kuvitteellisen tietokoneemme käyttöjärjestelmä on suunniteltu menemään käytettävissä olevan muistin yläpäähän ja sitten ”taaksepäin” niin pitkälle, että se täyttää itse käyttöjärjestelmän tarpeet. Oletetaan, että käyttöjärjestelmä tarvitsee 300 kilotavua toimiakseen. Nyt käyttöjärjestelmä menee RAM-muistivaraston pohjalle ja alkaa rakentaa erilaisia ajuriohjelmistoja, joita tarvitaan tietokoneen laitteiston osajärjestelmien ohjaamiseen. Kuvitteellisessa tietokoneessamme ajurit vievät 200 kilotavua. Kun käyttöjärjestelmä on siis ladattu kokonaan, sovellusprosesseille jää 500 kilotavua.
Kun sovelluksia aletaan ladata muistiin, ne ladataan käyttöjärjestelmän määrittelemissä lohkokokoluokissa. Jos lohkokoko on 2 kilotavua, jokaiselle ladattavalle prosessille annetaan lohko muistia, jonka koko on 2 kilotavun monikerta. Sovellukset ladataan näihin kiinteisiin lohkokokoihin, ja lohkot alkavat ja päättyvät 4 tai 8 tavun sanojen määrittämiin rajoihin. Näiden lohkojen ja rajojen avulla voidaan varmistaa, että sovelluksia ei ladata toistensa tilan päälle huonosti lasketulla bitillä tai kahdella. Kun tämä on varmistettu, suurempi kysymys on, mitä tehdään, kun 500 kilotavun sovellustila on täynnä.
Useimmissa tietokoneissa on mahdollista lisätä muistia alkuperäisen kapasiteetin yli. Voit esimerkiksi laajentaa RAM-muistia 1 megatavusta 2 megatavuun. Tämä toimii hyvin, mutta on yleensä suhteellisen kallista. Se jättää myös huomiotta erään tietojenkäsittelyn perustavanlaatuisen tosiasian – suurinta osaa sovelluksen muistiin tallentamista tiedoista ei käytetä millään hetkellä. Prosessori voi käyttää vain yhtä muistipaikkaa kerrallaan, joten suurin osa RAM-muistista on käyttämättömänä milloin tahansa. Koska levytila on halpaa verrattuna RAM-muistiin, RAM-muistissa olevien tietojen siirtäminen kiintolevylle voi laajentaa RAM-muistitilaa huomattavasti ilman kustannuksia. Tätä tekniikkaa kutsutaan virtuaalimuistin hallinnaksi.
Kiekkomuisti on vain yksi niistä muistityypeistä, joita käyttöjärjestelmän on hallittava, ja se on hitain. Tietokonejärjestelmän muistityypit ovat nopeusjärjestyksessä seuraavat:
- Nopea välimuisti – Tämä on nopeaa, suhteellisen pientä muistia, joka on prosessorin käytettävissä nopeimpien yhteyksien kautta. Välimuistiohjaimet ennustavat, mitä tietoja CPU tarvitsee seuraavaksi, ja vetävät ne keskusmuistista suurnopeusvälimuistiin nopeuttaakseen järjestelmän suorituskykyä.
- Päämuisti – Tämä on RAM-muisti, joka näkyy megatavuina mitattuna tietokonetta ostettaessa.
- Toissijainen muisti – Tämä on useimmiten jonkinlainen pyörivä magneettimuisti, joka pitää sovellukset ja tiedot käytettävissä ja toimii virtuaalisena RAM-muistina käyttöjärjestelmän valvonnassa.
Käyttöjärjestelmän on tasapainotettava eri prosessien tarpeet eri muistityyppien saatavuuden kanssa ja siirrettävä tietoja lohkoina (joita kutsutaan sivuiksi) käytettävissä olevan muistin välillä prosessien aikataulun mukaan.
Laitehallinta
Polku käyttöjärjestelmän ja lähes kaikkien muiden kuin tietokoneen emolevyllä olevien laitteistojen välillä kulkee ajuriksi kutsutun erikoisohjelman kautta. Suuri osa ajurin tehtävästä on toimia kääntäjänä laitteiston osajärjestelmien sähköisten signaalien ja käyttöjärjestelmän ja sovellusohjelmien korkean tason ohjelmointikielten välillä. Ajurit ottavat tiedot, jotka käyttöjärjestelmä on määritellyt tiedostoksi, ja kääntävät ne bittivirroiksi, jotka sijoitetaan tiettyihin paikkoihin tallennuslaitteissa, tai sarjaksi laserpulsseja tulostimessa.
Koska ajureiden avulla ohjattavissa laitteistoissa on niin suuria eroja, myös ajuriohjelmien toimintatavoissa on eroja, mutta useimmat ajetaan, kun laitetta tarvitaan, ja ne toimivat pitkälti samalla tavalla kuin muutkin prosessit. Käyttöjärjestelmä antaa usein korkean prioriteetin lohkoja ajureille, jotta laitteistoresurssi voidaan vapauttaa ja valmistella jatkokäyttöä varten mahdollisimman nopeasti.
Yksi syy siihen, että ajurit ovat erillään käyttöjärjestelmästä, on se, että ajuriin – ja siten laitteiston osajärjestelmiin – voidaan lisätä uusia toimintoja ilman, että itse käyttöjärjestelmää tarvitsee muuttaa, kääntää uudelleen ja jakaa uudelleen. Uusien laitteistoajurien kehittämisellä, jonka usein suorittaa tai kustantaa osajärjestelmien valmistaja eikä käyttöjärjestelmän julkaisija, voidaan parantaa huomattavasti koko järjestelmän syöttö-/lähtöominaisuuksia.
Syötön ja tulostuksen hallinta on suurelta osin jonojen ja puskureiden hallintaa, erityisten tallennusvälineiden hallintaa, jotka ottavat bittivirran laitteelta, ehkä näppäimistöltä tai sarjaportilta, pitävät nämä bitit ja luovuttavat ne suorittimelle riittävän hitaasti, jotta suoritin pystyy selviytymään niistä. Tämä toiminto on erityisen tärkeä silloin, kun useita prosesseja on käynnissä ja ne vievät prosessoriaikaa. Käyttöjärjestelmä käskee puskuria jatkamaan syötteen vastaanottamista laitteelta, mutta lopettamaan tietojen lähettämisen suorittimelle, kun syötettä käyttävä prosessi on keskeytetty. Kun syötettä tarvitseva prosessi aktivoidaan uudelleen, käyttöjärjestelmä käskee puskuria lähettämään tietoja. Tämän prosessin ansiosta näppäimistö tai modeemi voi käsitellä ulkoisia käyttäjiä tai tietokoneita suurella nopeudella, vaikka on aikoja, jolloin keskusyksikkö ei voi käyttää näiltä lähteiltä tulevaa syötettä.
Tietokonejärjestelmän kaikkien resurssien hallinta on suuri osa käyttöjärjestelmän tehtävistä, ja reaaliaikaisissa käyttöjärjestelmissä se voi olla käytännössä kaikki tarvittava toiminto. Muissa käyttöjärjestelmissä kuitenkin suhteellisen yksinkertaisen ja johdonmukaisen tavan tarjoaminen sovelluksille ja ihmisille käyttää laitteiston tehoa on olennainen osa niiden olemassaolon syytä.
Rajapinta maailmaan
Sovellusrajapinta
Aivan kuten ajurit tarjoavat sovelluksille tavan käyttää laitteiston osajärjestelmiä ilman, että niiden tarvitsee tuntea laitteiston toiminnan jokaista yksityiskohtaa, sovellusohjelmointirajapinnat (API) antavat sovellusten ohjelmoijille mahdollisuuden käyttää tietokoneen ja käyttöjärjestelmän toimintoja ilman, että heidän tarvitsee suoraan seurata kaikkia prosessorin toiminnan yksityiskohtia. Tarkastellaan esimerkkiä kiintolevytiedoston luomisesta tietojen säilyttämistä varten, jotta nähdään, miksi tämä voi olla tärkeää.
Ohjelmoija, joka kirjoittaa sovelluksen tieteellisen laitteen tietojen tallentamiseksi, saattaa haluta antaa tutkijan määrittää luodun tiedoston nimen. Käyttöjärjestelmä saattaa tarjota API-funktion nimeltä MakeFile tiedostojen luomista varten. Ohjelmaa kirjoittaessaan ohjelmoija lisäisi rivin, joka näyttää tältä:
MakeFile
Tässä esimerkissä ohje käskee käyttöjärjestelmää luomaan tiedoston, joka sallii satunnaisen pääsyn dataansa (1), jolla on käyttäjän kirjoittama nimi (%Name) ja jonka koko vaihtelee sen mukaan, kuinka paljon dataa tiedostoon tallennetaan (2). Katsotaan nyt, mitä käyttöjärjestelmä tekee muuttaakseen käskyn toiminnaksi.
- Ohjausjärjestelmä lähettää levyasemalle kyselyn saadakseen ensimmäisen vapaan tallennuspaikan sijainnin.
- Tämän tiedon avulla käyttöjärjestelmä luo tiedostojärjestelmään merkinnän, josta käy ilmi tiedoston alku- ja loppupaikka, tiedoston nimi, tiedostotyyppi, onko tiedosto arkistoitu, millä käyttäjillä on oikeus katsoa tai muokata tiedostoa sekä tiedoston luontipäivämäärä ja -aika.
- Ohjausjärjestelmä kirjoittaa tiedoston alkuun tietoja, jotka yksilöivät tiedoston, määrittelevät mahdollisen käyttöoikeuden tyypin ja sisältävät muita tietoja, jotka sitovat tiedoston sovellukseen.
Kaikki nämä tiedot, levyaseman kyselyt ja tiedoston alku- ja loppupisteen osoitteet ovat muodoissa, jotka riippuvat voimakkaasti levyaseman valmistajasta ja mallista.
Koska ohjelmoija on kirjoittanut ohjelmansa käyttämään levytallennuksen API:ta, hänen ei tarvitse pysyä perillä kaikkien mahdollisten kiintolevy- ja nauha-asemien käskykoodeista, tietotyypeistä ja vastauskoodeista. Käyttöjärjestelmä, joka on yhteydessä eri laitteiston osajärjestelmien ajureihin, huolehtii laitteiston muuttuvista yksityiskohdista — ohjelmoijan on vain kirjoitettava API:n koodia ja luotettava siihen, että käyttöjärjestelmä hoitaa loput.
API:ista on tullut viime vuosina yksi tietokoneteollisuuden kiistellyimmistä alueista. Yritykset ymmärtävät, että niiden API-rajapintoja käyttävät ohjelmoijat saavat viime kädessä mahdollisuuden hallita tiettyä osaa teollisuudesta ja saada siitä voittoa. Tämä on yksi syy siihen, että niin monet yritykset ovat olleet halukkaita tarjoamaan lukulaitteiden tai katselulaitteiden kaltaisia sovelluksia yleisölle ilmaiseksi. Ne tietävät, että kuluttajat pyytävät, että ohjelmat hyödyntävät ilmaisia lukulaitteita, ja sovellusyritykset ovat valmiita maksamaan rojalteja, jotta niiden ohjelmat voivat tarjota kuluttajien pyytämiä toimintoja.
Käyttäjän käyttöliittymä
Aivan kuten API tarjoaa sovelluksille yhtenäisen tavan käyttää tietokonejärjestelmän resursseja, käyttöliittymä (User Interface, UI) tuo rakenteen käyttäjän ja tietokoneen väliseen vuorovaikutukseen. Viime vuosikymmenen aikana lähes kaikki käyttöliittymien kehitys on tapahtunut graafisen käyttöliittymän (GUI) alalla, ja kaksi mallia, Applen Macintosh ja Microsoftin Windows, ovat saaneet eniten huomiota ja saaneet suurimman osan markkinaosuudesta. Muille käyttöjärjestelmille on olemassa muitakin käyttöliittymiä, joista osa on graafisia ja osa ei.
Unixissa on esimerkiksi kuoriksi kutsuttuja käyttöliittymiä, jotka esittävät käyttöliittymän, joka on joustavampi ja tehokkaampi kuin käyttöjärjestelmän tavallinen tekstipohjainen käyttöliittymä. Ohjelmat, kuten Korn Shell ja C Shell, ovat tekstipohjaisia käyttöliittymiä, jotka lisäävät tärkeitä apuohjelmia, mutta niiden päätarkoitus on helpottaa käyttäjän käyttöjärjestelmän toimintojen käsittelyä. On olemassa myös graafisia käyttöliittymiä, kuten X-Windows ja Gnome, jotka tekevät Unixista ja Linuxista käyttäjän näkökulmasta enemmän Windows- ja Macintosh-tietokoneiden kaltaisia.
On tärkeää muistaa, että kaikissa näissä esimerkeissä käyttöliittymä on ohjelma tai joukko ohjelmia, joka sijaitsee kerroksena itse käyttöjärjestelmän yläpuolella. Sama pätee, hieman erilaisin mekanismein, sekä Windows- että Macintosh-käyttöjärjestelmiin. Käyttöjärjestelmän ydintoiminnot, tietokonejärjestelmän hallinta, sijaitsevat käyttöjärjestelmän ytimessä. Näytönhallinta on erillinen, vaikka se voi olla tiukasti sidottu ytimen alla olevaan ytimeen. Käyttöjärjestelmän ytimen ja käyttöliittymän, apuohjelmien ja muiden ohjelmistojen väliset yhteydet määrittelevät monet käyttöjärjestelmien erot nykyisin ja tulevat määrittelemään niitä edelleen tulevaisuudessa.
Tulevaisuus
Eräs käyttöjärjestelmien tulevaisuutta koskeva kysymys pyörii sen ympärillä, pystyykö tietty ohjelmistojen jakelufilosofia luomaan käyttöjärjestelmän, jota yritykset ja kuluttajat voivat käyttää yhdessä.
Linux, avoimen lähdekoodin periaatteiden mukaan luotu ja jaettu käyttöjärjestelmä, voi vaikuttaa merkittävästi käyttöjärjestelmiin yleensä. Useimmat käyttöjärjestelmät, ajurit ja apuohjelmat ovat kaupallisten organisaatioiden kirjoittamia, jotka jakavat ohjelmistojensa suoritettavia versioita – versioita, joita ei voi tutkia tai muuttaa. Avoin lähdekoodi edellyttää alkuperäisen lähdemateriaalin jakelua, jota voidaan tutkia, muuttaa ja rakentaa sen pohjalta, ja tuloksia voidaan jälleen jakaa vapaasti.
Internetin jatkuva kasvu ja sellaisten tietokoneiden yleistyminen, jotka eivät ole tavallisia pöytätietokoneita tai kannettavia tietokoneita, tarkoittaa, että käyttöjärjestelmät muuttuvat pysyäkseen mukana, mutta keskeiset hallinta- ja käyttöliittymätoiminnot jatkuvat, vaikka ne kehittyvätkin.