Muistinhallinta
Taustaa

Tyypillisesti ohjelma on suoritusvalmiina massamuistilla. Kun ohjelmaa suoritetaan se ladataan tietokoneen muistiin prosessiksi. Tietokoneen muisti voi alkaa osoitteesta nolla, mutta ohjelman ensimmäisen osoitteen ei tarvitse olla nolla. Jos tiedetään ennalta mihin osoitteeseen ohjelma ladataan se voi käyttää absoluuttisia osoitteita. Ohjelma voi olla uudelleensijoitettava, jolloin ohjelman muistiviittaukset saavat lopullisen arvonsa latauksen yhteydessä. Osoitteet voivat myös muuttua suorituksen aikana, jolloin käytetään apuna tähän tarkoitettu laitteistoa (muistinhallintayksikköä).
Tietokoneen suorittimen käyttämään osoitteeseen viitataan tyypillisesti loogisena osoitteena ja muistinhallintayksikön käyttämää osoitetta kutsutaan fyysiseksi osoitteeksi. Käännösaikainen ja ja latausaikainen osoitteiden sidonta (engl. binding) tuottavat identtisiä loogisia ja fyysisiä osoitteita, mutta suorituksen aikaisessa sidonnassa ne eroavat. Suorituksen aikaisessa sidonnassa tuotettua loogista osoittetta kutsutaan virtuaaliosoitteeksi. Muistinhallintayksikkö muuntaa virtuaaliset osoitteet fyysisiksi osoitteiksi ajonaikaisesti.
Ohjelmat voivat käyttää ajonaikaisia kirjastoja, jolloin osa ohjelman toiminnoista linkitetään ohjelmaan latausvaiheessa. Käyttöjärjestelmä voi jakaa kerran ladatun kirjaston sen käyttäjien välillä, mutta kirjastosta voi olla useita versioita käytössä samaan aikaan.
Moniohjelmoinnin myötä tietokoneen muisti on jaettu useiden prosessien kesken. Tyyppillisesti ohjelmoija ei voi tietää etukäteen mitä muita ohjelmia on samaan aikaan muistissa, sekä halutaan mahdollisuus vaihtaa suoritettavaa ohjelmaa muistista suorittimen käytön maksimoimiseksi. Ohjelma, joka on siirretty levylle voi tarvita sijoittaa eri paikkaan muistissa kun se palautetaan suoritukseen. Ohjelman haarautumisen käsittely sisältää osoitteen seuraavaksi suoritettavalle käskylle ja suorittimen sekä käyttöjärjestelmän on ylläpidettävä ohjelman muistiviittauksille osoitteen muunnosta.
Prosessit on myös suojattava toisten ohjelmien tahattomilta tai tahallisilta yrityksiltä haitata ohjelman toimintaa. Lisäksi ohjelmat voivat laskea muistiviittaukset kuten sijainnin taulukossa ajonaikaisesti. Lisäksi jos useampi prosessi toimii yhdessä ja käsittelee samaa tietoa tuo voidaan haluta jakaa sitä käsittelevien prosessien kesken.
Useimmat nykyaikaiset järjestelmät käyttävät virtuaalimuistia, joka perustuu yhteen tai molempiin perustekniikoista, jotka ovat segmentointi ja sivutus. Myös muistin osiointia (engl. partitioning) on käytetty nyt vanhentuneissa järjestelmissä. Kiinteän ja dynaamisen osioinnin heikkouksien johdosta syntyi kaverijärjestelmä (engl. buddy system), jossa varattava lohko jaetaan pienempiin mikäli tilaa ei ole riittävästi vapaana. Segmentointi jakaa muistin vaihtuvan kokoisiin lohkoihin, jolloin ohjelman ohjelmakoodi, pino ja keko sijoitetaan eri segmentteihin.
Sivutuksessa muisti jaetaan kiinteän kokoisiin lohkoihin, joita kutsutaan sivuiksi. Kun on tarvetta käyttää enemmän muistia kuin tietokoneessa on fyysisesti voidaan osa muistisivuista sivuttaa levylle. Sivutus mahdollistaa sen, että prosessin käyttämän fyysisen muistiavaruuden ei tarvitse olla yhtenäinen (jatkuva).