Opgavekontekst i datalogi (ofte brugt om en proces eller en tråd) er det minimale sæt af data, som beskriver en opgaves aktuelle tilstand, og som skal gemmes for at kunne afbryde opgaven på et tidspunkt og senere genoptage den nøjagtigt der, hvor den blev afbrudt. Begrebet bliver relevant i forbindelse med afbrydelige opgaver og multitasking: når processoren afbryder en opgave, gemmes dens kontekst, så processoren kan håndtere afbrydelsesservicerutinen eller en anden opgave, og senere gendanne den oprindelige opgave.

Hvad gemmes ved et kontekstskifte?

Hvad der præcist gemmes er delvist arkitektur- og styresystemafhængigt, men typisk omfatter konteksten:

  • Processorregistre — f.eks. programtæller (instruction pointer), stack pointer, generelle registre og status-/flagregistre.
  • Flydepunkt-/SIMD-tilstand — flydende punkt- og vektorregistre, som ofte håndteres “lazy” for at spare tid, indtil de rent faktisk skal bruges af en anden opgave.
  • Memorystyring — oplysninger om hukommelseslayout som sidekartotek eller hukommelsesmappings (f.eks. side-tabeller), som bestemmer, hvilke virtuelle adresser der svarer til hvilke fysiske sider.
  • Kerne-tilstand — kernelstackpeger, CPU-tilstand (brugermode/kernelmode), styrings- og kontrolregistre (på visse arkitekturer).
  • Planlægnings- og statusoplysninger — prioritet, ventende tilstande, statistik og eventuelle signal- eller låseinformationer, som styres af operativsystemet.

Bemærk, at applikationsdata (indholdet af brugerens heap og filer) normalt ikke flyttes som led i et kortvarigt kontekstskifte — de forbliver i hukommelsen eller på disk. Store permanente gemmeoperationer af hele en opgaves tilstand omtales som checkpointing og er et særskilt koncept.

Hvor gemmes konteksten?

  • Process Control Block (PCB) eller tilsvarende kernelstruktur — her gemmer styresystemet typisk per-proces oplysninger som registre, PID, prioritet og andre metadata.
  • Thread Control Block (TCB) — for tråde kan der være en letvægtsstruktur med trådens egne registre og stackpointer.
  • Kernesegmenter i hukommelsen — f.eks. kernelstacken og tabeller til hukommelsesstyring.
  • Eventuelle hardware-faciliteter — nogle processorer understøtter hurtige metoder til at gemme/restore register-sæt (f.eks. specielle instruktioner eller multiple registerbanks).

Processer vs. tråde

  • Proces — en isoleret eksekveringsenhed med egen adresseplads, egne åbne filer og ressourcer. Et kontekstskifte mellem processer kan kræve opdatering af hukommelsesmappings (dyrere).
  • Tråd — en lettere vægt eksekveringsenhed inden for en proces, som ofte deler adresseplads og andre ressourcer med andre tråde i samme proces. Skifte mellem tråde i samme proces kan være billigere, fordi hukommelsesmappingsen ikke nødvendigvis ændres.

Hvornår sker et kontekstskifte?

  • Ved afslutning af en tidskvante (timerinterrupt) i preemptive planlæggere.
  • Når en opgave blokerer på I/O, låse eller andre ventepunkter.
  • Når en opgave frivilligt afgiver CPU (f.eks. ved at kalde yield).
  • Ved afbrydelser og undtagelser (interrupts/traps) — her gemmes ofte en del af konteksten, mens afbrydelseshåndteringen udføres.

Omkostninger ved kontekstskifte og optimeringer

Kontekstskifte har en omkostning: tid bruges på at gemme og genindlæse registre, opdatere hukommelsesstyring og udføre planlægningslogik. For at reducere denne overhead anvendes flere teknikker:

  • Lazy save/restore af flydepunkt-/SIMD-tilstand — kun gemmes, når en anden opgave rent faktisk bruger disse registre.
  • Letvægtstråde og brug af tråd-pools for at undgå hyppig oprettelse/ødelæggelse.
  • Processor-specifikke features som hurtigere kontekstskifteinstruktioner eller multiple registerbanker.
  • Reduceret antal kontekstskift via kooperativ multitasking eller god planlægningsstrategi (mindsker overflødig switching mellem opgaver).

Checkpointing og persistent lagring

Selvom almindelige filer og langsigtet lagring normalt ikke betragtes som en del af et kortvarigt opgavekonteksts gemte data, kan hele opgavens tilstand gemmes på disk for fault-tolerance eller migration (checkpoint/restart). Checkpointing er en bevidst handling, som involverer at gemme processens hukommelse, åbne ressourcehandtag og tilstand, så opgaven senere kan gendannes, eventuelt på en anden maskine.

Opsummerende: opgavekonteksten dækker den nødvendige hardware- og kerneinformation, der gør det muligt at afbryde og genoptage en opgave. Hvad præcis der gemmes og hvordan, er afhængigt af arkitektur og styresystem, og design af disse mekanismer har stor betydning for systemets ydeevne og responsivitet.