22/12/2023
Har du nogensinde undret dig over, hvordan din computer kan afspille musik, lade dig surfe på internettet og køre en virusscanning på samme tid? Svaret ligger i en af de mest fundamentale opgaver i ethvert moderne operativsystem: processtyring. Det er den usynlige dirigent, der orkestrerer alle de programmer og opgaver, du kører, og sikrer, at alt fungerer harmonisk og effektivt. Uden avanceret processtyring ville vi være begrænset til at køre ét program ad gangen, en virkelighed der virker utænkelig i dag. Denne artikel dykker ned i, hvad en proces er, hvordan operativsystemet administrerer den, og hvilke teknikker der bruges til at skabe den flydende multitasking-oplevelse, vi tager for givet.

Hvad er en proces?
For at forstå processtyring må vi først definere, hvad en proces er. I daglig tale bruger vi ofte ordene 'program' og 'proces' i flæng, men i computerverdenen er der en afgørende forskel. Et program er en passiv samling af instruktioner, der ligger gemt på din harddisk – for eksempel den binære fil for din webbrowser. En proces er derimod et program, der er blevet startet og nu er i udførelse. Det er en aktiv enhed, der kræver systemressourcer som CPU-tid og hukommelse for at udføre sine opgaver.
Hver proces har sin egen dedikerede hukommelsesplads, som typisk er opdelt i fire sektioner:
- Tekstsektion: Indeholder den kompilerede programkode, som CPU'en skal udføre.
- Datasektion: Her lagres globale og statiske variabler, som er defineret i programmet.
- Stak (Stack): Bruges til midlertidige data som lokale variabler, funktionsparametre og returadresser. Stakken vokser og skrumper dynamisk, når funktioner kaldes og afsluttes.
- Heap: Et område for dynamisk hukommelsesallokering. Når et program har brug for mere hukommelse under kørslen (f.eks. via
newellermalloc), allokeres pladsen her.
Process Control Block (PCB)
For at holde styr på hver enkelt aktiv proces bruger operativsystemet en datastruktur kaldet en Process Control Block (PCB). Man kan tænke på PCB'en som en proces' pas eller ID-kort. Den indeholder al den information, operativsystemet har brug for for at administrere processen, herunder:
- Proces-ID (PID): Et unikt identifikationsnummer for processen.
- Procestilstand: Den aktuelle tilstand for processen (f.eks. kørende, klar, ventende).
- Programtæller (Program Counter): Peger på adressen for den næste instruktion, der skal udføres.
- CPU-registre: En kopi af alle CPU-registrenes værdier, som skal gemmes, når processen afbrydes, så den kan genoptages korrekt senere.
- CPU-planlægningsinformation: Omfatter procesprioritet og pegere til planlægningskøer.
- Hukommelsesstyringsinformation: Information om sidetabeller eller segmenttabeller, der definerer processens hukommelsesrum.
- I/O-statusinformation: En liste over I/O-enheder, der er allokeret til processen, og åbne filer.
Processens livscyklus
En proces gennemgår forskellige tilstande fra den bliver oprettet, til den afsluttes. Denne rejse kaldes processens livscyklus. De fem primære tilstande er:
- Start (New): Processen er ved at blive oprettet. Operativsystemet har allokeret ressourcer og oprettet en PCB.
- Klar (Ready): Processen har alt, hvad den behøver for at køre, men venter på at blive tildelt CPU-tid af operativsystemets planlægger (scheduler). Der kan være mange processer i klar-tilstand på én gang, typisk i en kø.
- Kørende (Running): Processen er blevet valgt af planlæggeren, og dens instruktioner bliver nu udført af CPU'en.
- Ventende (Waiting): Processen kan ikke fortsætte, fordi den venter på en begivenhed. Det kan være afslutningen på en I/O-operation (f.eks. at læse fra en fil), eller at den venter på input fra brugeren.
- Afsluttet (Terminated): Processen har afsluttet sin kørsel eller er blevet stoppet af operativsystemet. Dens ressourcer bliver frigivet.
Overgange mellem disse tilstande styres udelukkende af operativsystemet. For eksempel skifter en proces fra 'Kørende' til 'Ventende', når den anmoder om en I/O-operation. Når operationen er færdig, flytter operativsystemet den til 'Klar'-tilstand, hvor den igen kan konkurrere om CPU-tid.

CPU-planlægning: Systemets trafikstyrer
Kernen i processtyring er CPU-planlægning (scheduling). Da der ofte er flere processer i 'Klar'-tilstand, end der er CPU-kerner, er det op til en komponent kaldet CPU-scheduler at beslutte, hvilken proces der skal køre næste gang og hvor længe. Målet er at udnytte CPU'en optimalt, sikre fairness mellem processer og give brugeren en responsiv oplevelse.
For at træffe disse beslutninger er det vigtigt at skelne mellem to typer processer:
CPU-bundne vs. I/O-bundne processer
Processer kan generelt kategoriseres baseret på, hvordan de bruger systemressourcer. Denne skelnen er afgørende for at designe effektive planlægningsalgoritmer.

| Egenskab | CPU-bundet proces | I/O-bundet proces |
|---|---|---|
| Primær aktivitet | Intensive beregninger, der bruger meget CPU-tid. | Bruger meget tid på at vente på I/O-operationer (f.eks. netværk, disk). |
| Kørselsmønster | Lange perioder med CPU-udførelse. | Korte perioder med CPU-udførelse afbrudt af lange venteperioder. |
| Eksempler | Videoredigering, videnskabelige simuleringer, kryptering. | Tekstbehandling, webbrowsere, databaseforespørgsler. |
En god scheduler forsøger at balancere disse to typer for at holde både CPU'en og I/O-enhederne beskæftiget.
Planlægningsalgoritmer
Der findes mange forskellige algoritmer til at planlægge processer. De kan overordnet inddeles i to kategorier: non-preemptive og preemptive.

Non-Preemptive planlægning
I non-preemptive (ikke-afbrydende) planlægning gælder reglen: når en proces først har fået CPU'en, beholder den den, indtil den enten er færdig eller frivilligt giver slip (f.eks. ved at anmode om I/O). Dette er simpelt at implementere, men kan føre til dårlig performance. Eksempler inkluderer:
- First-Come, First-Served (FCFS): Processer udføres i den rækkefølge, de ankommer. Det er retfærdigt, men kan føre til 'Convoy-effekten', hvor en lang proces blokerer for mange korte processer, der ankom efter den.
- Shortest Job First (SJF): Scheduler'en vælger den proces, der har den korteste forventede kørselstid. Dette er optimalt for den gennemsnitlige ventetid, men kræver, at man kender kørselstiden på forhånd, hvilket sjældent er muligt. Det kan også føre til, at lange processer 'sulter', hvis der konstant ankommer korte processer.
Preemptive planlægning
I preemptive (afbrydende) planlægning kan operativsystemet tvinge en proces til at afgive CPU'en, selvom den ikke er færdig. Dette er essentielt for moderne, interaktive systemer. Når en proces afbrydes, gemmes dens tilstand i dens PCB, så den kan genoptages senere. Dette kaldes et kontekstskift.
- Shortest Remaining Time First (SRTF): Den preemptive version af SJF. Hvis en ny proces ankommer med en kortere resterende kørselstid end den nuværende proces, afbrydes den nuværende, og den nye proces starter.
- Round Robin (RR): Hver proces tildeles en lille tidsenhed (en 'time slice' eller 'quantum'). Når en proces har brugt sin tidsenhed, bliver den afbrudt og placeret bagerst i klar-køen, og den næste proces i køen får lov at køre. Dette sikrer, at alle processer får CPU-tid og giver en god responsivitet.
- Prioritetsbaseret planlægning: Hver proces tildeles en prioritet, og scheduler'en vælger altid processen med den højeste prioritet. Dette kan være preemptive, hvor en høj-prioritets proces kan afbryde en lav-prioritets proces. En udfordring her er 'starvation', hvor lav-prioritets processer aldrig får lov at køre. Dette kan løses med 'aging', hvor en proces' prioritet øges, jo længere den venter.
Fordele og ulemper ved processtyring
Effektiv processtyring er afgørende, men det er en kompleks balancegang med både fordele og ulemper.
Fordele
- Effektiv ressourceudnyttelse: CPU'en holdes beskæftiget, hvilket maksimerer systemets ydeevne.
- Responsivitet: Giver brugeren en oplevelse af, at systemet reagerer hurtigt, selv når mange programmer kører.
- Fairness: Planlægningsalgoritmer sikrer, at alle processer får en fair andel af CPU-tiden.
- Multitasking: Gør det muligt for brugere at køre flere applikationer samtidigt, hvilket er essentielt for moderne computerbrug.
Ulemper
- Kompleksitet: At styre hundredvis af processer med forskellige krav er en yderst kompleks opgave for operativsystemet.
- Overhead: Hvert kontekstskift tager tid. Hvis systemet skifter for ofte, kan en betydelig del af CPU-tiden gå tabt på selve administrationen i stedet for på at udføre arbejde.
- Risiko for Starvation: Dårligt designede algoritmer kan føre til, at visse processer aldrig får CPU-tid.
- Prioritetsinversion: En situation, hvor en lav-prioritets proces holder på en ressource, som en høj-prioritets proces har brug for, hvilket effektivt blokerer den vigtige proces.
Ofte Stillede Spørgsmål (FAQ)
- Hvad er forskellen på et program og en proces?
- Et program er en passiv fil med instruktioner på en harddisk. En proces er et program, der er blevet indlæst i hukommelsen og er i gang med at blive udført. Ét program kan give anledning til flere processer (f.eks. kan du have flere vinduer af samme webbrowser åben).
- Hvad er en Process Control Block (PCB)?
- PCB er en datastruktur i operativsystemets kerne, der indeholder al information om en specifik proces. Det er processens 'identitetskort', som operativsystemet bruger til at administrere den.
- Hvorfor er CPU-planlægning nødvendigt?
- Fordi der typisk er mange flere processer, der er klar til at køre, end der er tilgængelige CPU-kerner. Planlægning er mekanismen, der beslutter, hvilken proces der skal køre hvornår, for at opnå mål som høj ydeevne, fairness og god responsivitet.
- Hvad er et kontekstskift?
- Et kontekstskift er processen, hvor operativsystemet gemmer tilstanden (konteksten) af en kørende proces og indlæser tilstanden af en anden proces, så den kan begynde at køre. Dette er den grundlæggende mekanisme, der muliggør preemptive multitasking.
Hvis du vil læse andre artikler, der ligner Hjertet af dit operativsystem: Processtyring, kan du besøge kategorien Teknologi.
