Az informatikában a feladatkontextus (folyamat, szál, task stb.) azon minimális adathalmaz, amelyet el kell menteni ahhoz, hogy egy adott időpontban a feladat megszakítása, illetve későbbi folytatása a megszakítás helyén pontosan és zavartalanul lehetséges legyen. A kontextus fogalma különösen a megszakítható, időosztásos rendszerekben válik fontossá: a processzor megszakításkor vagy a tervező (scheduler) döntésekor elmenti a kontextust, majd a kiválasztott megszakítási kiszolgáló vagy másik feladat futtatása után a kontextus visszaállításával folytatja a megszakított feladat végrehajtását. Minél kisebb és hatékonyabban kezelhető ez a kontextus, annál rövidebb a megszakítások és a kontextusváltások miatti késleltetés.

Mi tartozik tipikusan a feladatkontextushoz?

  • Processzorregiszterek: programmutató (IP/EIP/RIP), veremmutató (SP), bázis-/keretregiszterek (BP/EBP), általános célú regiszterek, státusz/flags regiszter. Ezek a végrehajtás pontos állapotát adják.
  • Lebegőpontos és vektortárolók: FPU, MMX, SSE/AVX regiszterek — sok operációs rendszer ezeket „lustán” (lazy save/restore) kezeli a hatékonyság érdekében, azaz csak akkor menti/állítja vissza, ha ténylegesen használták őket.
  • Vezérlőregiszterek és memóriakezelési állapot: például a lapozási táblára mutató regiszter (x86 CR3), szegmensregiszterek, amelyek a feladat címterét határozzák meg. Egyes architektúrákon a címteret váltó művelet jelentős költséggel jár (TLB flush, page table switch).
  • Kernel-es költségadatok: a folyamatfolyamat-vezérlő blokk (PCB vagy task control block — TCB) adatai: futtatási státusz, prioritás, CPU-eltelt idő, pointerek a kernel-stackre, ütemezőhöz szükséges metainformációk.
  • Periféria- és I/O-állapot: ha a feladat adott hardveres művelet közepén volt, fennállhat, hogy a hardverre vonatkozó állapotot is kezelni kell (pl. DMA állapotok, eszközre vonatkozó vezérlőregiszterek), de ez gyakran az eszközkezelő feladata.
  • A feladat által használt memória és címterek: maguk a memóriablokkok (értékük a fizikai/virtuális memóriában) általában nem másolódnak át a kontextusváltáskor; a címteret (lapozási táblát) vagy hivatkozást azonban váltani kell, ha a következő feladat más címtartományt használ.
  • Egyes operációs rendszerek speciális vezérlőregiszterei: olyan rendszer-specifikus erőforrások, amelyeket a kernel használ a feladat kezelésére (pl. thread-local storage pointerek, signal/interrupt maskok).

Mikor és miért történik kontextusváltás?

  • Az ütemező (scheduler) döntése miatt — pl. időkvóta lejár, magasabb prioritású feladat érkezik.
  • Megszakítások és kivételek kezelése közben (interrupt/exception/trap): a megszakítási rutin elmenti/állítja az érintett kontextust, majd más kód fut.
  • Rendszerhívás vagy várakozás I/O-ra: a feladat blokkolódik, a CPU-t másik feladat kapja meg.
  • Explicit műveletként: a folyamat hívhat yield-et, vagy felhasználói szálaknál a felhasználói könyvtár végzi az átadást.

Mekkora a kontextusváltás költsége és hogyan csökkenthető?

A kontextusváltás költségét több tényező befolyásolja: a mentendő/állítandó regiszterek száma, a címterek váltásának költsége (TLB, lapozási struktúrák), a gyorsítótár (cache) hatékonyságának romlása és az esetleges kernel–felhasználói mód váltások. Tipikus optimalizációs módszerek:

  • Csak a ténylegesen szükséges regiszterek mentése (például lazy FPU save/restore).
  • Felhasználói szálak kezelésének delegálása user-space könyvtáraknak (user-level threading) — ez gyorsabb szervezést tesz lehetővé, de nem használja a többmagos CPU-k előnyeit, ha a könyvtár nem támogatja a kernel szintű párhuzamosságot.
  • Lightweight (vékony) szálmodellek és co-rutinok használata, ahol a váltás költsége alacsonyabb, mert kevesebb állapotot kell menteni.
  • Címterek megosztása (például több szál ugyanabban a folyamatban) — ekkor nem szükséges teljes lapozási tábla váltás.

Hardver- és operációs rendszer támogatás — példák

  • x86 architektúrában létezik Task State Segment (TSS) és speciális task-switch mechanizmus, de a modern operációs rendszerek gyakran szoftverből végzik a mentést-visszaállítást, mert a hardveres task-switch kevésbé rugalmas.
  • Linux/UNIX rendszerek: a kernel elmenti a processzorregisztereket és a kernel-stack pointert, valamint a folyamathoz tartozó struktúrákat (task_struct), amelyek tartalmazzák a nyitott fájl-leírókat, jelzőket, memóriatérre (mm_struct) vonatkozó információkat stb. Szálak (pthread) ugyanazt a címteret oszthatják meg — ez csökkenti a címterek közti váltás költségét.

Megjegyzés a fájlokra és perzisztens tárolóra

A perzisztens tároló (fájlok, lemezek) tartalma általában nem része a futási kontextusnak: a kontextusváltás nem módosítja magukat a fájlokat. Ugyanakkor fontos megkülönböztetni a fájlok tartalmát és a folyamathoz kapcsolódó állapotot: a nyitott fájl-leírók (file descriptorok), fájlmutatók/offsetek és hozzájuk kapcsolódó kernel-adatok a folyamat állapotának részét képezik, és szükség szerint a kernel struktúráiban megőrződnek.

Összefoglalás

A feladatkontextus a futó feladat pontos végrehajtási állapotát reprezentáló adathalmaz — regiszterek, veremmutatók, memóriacímekre mutató adatok, kernel-specifikus vezérlőinformációk stb. A kontextusváltás célja a CPU idő megosztása és a megszakítások, I/O várakozások kezelése; költségét a mentendő állapot mérete, címterek váltása és a gyorsítótár/TLB hatások határozzák meg. Modern rendszerek különböző szoftveres és hardveres technikákkal minimalizálják ezt a költséget, például lazy mentéssel, címterek megosztásával és könnyített szálmodellekkel.