Käyttöjärjestelmä

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.
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&amp;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.
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) 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.
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.
Jotkin käyttöjärjestelmät kuten CP/M ja MS-DOS oli suunniteltu yhdelle käyttäjälle, jolloin järjestelmään ei voinut olla kerralla kirjautuneina useampia käyttäjiä. Kyseiset käyttöjärjestelmät eivät myöskään erotelleet käyttäjäoikeuksia, vaan kaikki ohjelmat suoritettiin samoilla oikeuksilla.
Moderneissa käyttöjärjestelmissä on tuki useille eri käyttäjille, ja Android suorittaa eri sovelluksia eri käyttäjätunnuksilla tietoturvan vuoksi.
Käyttöliittymät.
Käyttöjärjestelmissä on erilaisia käyttöliittymiä. 
Käyttöjärjestelmät toteuttavat ohjelmistoa, joka mahdollistaa sovellusohjelmien erilaiset käyttöliittymät. Moderneissa käyttöjärjestelmissä on eri vaihtoehtoja sulkematta pois toisia tapoja.
Käyttöliittymät voivat perustua komentoliittymän käyttöön, käyttää tekstipohjaista tai graafista käyttöliittymää. Komentoliittymä on käyttöjärjestelmälle yksinkertaisin (varhaisissa tietokoneissa oli kaukokirjoitin), kun taas graafinen käyttölittymä vaatii käyttöjärjestelmältä enemmän tukea (laiteajurit, muu järjestelmäohjelmisto).
Sulautetuissa järjestelmissä ei aina ole lainkaan käyttöliittymää vaan ne operoivat käyttäjistä riippumatta. Palvelimiin voi yleensä ottaa etäyhteyden mutta sulautetuissa se voi olla estetty tai rajoitettu jos lainkaan saatavilla.
Ensimmäisiä hiiriohjattuja graafisia käyttöliittymiä käyttivät Xerox Alto ja oN-Line System, jonka konsepteja Altossa kehitettiin eteenpäin.
Käyttöjärjestelmien luokittelu.
Käyttöjärjestelmät voivat olla yleiskäyttöisiä (käyttäjä voi valita sovellusohjelmat) tai ne voivat olla erikoistuneita sovelluskohtaisiin laitteisiin (esimerkiksi sähkökirja tai reititin ovat erikoistuneita laitteita). Kaikkia käyttöjärjestelmien ominaisuuksia ei tarvita tai hyödynnetä samalla tavoin kaikissa käyttökohteissa.
Luokittelu käyttötarkoituksen mukaan.
Käyttöjärjestelmiä voidaan luokitella niiden käyttötarkoituksen mukaan. 
Keskustietokone- ja palvelinkäyttöjärjestelmiä käytetään koneissa, joilla on monia samanaikaisia käyttäjiä, tai joita käytetään palvelinten alustana. Usein nämä käyttöjärjestelmät voivat käyttää valtavaa määrää muistia, massamuistivälineitä, prosessoreita ja muita resursseja. Tavoitteena tällaisissa järjestelmissä on yleensä luotettavuuden ohella hyödyntää resursseja mahdollisimman täydellisesti ja suorittaa mahdollisimman suuri määrä tehtäviä aikayksikköä kohden. Esimerkiksi z/OS ja Multics ovat keskustietokoneisiin kehitettyjä käyttöjärjestelmiä. Palvelintietokoneissa on usein Unix- tai Unixin kaltainen käyttöjärjestelmä. Palvelin voi tarkoittaa myös klusteria, joka näkyy ulospäin yhtenä tietokoneena kuormituksen tasaajan ansiosta.
Supertietokoneissa TOP500-listan kaikissa tietokoneissa käytetään Linuxia vuoden 2017 listan mukaan.
Työasemat usein käyttävät monen käyttäjän käyttöjärjestelmiä. Työasema on tarkoitettu yhden henkilön ammattikäyttöön ja voi olla edistyneempi kuin henkilökohtainen tietokone.
Työpöytäkäyttöjärjestelmiä käytetään yksittäisissä henkilökohtaisissa tietokoneissa, joita käyttää yleensä kerralla yksi käyttäjä. Tärkeimpiä ominaisuuksia ovat käyttöliittymän helppokäyttöisyys ja hyvä vaste, yhteensopivuus heterogeenisen laitteiston kanssa sekä laajennettavuus.
Reaaliaikaiset käyttöjärjestelmät tähtäävät mahdollisimman pieniin ja ennakoitaviin viiveisiin käyttöjärjestelmän toiminnassa sekä äärimmäiseen toimintavarmuuteen. Useat sulautetut järjestelmät kuuluvat yleensä samaan kategoriaan. Sulautettuja ja reaaliaikaisia käyttöjärjestelmiä käytetään yleensä laitteissa, jotka on suunniteltu suorittamaan jokin tietty tehtävä mahdollisimman tehokkaasti. Tästä syystä myös energian ja laitteistoresurssien mahdollisimman säästeliäs ja tehokas käyttö ovat tärkeitä ominaisuuksia. Sulautettuja järjestelmiä hyödynnetään aina teollisuusroboteissa, DVD-soittimissa, mikroaaltouuneissa ja monissa muissa pienissä laitteissa. Kaikki sulautetut järjestelmät eivät kuitenkaan sisällä käyttöjärjestelmää, vaan ohjauksesta voi huolehtia pelkkä yksinkertainen firmware. 
Historiallisesti sulautetut järjestelmät ovat olleet hyvin pieniä ja ovat toimineet ilman käyttöjärjestelmää: näiden tehtävänä on ollut vain muutaman anturin seuranta. Esineiden internet -laitteissa kommunikointi (langallinen tai langaton) muiden järjestelmien kanssa on merkittävämmässä osassa ja vaatii enemmän ohjelmistotukea.
Reaaliaikaisia käyttöjärjestelmiä ovat muun muassa: ChronOS, VxWorks, QNX, pSOS ja OS-9. SpaceX käyttää reaaliaikaista Linuxia raketeissaan (Real-Time Linux).
Verkkokäyttöjärjestelmät ovat reitittimissä ja kytkimissä käytettäviä käyttöjärjestelmiä, jotka ennen olivat Unixiin perustuvia ja nykyisin usein Linuxiin perustuvia.
Luokittelu sukupolven mukaan.
Käyttöjärjestelmät voidaan myös luokitella eri sukupolvien (0-4) mukaan, MS-DOSin kaltaisen "nollannen sukupolven" käyttöjärjestelmästä aina nykyaikaisiin neljännen sukupolven käyttöjärjestelmiin sekä tuleviin viidennen sukupolven käyttöjärjestelmiin, jotka toimivat osittain tai kokonaan verkossa. 
Luokittelu orientoitumisen mukaan.
"Käyttöjärjestelmät voidaan luokitella proseduuriorientoituneisiin tai prosessiorientoituneisiin. Prosessiorientoituneella käyttöjärjestelmällä on monia etuja proseduuriorientoituneihin käyttöjärjestelmiin verrattuna. Prosessirakenne antaa käyttöjärjestelmälle selkeän modulaarisen rakenteen, jossa yksittäinen palvelun toteutusta voidaan suhteellisen helposti muuttaa. Palveluprosessin oikeudet voidaan rajoittaa siten, että siinä olevan virheen vaikutukset minimoituvat. Myös käyttöjärjestelmäpalveluiden priorisointi yksinkertaistuu – proseduuriorientoituneessa käyttöjärjestelmässä prosessin prioriteettia joudutaan usein muuttamaan käyttöjärjestelmäpalvelun ajaksi. Myös laiteajureiden toteutus yksinkertaistuu. Pisimmälle vietyjä prosessiorientoituneita käyttöjärjestelmiä sanotaan rakenteensa takia myös mikroytimisiksi." 
Luokittelu arkkitehtuurin mukaan.
Eräitä käyttöjärjestelmiä kutsutaan hajautetuiksi käyttöjärjestelmiksi, joissa sovellukset ja käyttöjärjestelmäpalvelut ovat hajautettu useammalle fyysiselle tietokoneelle. Järjestelmän tarkoitus on tuottaa joukko palveluja, jotka käyttäytyvät kuten yksi tietokone. Hajautettuja käyttöjärjestelmiä ovat Apollo Computerin Domain/OS ja Bell Labsin Plan 9.
Yleisiä käyttöjärjestelmiä.
Yleisimmät työpöytäkäytössä olevat käyttöjärjestelmät kuuluvat joko Windows-perheeseen tai johonkin lukuisista Unixin jälkeläisistä. Unix-perheessä on nähtävissä kaksi päähaaraa, joista toinen perustuu lähinnä BSD-Unixiin (Berkeley Software Distribution) kuten macOS ja toinen Linux-ytimen pohjalta tehtyihin käyttöjärjestelmiin kuten Chrome OS.
Applen macOS perustuu Darwiniin, joka taas on kehitetty BSD:n pohjalta.
Palvelinkoneissa noin kaksi kolmasosaa koneista käyttää jotain Unix-tyyppistä käyttöjärjestelmää ja näistä noin puolet Linuxia. Noin kolmasosa käyttää Windows-perheen käyttöjärjestelmää (2017).
Rackspacen mukaan pilvipalveluiden kuormasta 90% suoritetaan Linuxilla (2020).
Mobiililaitteissa Linux-pohjainen Android on kiistatta 
suosituin yli 70 prosentin osuudella (2017). Käytännössä sen lisäksi on käytössä vain Applen iOS. Älypuhelimissa Androidilla oli 86,8 % osuus vuoden 2016 lopussa.
Taulutietokoneissa suosituin on ollut iOS noin kahden kolmasosan osuudella, Androidilla on noin kolmasosan osuus. 
Vuonna 2018 iOS:lla oli 23,4 prosentin osuus; suurin osuus oli Androidilla ja pienin Windowsilla.
Vuonna 2020 Applella oli 36,5 prosentin osuus taulutietokoneiden markkinoista.
POSIX ei ole varsinainen käyttöjärjestelmä, vaan standardi, jonka kuvaa käyttöjärjestelmältä vaaditut ominaisuudet sovellusten siirrettävyyden takaamiseksi. Useat käyttöjärjestelmät toteuttavat POSIX-standardin, mutta siirrettävyys toteutuu ainoastaan silloin, kun ohjelmiston tekijä on pitäytynyt vain POSIX-rajapinnan käytössä.