pienoiskuva|200px|Kaavio käyttöjärjestelmän sijoittumisesta. Osat ylhäältä alkaen:1. Käyttäjä2. Sovellus 3. Käyttöjärjestelmä 4. Laitteisto Käyttöjärjestelmä on keskeinen tietokoneen ohjelmisto, joka mahdollistaa sovellusohjelmien toiminnan tietokoneessa. Sen tehtäviin kuuluu tietokonelaitteiston hallinta, laitteiston yksityiskohdista riippumattoman operointialustan tarjoaminen (abstraktio, virtualisointi) ja järjestelmäkutsujen toteuttaminen. Näiden lisäksi käyttöjärjestelmälle kuuluu huolehtiminen muun muassa tiedostojärjestelmästä, muistinhallinnasta, rinnakkaisuudesta, verkkoprotokollista, tietoturvasta ja lokeista. Myös erilaiset standardit, kuten POSIX, sitä laajentava Single UNIX Specification (SUS) tai Linux Standard Base (LSB) määrittelevät käyttöjärjestelmälle asetettavia vaatimuksia.
Historia
Ensimmäisissä tietokoneissa ei vielä ollut käyttöjärjestelmää. Ohjelmat kirjoitettiin reikäkorteille, paperi- tai magneettinauhoille, ja tietokoneelle annettiin tietty aika suorittaa ne. Jokainen suoritettava ohjelma piti ohjelmoida yksilöllisesti tietylle tietokoneelle, ja ohjelman tuli hallita kaikkia tietokoneen komponentteja ja oheislaitteita. Useiden ohjelmien samanaikainen käyttäminen oli hankalaa ja aikaa vievää, koska moniajoa ei ollut. Jos halusi suorittaa ohjelman uudelleen toisella syötteellä (input, annettu lähtöarvo), piti ladata ensin toinen ohjelma koneeseen ja suorittaa se, minkä jälkeen vaihtaa jälleen takaisin alkuperäiseen ohjelmaan, kelata se oikeaan kohtaan nauhaa tai levyä ja antaa itse toisen ohjelman syöte (input, lähtöarvo) kyseisen ohjelman lähteenä (output, lopputuloksena). Ohjelman suorittaminen toisenlaisella tietokoneella vaati ohjelman ohjauskäskyjen kirjoittamista uudelleen toisen tietokoneen käskykannan mukaiseksi. Tämä hidasti ohjelmien käyttämistä muussa kuin samantyyppisessä tietokoneessa.Andrew S. Tanenbaum: Modern Operating Systems, Prentice Hall, 2001.
Varhaiset tietokoneohjelmat käyttivät suoraan tietokoneen fyysistä muistia ilman abstraktiota ja käytössä oli vain yksi ohjelma kerrallaan. Kun ohjelmaa voitiin vaihtaa suorituksen aikana aiemmat olettamukset eivät pitäneet paikkaansa ja tuli tarve jakaa tietokoneen muisti osoiteavaruuksiin.
Ensimmäiset käyttöjärjestelmät suunniteltiin 1950- ja 1960-luvuilla. Ne laadittiin prosessien suoritusnopeutta ajatellen monoliittisiksi, yhtenä binääritiedostona toimiviksi ydintilassa.
Ferrantin valmistama Atlas oli luultavasti ensimmäinen tietokone, jonka kontrolliohjelmaa voitiin kutsua ensimmäiseksi oikeaksi käyttöjärjestelmäksi. Tietokoneessa oli myös tuki virtuaalimuistille.
Ensimmäisten käyttöjärjestelmien muistirajoitus oli vain 32 tuhatta sanaa, mikä esti monimutkaisten käyttöjärjestelmien ohjelmoimisen. Niinpä käyttöjärjestelmät pysyivät helposti ohjelmoitavina. Teknisen kehityksen myötä käyttöjärjestelmien kokorajoitukset poistuivat. Tämä johti käyttöjärjestelmiin, jotka sisälsivät miljoonia rivejä koodia. Ohjelmakoodin monimutkaistumisen vuoksi harva ohjelmoija tunsi enää käyttöjärjestelmän toiminnan kokonaisuudessaan.
1960-luvun lopulla AT&T päätti lähteä Multics-projektista ja siirtää voimavaransa muualle. Bell Labsilla kehitettiin projektin päättymisen jälkeen Unix. Ken Thompson suunnitteli Unixin ytimestä pienen ja siirsi useimmat toiminnot ytimestä käyttäjäavaruuteen: ydin oli vain noin C-kielellä tehtyä koodia ja noin assemblyä. Unix oli ensimmäinen käyttöjärjestelmä, joka oli siirrettävissä eri laitealustoille.
VAX-minitietokoneiden kanssa julkaistu VMS oli suosittu 1980-luvulla.
Käyttöjärjestelmäarkkitehtuuri pienoiskuva|400px|Yleiset käyttöjärjestelmäarkkitehtuurit vertailussa
Käyttöjärjestelmän arkkitehtuuriin kuuluu ytimen ja sen laiteajureiden sijoittelu sekä erilaiset kirjastot. Käyttöjärjestelmän ytimen lisäksi käyttöjärjestelmään lasketaan usein sen mukana tulevat järjestelmäohjelmat, jotka tarvitaan käyttöjärjestelmän hallintaan kuten lisälaitteiden käsittelyyn, massamuistien alustukseen ja järjestelmän asetuksien muuttamiseen, joita ilman käyttäjän sovellusohjelmien asentaminen voi olla vaikeaa tai mahdotonta.
Käyttöjärjestelmän ydin toimii suojatussa () ytimen muistiavaruudessa (), joka estää muita ohjelmia ylikirjoittamasta sitä. Normaalisti kaikki tietokoneen käyttäjän tekemä kuten tekstieditorit ovat käyttäjäavaruudessa (). Käyttäjän käyttämät ohjelmat kutsuvat ydintä järjestelmäkutsujen avulla.
Käyttöjärjestelmän ydin on etuoikeutettu: ytimellä on suora pääsy kaikkeen laitteiston toimintoihin ja se asettaa käsittelijät keskeytyksille ja poikkeuksille. Keskeytys tulee ulkoisesta tapahtumasta (ajoitus, laite tarvitsee huomiota) ja poikkeukset suoritettavasta käskystä (fault tai trap). Suorittimessa voi olla ydintila (esillä jossakin tilarekisterissä) joka kertoo suorittaako se käyttäjäohjelmaa vai ydintä: tietyt käskyt tai tietohaut ovat sallittuja vain kun suoritin on ydintilassa.
Käyttöjärjestelmän tehtävät
Toiminnallisuuksia listaamalla ei voida yksiselitteisesti määritellä, mitä käyttöjärjestelmään kuuluu.
Laitteiston hallinta Tietokoneen komponenttien ja oheislaitteiden puolesta muille ohjelmistoille tarjotaan yhteneväinen rajapinta, esimerkiksi kiintolevyä käytetään yleensä tiedostojärjestelmän kautta ja verkkokorttia välittämättä tietoliikenneprotokollien yksityiskohdista. Tärkeimmät tehtävät laitteiston osalta suorittavat käyttöjärjestelmän laiteajurit, jotka toimivat ytimen ja laitteen välissä "tulkkeina".
Tiedostojärjestelmä (FS)
Käyttöjärjestelmissä on tuki useille tiedostojärjestelmille, jolloin tallennuslaitteilla olevat tiedostot näytetään hakemistoina ja tiedostoina. Tiedostojärjestelmästä riippuen tiedostot merkitään eri tavoin osion kirjanpitoon erilaisten tarpeiden mukaisesti. Käyttöjärjestelmä hoitaa tallennuslaitteiden, kuten kiintolevyjen kirjoituksen ja lukemisen sekä se huolehtii myös tukemistaan erilaisista tiedostojen käyttöoikeuksista. Käyttöjärjestelmä hallitsee lähes aina useampia erilaisia tiedostojärjestelmiä, muutamasta useisiin kymmeniin. Tiedostojärjestelmän tuki voi olla myös käyttöjärjestelmään kuulumattoman ohjelmiston kuten FUSE:n (Filesystem in Userspace) http://fuse.sourceforge.net/ avulla toteutettu, mutta sekin tarvitsee käyttöjärjestelmältä tuen toimiakseen. Tiedostojärjestelmä voidaan myös luoda yksittäiseen tiedostoon, joita käytetään erilaisissa salausjärjestelmissä.
Muistinhallinta
Vanhimmissa tietokoneissa yksi tehtävä varasi koko tietokoneen kerralla käyttöönsä. Vanhimmissa koneissa ei ollut lainkaan muistinhallintajärjestelmää. Tämä tarkoitti sitä, että ohjelmat voitiin sijoittaa vain tiettyyn kohtaan keskusmuistia, ja ohjelma pystyi käsittelemään mitä muistinpaikkaa tahansa. Näistä aiheutuvien ongelmien ratkaisemiseksi muistinhallinnan päätehtäviksi ovatkin muodostuneet muistin suojaus ja samanlaisen osoiteavaruuden tarjoaminen kaikille prosesseille, ts. jokaisen prosessin osoiteavaruus alkaa nollasta riippumatta siitä, mihin kohtaan fyysistä muistia ohjelma on sijoitettu.
Muistinhallinnasta vastaa tyypillisesti muistinhallintayksikkö, joskin se voidaan integroida suorittimen kanssa yhteen. Käyttöjärjestelmä huolehtii muistinhallintayksikön ohjauksesta ja tarjoaa käyttöjärjestelmäpalvelut muistin varaamiseen ja vapauttamiseen. Muistinhallintayksikkö huolehtii laitteistotasolla siitä, että virheellinen muistiviittaus esimerkiksi käyttöjärjestelmän tai toisen prosessin alueelle aiheuttaa keskeytyksen.
Prosessin muistia voidaan suorituksenkin aikana siirtää fyysiseltä muistialueelta toiselle, myös keskusmuistista massamuistilaitteelle ja takaisin (sivutus levylle virtuaalimuistin kanssa). Käyttöjärjestelmä vapauttaa prosessin käyttämän muistin prosessin päättyessä.
Yksinkertaisin tapa varata prosessille muistialue on yhtenäinen pala keskusmuistia (). Tästä voi seurata tilanne, jossa muistia on kyllä tarpeeksi vapaana, mutta ei yhtenäisenä alueena, mikä aiheuttaa tarpeen tiivistää muistia. Ongelman pienentämiseksi voidaan muisti jakaa osiin, jolloin vain yksittäisen osan täytyy olla yhtenäisenä muistissa, mutta peräkkäiset osat voivat olla eri puolilla fyysistä muistia. Eri menetelmiä on kehitetty muistin käsittelyyn osissa (osiointi, segmentointi ja sivutus). Lisäksi kyky suorittaa useampaa kuin yhtä ohjelmaa (moniohjelmointi) on tuonut tarpeen vaihtaa suoritettavaa ohjelmaa kesken suorituksen.
Prosessienhallinta
Varhaiset tietokoneet tukivat ainoastaan yhtä tehtävää, joka varasi koko tietokoneen kerralla käyttöön. Moniohjelmointi jakoi tietokoneen muistin ja suoritusajan eri ohjelmien välillä, jota kuvataan tyypillisesti prosessien välillä jakamisena.
Modernissa järjestelmässä voidaan ladata useita tietokoneohjelmia muistiin ja niitä voidaan suorittaa samanaikaisesti. Näissä on prosesseja, jotka vastaavat suoritettavaa työtä.
Ohjelman käynnistyessä käyttöjärjestelmä luo sille tarvittavan prosessin, muistiavaruuden ja tarvittavat tietorakenteet. Vastaavasti se vapauttaa nuo resurssit ohjelman lopetuksen yhteydessä. Käyttöjärjestelmä myös tarjoaa työkalut prosessien tarkkailuun, prosessien lopettamiseen ja prosessien väliseen kommunikaatioon.
Moniajon ansiosta tietokoneessa voi samanaikaisesti olla ajossa useampia ohjelmia. Käyttöjärjestelmä antaa suorittimen vuorotellen kunkin prosessin (tai niiden säikeiden) käyttöön. Kunkin prosessin suorittimelta varaama aika pidetään niin lyhyenä, että käyttäjän kannalta kaikki ohjelmat näyttävät olevan ajossa jatkuvasti. Käyttöjärjestelmän vuoronnus pyrkii jakamaan suoritinaikaa tarkoituksenmukaisesti, huomioiden eri prosessien prioriteetin ja muut parametrit.
Varhaiset tietokoneet tukivat ainoastaan eräajoa, jonka ongelmien ratkomiseen kehitettiin osituskäyttöjärjestelmät.
Ensimmäisiin kotikäyttöön saataviin moniajoa tukeviin käyttöjärjestelmiin kuuluu AmigaOS. Tuohon aikaan henkilökohtaiset tietokoneet ajoivat primitiivisiä käyttöjärjestelmiä kuten AppleDOS ja MS-DOS.
Sulautetut järjestelmät voivat käyttää minimaalisia käyttöjärjestelmiä ilman moniajoa.
Verkkoprotokollat pienoiskuva|Esimerkki kommunikaatiosta kerroksissa 3.–5.
Tyypillinen yleiskäyttöinen käyttöjärjestelmä toteuttaa joukon tietoliikenneprotokollia, jotka kapseloivat sovellusohjelmien tarvitsemia tietoja. Käyttöjärjestelmien toteuttamat protokollat tyypillisesti sijoittuvat OSI-mallin 3. tasoon (verkkokerros) ja 4. tasoon (kuljetuskerros): esimerkiksi TCP sijoittuu kuljetuskerrokseen ja IP sijoittuu verkkokerrokseen ja nämä on toteutettu osana käyttöjärjestelmän protokollapinoa. Lisäksi sovellusohjelmat voivat toteuttaa itse ylempien tasojen (5.–7.) protokollia (esimerkiksi HTTP on tyypillisesti toteutettu verkkoselaimessa tai www-palvelimenohjelmassa).
Sovellusohjelmat käyttävät protokollapinoa pistokerajapinnan kautta: sovellusohjelman lähettämä tieto kapseloidaan ja kuljetetaan alemman tason protokollien avulla tietoliikenneverkossa, jolloin vastaanottajan on tunnettava vastaava toiminto tiedon käsittelyyn. Sovellusohjelmalle tämä näkyy loogisesti keskusteluna suoraan ylemmän tason protokollan välityksellä, mutta eri kerrokset hoitavat välityksen tietokoneiden ja tietokoneverkkojen välillä.
Verkkokäyttöjärjestelmät operoivat OSI-mallin toisessa ja kolmannessa kerroksessa reitityksen ja kytkennän kanssa.
Käyttäjät Monen käyttäjän käyttöjärjestelmissä käyttäjien oikeuksien rajoittaminen kuuluu käyttöjärjestelmän tehtäviin. Käyttäjän käynnistämien prosessien oikeudet riippuvat käyttäjän oikeuksista ja mahdollisesti muista seikoista. Osituskäyttöön suunnatuilla käyttöjärjestelmillä kuten Compatible Time-Sharing System ja Dartmouth Time Sharing System pyrittiin ratkomaan eräajon ongelmia. Osituskäyttö kehitettiin 1950- ja 1960-lukujen vaihteessa, jotta monta käyttäjää voi käyttää eri ohjelmia lähes samaan aikaan samalla suurtietokoneella.