V računalništvu je kontekst opravila (procesa, niti itd.) nabor informacij, ki opisujejo trenutno stanje tega opravila in jih je treba shraniti, če ga želimo prekiniti ter kasneje nadaljevati natanko tam, kjer je bilo prekinjeno. Pomembno je, da z obnovitvijo konteksta procesor nadaljuje izvajanje opravila, kot da prekinitve ni bilo.

Kaj vsebuje kontekst

Kontekst običajno zajema več vrst podatkov:

  • Registri procesorja: splošni registri, števec ukazov (program counter / instruction pointer), kazalec na sklad (stack pointer) in registri stanja (flags).
  • FPU/SIMD/vektorski registri: pri programih, ki uporabljajo plavajoče vejice ali vektorska navodila, je treba shraniti tudi njihov zvezni/vektorski kontekst (pogosto kot ločen del shranjevanja).
  • Kontrolni registri in stanje upravljanja spomina: npr. baza tabel strani ali register, ki kaže na trenutni prostor naslovov (v arhitekturah x86 je to CR3). To določa, kateri naslovni prostor je aktiven.
  • Kazalci na jedrno strukturo: kazalec na strukturo procesa ali niti (npr. PCB/TCB), kjer so shranjene preostale informacije.
  • Podatki operacijskega sistema: stanje procesa (teče, čakajoč, zaspal), prioritetne vrednosti, števci uporabe CPU, signali, timeouti, id‑ji, kjer so običajno shranjeni v procesu nadzornih strukturah (PCB).
  • Viri, povezani s procesom: tabela odprtih datotek, trenutni delovni imenik, dovoljenja ipd. — ti niso neposredno del CPU‑konkretnega konteksta, so pa del celotnega stanja procesa.

Razlika med "kontekstom" in podatki na disku

Trdi ali trajni pomnilnik (datoteke na diskih) ni del osnovnega CPU konteksta. Vseeno pa lahko operacijski sistemi ali aplikacije občasno naredijo checkpoint — torej shranujejo celoten ali parcialen del stanja procesa na disk, da ga kasneje povrnejo. To je posebna funkcionalnost in ni isto kot standardni preklop konteksta.

Preklop konteksta (context switch) — kaj se zgodi

Preklop konteksta je operacija, pri kateri operacijski sistem shrani kontekst trenutnega opravila in naloži kontekst drugega. Tipični koraki:

  • Shranitev trenutnih registov in števca ukazov v PCB/TCB trenutnega procesa/niti.
  • Shranjevanje dodatnega stanja (npr. FPU/AVX registri) po potrebi ali s tehniko lenega shranjevanja.
  • Posodobitev stanja v načrtovalniku (scheduler) — oznaka procesa kot čakajočega ali pripravljenega。
  • Izbira naslednjega procesa/niti za zagon (scheduling).
  • Obnovitev registrov in ostalega shranjenega stanja iz PCB/TCB izbranega procesa.
  • Če se spremeni naslovni prostor, posodobitev MMU in/ali izpraznitev/posodobitev TLB.
  • Nadaljevanje izvajanja iz obnovljenega števecja ukazov (return to user/kernel).

Vrste prekinitev in vpliv na kontekst

  • Prekinitve in pasti (interrupts/traps): običajno shranijo le minimalen nabor (PC, flags, morda nekaj registov) in preidejo na izvajanje obdelovalne rutine. Po končani obdelavi sistem lahko nadaljuje enak proces ali sproži načrtovalnik, ki izvede preklop konteksta.
  • Preempcija: jedro lahko prekinja uporabniški proces, ko poteče kvantni čas ali pride višje prioritetno opravilo — to povzroči polni preklop konteksta.
  • Procesna zamenjava (fork/exec) ali končna ustavitev: vključujejo posodobitve PCB in upravljanje virov, pogosto več kot samo preklop registrov.

Strošek in optimizacija preklopa konteksta

Preklop konteksta ni brez stroškov — povzroči izgubo časa zaradi:

  • shrani/naloži registrov in FPU stanja,
  • morebitnega posodabljanja tabel strani in izpraznitve/posodabljanja TLB,
  • izgube lokalnosti v predpomnilnikih (cache miss),
  • upravljanja načrtovalnika in sinhronizacijskih struktur.

Načini za zmanjšanje stroškov:

  • minimalno shranjevanje registra tam, kjer je mogoče, ali uporaba lenega shranjevanja FPU stanja,
  • uporaba lažjih enot stičnih niti (npr. nitke z deljenim naslovnim prostorom) — preklop med nitmi istega procesa zahteva manj (samo registri in sklad),
  • CPU affinity in zmanjševanje migracij procesov med jedri,
  • strojna podpora (npr. TSS na x86 ali specializirane instrukcije),
  • mikrokernelne/monolitne odločitve in optimizacije jedra / schedulerjev.

Posebnosti niti in procesov

Niti (threads) znotraj istega procesa običajno delijo naslovni prostor, odprte datoteke in drugo globalno stanje. Zato je pri preklopu med nitmi istega procesa treba shraniti le registree in sklad (stack pointer) ter nekaj jedrnih informacij — to zahteva manj dela kot preklop med procesi, ki imajo različne naslovne prostore.

Strojna podpora

Nekatere arhitekture nudijo strojno podporo za hitrejši preklop konteksta (npr. posebne strukture kot je task state segment na x86), medtem ko druge zanašajo na programski postopek shranjevanja/obnavljanja. Moderni sistemi pogosto kombinirajo strojne mehanizme z optimizacijami v jedru (npr. leno shranjevanje FPU/AVX registrskih vsebin).

Sklep

Kontekst opravila je ključna abstrakcija za vzporedno izvajanje in prekinljivost v sodobnih operacijskih sistemih. Razumevanje, kaj točno sestavlja kontekst in kako se izvaja preklop konteksta, je bistveno za optimizacijo zmogljivosti in odzivnosti sistemov.