Operativsystemer har eksistert siden datamaskinens opprinnelse. I denne artikkel skal vi se nærmere på hva et operativsystem er, hvorfor vi trenger operativsystemer, og eksempler på ulike operativsystemer. Jeg velger å bruke begrepet “enhet” fremfor “datamaskin” siden operativsystemer brukes langt utover de tradisjonelle enheter som bærbar- og stasjonær PC. Smart klokker, smart telefoner, smart TVer, rutere og svitsjer er alle eksempler på hvor operativsystemer brukes i dag.
Et operativsystem er et program som kjører mellom maskinvaren og applikasjoner som Microsoft Word, Mozilla Firefox og Google Chrome. En enhet har en begrenset mengde med ressurser i form av primærminne (hovedminne / RAM), sekundærminne (harddisk), CPU og nettverksgrensesnitt. Operativsystemet lager en form for abstraksjon for oss brukere, og har som oppgave å beskytte seg selv ved å fordele disse ressursene mellom prosessene, og sørge for at prosesser er isolert fra hverandre.
Et typisk datamaskinsystem i dag består av harddisker, mus, tastatur, skriver og monitor. Disse enhetene kommuniserer med kontrollere, som igjen kommuniserer med operativsystemet. Kontrollerne og CPU er koblet til samme primærminne gjennom et chipset som har som oppgave å avgjøre hvem som får lov å kommunisere på bus. For eksempel operativsystemet kan sende data til grafikk-kontrolleren med ønske om hva som skal vises på monitoren. Grafikk-kontrolleren sin oppgave er da å oversette disse til signaler som sendes og blir forstått av monitoren, slik at den kan vise innholdet til brukeren.
Et datamaskinsystem består av flere interne og eksterne komponenter hvor data kan lagres. Denne lagringen kan være midlertidig eller permanent, og hastigheter kan variere. For eksempel registeret styres av kompilatoren, og er svært raskt, men har liten lagringskapasitet. Registeret kommuniserer med en cache som har noe større lagringskapasitet, men er ikke fullt så raskt. Cache snakker med primærminnet, som har betydelig større lagringskapasitet, men også her reduseres hastigheten. Register, cache og primærminne er såkalte “volatile” som betyr at de ikke er brukt for permanent lagring. Med andre ord, slår du av datamaskinen, så forsvinner dataene. Det er her sekundærminnet kommer inn i form av magnetisk harddisk og SSD harddisk. Primærminnet kommuniserer med sekundærminnet som er “non-volatile” som betyr at dataene lagres permanent, og er derfor tilgjengelig når datamaskinen neste gang slås på.
Forskjellen mellom et program og en prosess, er at et program er passivt, og ligger lagret på sekundærminnet, mens en prosess er aktiv, og “lever” i primærminnet. “Word.exe” er eksempel på et program som ligger lagret på sekundærminnet. Når du klikker på Word ikonet på skrivebordet, eller via start menyen instansierer du programmet ved å laste det inn fra sekundærminnet og over til primærminnet. Har du et Word dokument oppe, og en nettleser som Firefox eller Chrome, så har du instansiert en instans hver av programmene. En prosess er en instans av et program som lever i fullstendig isolasjon fra andre prosesser. En prosess oppfatter ressursene som dedikerte til seg selv, og er ikke klar over at det “lever” andre prosesser i primærminnet. Operativsystemet har derfor som oppgave å koordinere det på best mulig måte. En enhet har ofte kun en fysisk CPU installert, og CPU kan derfor kun prosessere en prosess om gangen. Det er problematisk når de fleste operativsystemer har lastet et titalls- eller et hundretalls prosesser inn i primærminnet. Det er likevel sjeldent at en og samme prosess har et konstant behov for CPU ressurser. Operativsystemet er derfor avhengig av å gruppere prosesser inn i ulike køer som beskriver hvilken tilstand den aktuelle prosessen er i.
Når et program instansieres, og blir til en prosess får prosessen tilstanden “New” før den blir lagt inn i “Ready”-køen som en indikasjon på at prosessen har et behov for å bli behandlet av CPU. “Ready”-køen kan bestå av flere andre prosesser som også venter på å bli behandlet av CPU. I så tilfelle blir den aktuelle prosessen lagt inn i køen sammen med de andre prosessene som venter. Når CPU blir ledig, plukker den opp den aktuelle prosessen fra “Ready”-køen, hvor operativsystemet så merker den med tilstanden “Running”. Denne køen kan også bestå av andre prosesser som kan ha høyere, eller lavere prioritet enn den aktuelle prosessen som blir lagt til i køen. Prosesser med høyest prioritet vil først bli behandlet av CPU. En prosess har kun rett til å bli behandlet av CPU for en gitt periode av gangen da det ofte er flere andre prosesser som venter på tilgang til CPU. Etter at prosessen har fått lov til å kjøre en gitt tid, kan et avbrudd oppstå hvor operativsystemet må legge arbeidet med prosessen til side for å så fokusere på en annen hendelse. Dette avbruddet kalles for et kontekstskifte. Før operativsystemet går videre med kontekstskifte, lagrer operativsystemet det nåværende arbeidet med prosessen i en blokk som kalles for “Process Control Block (PCB)”. Formålet med lagringen er at operativsystemet skal kunne holde kontroll på hvor arbeidet skal fortsette når den aktuelle prosessen får ny tilgang på CPU ressurser ved neste “runde”. Følgende situasjoner kan utløse et kontekstskifte:
a. CPU ble ferdig å utføre de arbeidsoppgaver som prosessen hadde bedt om innenfor tidsrammen som operativsystemet har gitt. Prosessen får tilstanden “Terminated”. CPU fortsetter med neste prosess i “Ready”-køen.
b. CPU ble ikke ferdig å utføre de arbeidsoppgaver som prosessen hadde bedt om innenfor tidsrammen som operativsystemet hadde gitt. Prosessen flyttes fra “Running”-køen til “Waiting”-køen, og må vente på neste tur. CPU fortsetter med neste prosess i “Ready”-køen.
c. CPU utfører arbeidsoppgaver, men CPU stopper opp fordi prosessen for eksempel trenger å lese eller skrive data til sekundærminnet (harddisken), eller venter på at skriveren / skanneren skal bli ferdig med arbeidsoppgaven. Det er ingen grunn for at CPU skal vente på prosessen. Prosessen blir flyttet til “Waiting”-køen, og CPU går videre med neste prosess i “Ready”-køen.
d. CPU mottar et signal, og blir avbrutt av maskinvaren eller en applikasjon midt under utførelsen av arbeidsoppgavene som prosessen hadde bedt om. Maskinvaren eller applikasjonen melder om at én annen prosess med høyere prioritet trenger øyeblikkelig oppmerksomheten fra CPU. Den aktuelle prosessen får tilstanden “Waiting” og blir flyttet til “Waiting”-køen.
Vi har nå lært at ressurser må fordeles mellom prosesser, og CPU arbeider (i dette eksempelet) kun med en prosess om gangen. Det er ønskelig å utnytte CPU og andre ressurser på best mulig måte for å oppnå det som kalles multiprogrammering hvor ressurser fordeles mellom prosesser. Ulike avbrudd oppstår for å oppnå det. Vi sier gjerne at moderne operativsystemer er “avbruddsdreven”. Avbruddene skjer selvsagt så fort at vi som brukere ikke legger merke til forsinkelsen.
Et program kommuniserer med filsystemet som er en del av operativsystemet ved hjelp av mapper og filer. Vi er kjent med hvordan mapper opprettes og filer kan kopieres frem og tilbake i for eksempel Windows 10. Filsystemet kommuniserer med en driver som oversetter informasjonen slik at kontrolleren forstår hvordan den skal prosessere den informasjonen. Filsystemet og driveren kommuniserer snakker ikke om mapper og filer, men om blokker da det er disse som fysisk lagres på sekundærminnet. Det fører til en abstraksjon for programvaren.
Et operativsystem består av en kjerne som er en sentral del av et operativsystem. Prosesser som kjører kan bl.a. bruke kjernen for å sende systemkall. For eksempel dersom Microsoft Word ønsker å åpne en fil, som igjen krever at en må hente disse dataene fra sekundærminnet, så sender Word et melding til operativsystemet som sender et systemkall til kjernen med melding om at kjernen må hente frem dokumentet. Kjernen sender en melding videre til filsystemet. Filsystemet er da ansvarlig for å hente frem dokumentet som ligger permanent lagret i sekundærminnet. Et annet eksempel er dersom du utvikler et program som ønsker å åpne DVD-spilleren på en bærbar PC. Alt du trenger å gjøre er å lage et kall til operativsystemet’s API i programmet ditt, som sender melding til operativsystemet som igjen sender systemkall til kjernen om at DVD-spilleren må åpne seg. Du behøver ikke å sette deg inn i hvordan man kommuniserer med maskinvaren direkte. Abstraksjon er nøkkel ordet her. Som oftest kan det være flere prosesser som ønsker å utføre samme handling. Da er det opp til kjernen å avgjøre hvordan disse forespørslene (systemkallene) skal prioriteres.
API står for Application Programming Interface og er noe de fleste operativsystemer har. Windows sitt API heter Win32, og Unix-baserte operativsystemer har et API som kalles POSIX.
Vi som brukere kommuniserer med operativsystemet ved hjelp av et brukergrensesnitt, (GUI), kommandolinje (shell), eller ved å lage skript som kan automatisere kommunikasjonen.
Et operativsystem har som formål å fordele ressurser, abstrahere, og sørge for at prosess kan kommunisere med hverandre.
Android, OS X, macOS, Linux, FreeBSD og Windows er eksempler på operativsystemer som er mye brukt i dag.