Kompiuterių moksle užduoties (proceso, gijos...) kontekstas yra minimalus šios užduoties naudojamų duomenų rinkinys, kuris turi būti išsaugotas, kad užduotį būtų galima nutraukti tam tikru metu ir tęsti užduotį toje vietoje, kurioje ji buvo nutraukta, ir bet kuriuo metu ateityje. Konteksto sąvoka įgyja reikšmę pertraukiamų užduočių atveju, kai nutraukus užduotį procesorius išsaugo kontekstą ir toliau aptarnauja pertraukimo aptarnavimo procedūrą. Taigi, kuo mažesnis kontekstas, tuo mažesnė uždelsimo trukmė. Šie duomenys yra:

  • Procesoriaus registrai
  • Užduoties naudojama atmintis
  • Kai kuriose operacinėse sistemose valdymo registrai, kuriuos sistema naudoja užduočiai valdyti

"Užduoties kontekstas" konteksto perjungimo atveju nėra susijęs su saugojimo atmintimi (failais); net jei jis gali būti saugomas kai kuriais atvejais (kontrolinis taškas).

Ką konkrečiai sudaro užduoties kontekstas?

Platesne prasme užduoties kontekstas paprastai apima:

  • CPU registrai: bendrieji registrai, programos skaitiklis (PC / instrukcijos rėmimo rodmuo), stekas (stack pointer), statuso registrai (procesoriaus būsenos žymos).
  • Atminties valdymo informacija: žemėlapių ar puslapių lentelės, segmentų registrai, adresų erdvės nuostatos — tai leidžia užduočiai pasiekti savo atmintį.
  • Branduolio būsena: procesui priskirtas branduolio (kernel) stekas, prioritetai, būsenos žymos (vykdoma, pasirengusi, blokuota) ir planavimo informacija.
  • I/O ir posistemės būsena: atidaryti failų deskriptoriai, įėjimo/išėjimo užklausų būklė, tinklo jungtys, signalų tvarkymo nustatymai.
  • Saugumo ir apsaugos atributai: vartotojo ir grupės ID, prieigos teisės, procesų grupės/kontekstai (pvz., namespaces Linux).
  • Atskiri architektūriniai elementai: kai kurios architektūros turi specialius valdymo blokus (pvz., x86 Task State Segment), banked registrus ar kitą aparatinę paramą konteksto saugojimui.

Konteksto perjungimo eiga (bendrieji žingsniai)

  • Išsaugomas esamo proceso kontekstas: CPU registrai įrašomi į procesų valdymo struktūrą (PCB — process control block) arba į ekvivalentą.
  • Atnaujinama planavimo būsenos informacija: pažymima, kad procesas tapo pasirengęs arba laukia.
  • Parenkamas kitas vykdymui skirtas procesas pagal planavimo algoritmą.
  • Nustatoma naujo proceso adresų erdvė (pavyzdžiui, pakeičiami puslapių lentelės rodytojai) — dažnai reikalingas TLB (translation lookaside buffer) invalidas.
  • Užkraunamas naujo proceso registrų rinkinys, steko rodyklė ir programos skaitiklis.
  • Kontrolė grąžinama procesoriui — vykdomas naujas procesas nuo paskutinės saugotų instrukcijų vietos.

Pilnas vs dalinis (lengvas) konteksto perjungimas

Ne visuomet reikia išsaugoti visą kontekstą. Skirtingos situacijos leidžia naudoti skirtingo „dydžio“ perjungimus:

  • Pilnas perjungimas: naudojamas keičiant procesus, kurie neturi bendros atminties; reikia saugoti ir atkurti adresų erdvę, failų būseną ir pan.
  • Dalis perjungimas (thread switch arba darinių lengvas perjungimas): gijos (thread) perjungimo atveju, kai gijos priklauso tam pačiam procesui ir dalijasi adresų erdve, nebūtina keisti puslapių lentelių — pakanka registrų ir steko.
  • Pertraukimų aptarnavimas: dažnai sistema tik saugo kritinius registrus ir aptarnauja pertrauką; vėliau atstatoma tik tai, kas pakeista.

Kainos ir našumo aspektai

Konteksto perjungimas turi išlaidų — tai yra papildomas delsimas (latency) ir papildomas darbo kiekis procesoriui bei atminties posistemėms (TLB invalidas, keletas atminties operacijų). Tipiškai konteksto perjungimo kaštai matuojami mikrosekunėmis arba daugiau, priklausomai nuo procesoriaus architektūros ir ar vyksta adresų erdvės keitimas.

Svarbūs faktoriai, didinantys kaštus: TLB valymas, puslapių lentelių pakeitimai, cache efekto praradimas, ir papildomas branduolio darbo kiekis.

Kaip sumažinama konteksto perjungimo kaina

  • Minimalus būtinas saugomas rinkinys — saugoti tik tuos registrus ir būsenas, kurie tikrai reikalingi.
  • Naudoti gijas (threads) vietoje pilnų procesų, kai įmanoma, kad sumažintumėte adresų erdvės perjungimus.
  • Lazy context switching — atidėlioti kai kurių išteklių (pvz., atminties puslapių) keitimą iki tol, kol jie iš tiesų reikalingi.
  • Aparatinės pagalbos naudojimas — pvz., x86 TSS arba specialūs registrai, skirti spartesniam perjungimui.
  • Optimizuoti planuotoją, kad būtų mažiau dažnų perjungimų tarp trumpų užduočių (kur perjungimo kaštai būtų procentaliai dideli).

Pastabos apie saugojimą ir kontrolinius taškus

Nors tradiciniu konteksto perjungimo atveju "užduoties kontekstas" nesusijęs su nuolatinio saugojimo objektais (failais), egzistuoja atvejai, kai pilnas užduoties arba sistemos būsena įrašoma išeities (checkpoint) tikslais — tokiu būdu procesą galima perkelti tarp sistemų arba atkurti po gedimo. Tokiu atveju papildoma saugoma informacija apima failų būsenas, atminties turinį, tinklo sesijų būsenas ir kitą pernešimui reikalingą meta-informaciją.

Architektūriniai pavyzdžiai ir skirtumai

Skirtingos procesorių architektūros ir OS sprendimai daro įtaką konteksto perjungimo detalių realizacijai. Pvz., x86 turi TSS mechanizmus, kai kurios ARM versijos turi banked registrus privilegijų režimams, o kai kurios mikroarchitektūros suteikia specialius palaikymus greitam kontekstų saugojimui/atkūrimui.

Apibendrinant: užduoties kontekstas — tai visa ta informacija, leidžianti nutraukti ir vėl atnaujinti vykdymą be būsenos praradimo. Konteksto perjungimas yra būtinas multitaskingo ir pertraukų valdymui, tačiau turi kaštų, kuriuos operacinės sistemos ir architektūros stengiasi sumažinti įvairiais optimizavimo būdais.